You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题根源

  1. 冷却期间sprintRemaining未被锁定,主逻辑中「非Sprint时恢复 stamina」的分支仍在累加数值,导致冷却结束时sprintRemaining已有一定值,填充从中途开始。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:20:12