Unity项目Stamina Bar填充异常问题求助
Stamina Bar填充异常修复问题
我从Unity Asset Store下载了包含UI与移动机制的资源并做了少量修改,目前遇到Stamina Bar异常问题:当Sprint耗尽后,Stamina Bar会清空,等待5秒冷却后开始填充,但却从中途位置启动填充,需要它从0开始填充。以下是相关核心代码:
#region Sprint if (enableSprint) { if (isSprinting) { isZoomed = false; playerCamera.fieldOfView = Mathf.Lerp(playerCamera.fieldOfView, sprintFOV, sprintFOVStepTime * Time.deltaTime); // Drain sprint remaining while sprinting if (!unlimitedSprint) { sprintRemaining -= Time.deltaTime; if (sprintRemaining <= 0) { StartCoroutine(ZeroScaleCoroutine()); isSprinting = false; isSprintCooldown = true; sprintBarBG.gameObject.SetActive(true); } } } else { // Regain sprint while not sprinting sprintRemaining = Mathf.Clamp(sprintRemaining + Time.deltaTime, 0, sprintDuration); } // Handles sprint cooldown // When sprint remaining == 0 stops sprint ability until hitting cooldown if (isSprintCooldown) { sprintCooldown -= Time.deltaTime; if (sprintCooldown <= 0) { isSprintCooldown = false; } } else { sprintCooldown = sprintCooldownReset; } // Handles sprintBar if (useSprintBar && !unlimitedSprint) { sprintRemainingPercent = Mathf.Clamp01(sprintRemaining / sprintDuration); if (!isSprintCooldown) { if (sprintRemainingPercent <= 0.005f) { Debug.Log("Starting ZeroScaleCoroutine. sprintRemainingPercent: " + sprintRemainingPercent); StartCoroutine(ZeroScaleCoroutine()); } else { sprintBar.transform.localScale = new Vector3(sprintRemainingPercent, 1f, 1f); } } } } IEnumerator ZeroScaleCoroutine() { cooldown = true; sprintBar.transform.localScale = new Vector3(0f, 1f, 1f); isSprinting = true; isSprintCooldown = true; sprintCooldown = sprintCooldownReset; sprintRemainingPercent = 0f; sprintRemaining = 0; yield return new WaitForSeconds(5f); // Adjust the time accordingly sprintBar.transform.localScale = new Vector3(0f, 1f, 1f); isSprinting = false; isSprintCooldown = false; cooldown = false; } #endregion
问题根源
- 冷却期间
sprintRemaining未被锁定,主逻辑中「非Sprint时恢复 stamina」的分支仍在累加数值,导致冷却结束时sprintRemaining已有一定值,填充从中途开始。 ZeroScaleCoroutine与主逻辑的状态管理存在冲突,比如Coroutine中错误设置isSprinting = true,且未阻止冷却期间的 stamina恢复。
修复方法
1. 禁止冷却期间恢复Stamina
修改主逻辑中「非Sprint」分支的代码,增加冷却状态判断:
else { // 仅当不在冷却状态时,才恢复stamina if (!isSprintCooldown) { sprintRemaining = Mathf.Clamp(sprintRemaining + Time.deltaTime, 0, sprintDuration); } }
2. 修正Coroutine中的错误状态设置
精简ZeroScaleCoroutine,修正错误的状态赋值,并确保冷却结束时sprintRemaining保持为0:
IEnumerator ZeroScaleCoroutine() { cooldown = true; sprintBar.transform.localScale = new Vector3(0f, 1f, 1f); isSprinting = false; // Sprint耗尽后应停止Sprint,原代码设为true错误 isSprintCooldown = true; sprintCooldown = sprintCooldownReset; sprintRemainingPercent = 0f; sprintRemaining = 0; yield return new WaitForSeconds(5f); // 冷却时长 // 冷却结束后强制保持stamina为0,确保填充从0开始 sprintRemaining = 0; sprintRemainingPercent = 0f; sprintBar.transform.localScale = new Vector3(0f, 1f, 1f); isSprintCooldown = false; cooldown = false; }
3. 避免重复启动Coroutine
修改主逻辑中启动Coroutine的判断条件,防止冷却期间重复触发:
if (sprintRemainingPercent <= 0.005f && !isSprintCooldown) { Debug.Log("Starting ZeroScaleCoroutine. sprintRemainingPercent: " + sprintRemainingPercent); StartCoroutine(ZeroScaleCoroutine()); }
内容的提问来源于stack exchange,提问作者ItzyB
相关产品推荐
相关产品推荐

