Unity关卡切换时分数被覆盖而非累加的问题求助
问题修复:分数累加功能实现
问题场景
玩家进入关卡收集燃油罐,交付燃油至大油箱后加载下一关,当前收集的燃油需清零;但第二关交付燃油时,总分数被覆盖而非累加,需实现分数持续累加的功能。
原代码问题分析
- 总分采用直接赋值(
score = collectedfuel)而非累加逻辑,导致每次交付都会覆盖之前的累计分数 - 关卡切换后未重置
fuelDelivered状态,可能引发异常跳转 - 新关卡加载后未重新获取
GasTransfer和LevelLoader组件引用 - 交付完成后未清零当前收集的
collectedfuel,影响下一关的收集计数逻辑
修改后的完整代码
using UnityEngine; using UnityEngine.UI; public class ScoreManager : MonoBehaviour { public static ScoreManager instance; // 脚本引用 GasTransfer gt; LevelLoader levelLoader; // UI文本引用 public Text ScoreText; public Text StoredFuel; // 数据变量 public int collectedfuel = 0; private int totalScore; // 存储累计总分,变量名更清晰 public int storedFuel; public bool fuelDelivered; private void Awake() { if (instance == null) { instance = this; DontDestroyOnLoad(gameObject); } else if (instance != null) Destroy(gameObject); } private void Start() { // 初始化组件引用与状态 RefreshComponentReferences(); fuelDelivered = false; UpdateScoreUI(); } // 统一获取组件引用的方法 private void RefreshComponentReferences() { gt = FindObjectOfType<GasTransfer>(); levelLoader = FindObjectOfType<LevelLoader>(); } // 关卡加载完成后重置状态与引用 private void OnLevelWasLoaded(int level) { RefreshComponentReferences(); fuelDelivered = false; collectedfuel = 0; // 新关卡开始时清零当前收集的燃油 UpdateScoreUI(); } private void Update() { // 更新当前收集燃油的UI显示 ScoreText.text = collectedfuel.ToString(); if (Input.GetKey(KeyCode.F) && gt.isAtpump && !fuelDelivered) { // 累加当前收集的燃油到总分 totalScore += collectedfuel; storedFuel = collectedfuel; // 更新累计分数UI StoredFuel.text = totalScore.ToString(); fuelDelivered = true; // 清零当前收集的燃油,为下一关做准备 collectedfuel = 0; } if (fuelDelivered) { gt.pressF.SetActive(false); levelLoader.LoadNextLevel(); } } public void AddFuel() { collectedfuel += 5; } public void RemoveFuel() { collectedfuel -= 5; if(collectedfuel < 0) collectedfuel = 0; } // 统一更新UI的方法,避免重复代码 private void UpdateScoreUI() { ScoreText.text = collectedfuel.ToString(); StoredFuel.text = totalScore.ToString(); } }
关键修改说明
- 将原
score变量重命名为totalScore,明确其存储累计总分的作用 - 交付燃油时使用
totalScore += collectedfuel实现分数累加,替代原有的直接赋值逻辑 - 添加
OnLevelWasLoaded方法,在关卡加载完成后自动重置collectedfuel和fuelDelivered状态,同时重新获取组件引用 - 新增
RefreshComponentReferences方法统一管理组件引用的获取,减少重复代码 - 在交付判断条件中加入
!fuelDelivered,防止重复触发交付逻辑 - 新增
UpdateScoreUI方法统一处理UI更新,确保显示状态正确
内容的提问来源于stack exchange,提问作者Craig Goodson
相关产品推荐
相关产品推荐

