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
相关产品推荐
相关产品推荐

