Unity赛车游戏中漂移分数(Drift Score)计算与重置异常问题:主分数随漂移再次触发时被重置的修复方法
修复漂移分数累加时mainScore被重置的问题
看起来你已经把基础框架搭起来了,但核心逻辑里有几个小问题导致了mainScore被意外重置。让我帮你拆解一下问题,然后一步步修复:
问题根源分析
- 错误的赋值逻辑:在
CarDrift方法里,你每帧都执行mainScore = driftScore;——这是把mainScore直接替换成当前的updatingScore,而不是累加。而且当再次触发漂移时,updatingScore一开始是0,所以mainScore直接被设为0了。 - 过早的分数重置:你在漂移开始时就启动了
ScoreReset协程,不管漂移是否还在持续,2秒后就会重置分数。这不仅会打断漂移过程中的分数累加,还可能导致后续逻辑混乱。 - 漂移结束的判断冗余:
else if(carController.instance.driftingNow == false)里的instance是多余的,直接用carController.driftingNow就可以了,而且应该改成普通的else(因为前面已经判断了carController不为null,且漂移状态只有true/false两种)。
修复后的完整代码
我调整了逻辑,让分数只在漂移结束时才累加到mainScore,并且重置updatingScore:
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using DG.Tweening; public class ScoreManager : MonoBehaviour { public int mainScore; public int updatingScore; private int driftScore; public Text updatingScoreText; public Text mainScoreText; private GameManager gameManager; private RCC_CarControllerV3 carController; // 新增变量跟踪上一帧的漂移状态,避免重复触发逻辑 private bool wasDrifting = false; private void Awake() { gameManager = GetComponent<GameManager>(); updatingScoreText.DOFade(0, 0); } private void Start() { mainScore = 0; driftScore = 0; updatingScore = 0; // 初始化分数显示 UpdateScore(); } private void Update() { if(carController == null) carController = FindObjectOfType<RCC_CarControllerV3>(); if (carController != null) { CheckDriftState(); } UpdateScore(); } void UpdateScore() { mainScoreText.text = mainScore.ToString(); updatingScoreText.text = updatingScore.ToString(); } void ResetScore() { updatingScore = 0; driftScore = 0; updatingScoreText.text = updatingScore.ToString(); } void CheckDriftState() { bool isDriftingNow = carController.driftingNow; // 漂移开始时:显示分数文本 if (isDriftingNow && !wasDrifting) { updatingScoreText.DOFade(1, 2f); wasDrifting = true; } // 漂移进行中:持续累加分数 else if (isDriftingNow && wasDrifting) { updatingScore++; driftScore = updatingScore; } // 漂移结束时:累加分数到mainScore,重置updatingScore并隐藏文本 else if (!isDriftingNow && wasDrifting) { updatingScoreText.DOFade(0, 2f); // 核心修正:累加而非赋值 mainScore += driftScore; ResetScore(); wasDrifting = false; } } }
关键修改点说明
- 新增
wasDrifting变量:用来精准捕捉漂移的开始和结束时刻,避免每帧重复执行相同逻辑。 - 拆分漂移状态逻辑:把漂移分为「开始」「进行中」「结束」三个阶段,分别处理:
- 开始时只做显示初始化
- 进行中只累加分数
- 结束时才将漂移分数累加到mainScore,然后重置updatingScore
- 移除错误的赋值和协程:删掉了
mainScore = driftScore;和StartCoroutine(ScoreReset());,改用漂移结束事件触发分数累加和重置,逻辑更清晰可靠。 - 优化代码结构:把分数更新和漂移状态检查的逻辑拆分,代码可读性更强。
这样修改后,你就能实现需求:漂移时updatingScore持续增加,漂移结束时将updatingScore加到mainScore,然后重置updatingScore为0,而且再次漂移时mainScore不会被重置了。
内容的提问来源于stack exchange,提问作者Hamza Saleem
相关产品推荐
相关产品推荐

