You need to enable JavaScript to run this app. Unity安卓游戏开发:击毁流星时scoreText快速累加计分异常求助
优惠活动
大模型
产品
解决方案
定价
更多

Unity安卓游戏开发:击毁流星时scoreText快速累加计分异常求助

问题根源
  • 核心问题是你把计分累加逻辑放在了Update()生命周期方法中,Update()每秒会执行30~60次,只要Meteor.displayScore不为0,总分数就会每帧重复累加,自然会出现快速跳涨的情况。
  • 额外问题:Meteor的静态变量displayScore在流星击毁赋值后没有重置,会一直保留上次的计分数值,进一步导致重复累加。
  • 逻辑问题:计分的触发时机应该是流星被击毁的瞬间,而不是每帧轮询判断是否要加分。
修复代码

修改后的GameManager脚本

public class GameManager : MonoBehaviour
{
    // 单例实例,方便其他脚本调用
    public static GameManager Instance;
    // 总分数
    private static int _displayScores;
    public Text scoreText;
 
    void Awake()
    {
        // 初始化单例
        Instance = this;
    }

    void Start()
    {
        // 重置分数,避免重开游戏保留上局分数
        _displayScores = 0;
        UpdateScoreUI();
    }

    // 对外公开的加分方法,流星击毁时调用
    public void AddScore(int addNum)
    {
        _displayScores += addNum;
        UpdateScoreUI();
    }

    // 仅在分数变动时更新UI,节省性能
    private void UpdateScoreUI()
    {
        scoreText.text = _displayScores.ToString();
    }
}

修改后的Meteor脚本

只需要修改流星击毁时的计分逻辑即可,其余逻辑可以保留:

public class Meteor : MonoBehaviour
{
    public int maxHealth; 
    public int currentHealth;
    public float speed;
    public int hits = 0;
    // 单颗流星的基础分数
    public int score = 100;
    public static int counter;
 
    public Health healthBar;
    public GameObject canvas;
    public Transform effect;
 
    void Start()
    {
        currentHealth = maxHealth;
        healthBar.setMaxHealth(maxHealth);
    }
 
    void Update()
    {
        transform.Translate(Vector2.down * speed * Time.deltaTime);
    }

    public void OnTriggerEnter2D(Collider2D other)
    {
        if(other.transform.tag == "bullet")
        {
            hits++;
            canvas.SetActive(true);
            currentHealth--;
            healthBar.setHealth(currentHealth);
            if(currentHealth <= 0)
            {
                // 击毁时直接调用GameManager的加分方法
                GameManager.Instance.AddScore(score * hits);
                Instantiate(effect, other.transform.position, other.transform.rotation);
                Destroy(this.gameObject);
                counter++;
                canvas.SetActive(false);
            }
            Destroy(other.gameObject);
        }
        if(other.transform.tag == "bottom")
        {
            Destroy(this.gameObject);
        }
    }
}
补充说明
  • 采用单例+主动调用的方式,既避免了每帧执行不必要的逻辑,也不会出现重复累加的问题。
  • 静态变量不会随场景加载自动重置,所以在GameManager的Start()方法中主动重置总分数,避免重开游戏时分数异常。
  • 删掉了原有冗余的displayScore、display、currentHealthChecker等无用变量,简化逻辑。

内容的提问来源于stack exchange,提问作者Neowb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 10:30:01