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

Unity添加Stamina系统后角色控制与 stamina消耗异常问题求助

Unity新输入系统+Stamina系统问题修复

问题列表

  • 角色冲刺时无法跳跃
  • 跳跃时按下冲刺键,角色悬浮不下落
  • 冲刺时Stamina未按预期消耗10点

问题原因及修复方案

1. Stamina不消耗(根源问题,引发其他两个bug)

原因:StaminaBar脚本中的playerController变量未初始化,调用UseStamina时无法修改PlayerController的currentStamina,还会触发NullReferenceException,导致后续代码中断执行。

修复:
在StaminaBar的Start方法中初始化playerController:

private void Start()
{
    // 获取场景中的PlayerController组件
    playerController = FindObjectOfType<PlayerController>();
}

或者在PlayerController的Start方法中直接赋值:

private void Start()
{  
    currentHealth = maxHealth;
    healthBar.SetMaxHealth(maxHealth);
    currentStamina = maxStamina;
    staminaBar.SetMaxStamina(maxStamina);
    
    controller = GetComponent<CharacterController>();
    inputManager = InputManager.Instance;
    cameraTransform = Camera.main.transform;
    
    // 给StaminaBar的playerController赋值
    staminaBar.playerController = this;
}

同时,PlayerController中当前每帧调用UseStamina会导致Stamina消耗过快(每帧10点),改为每秒消耗10点:
在PlayerController中添加计时器变量:

private float staminaDrainTimer;
public float staminaDrainInterval = 1f; // 每1秒消耗一次

修改Update中的冲刺逻辑:

if(inputManager.isRunning && currentStamina > 0)
{
    controller.Move(move * playerRunSpeed * Time.deltaTime);
    
    // 计时器控制消耗频率
    staminaDrainTimer += Time.deltaTime;
    if(staminaDrainTimer >= staminaDrainInterval)
    {
        staminaBar.UseStamina(staminaDrain);
        staminaDrainTimer = 0f;
    }
}
else
{
    controller.Move(move * Time.deltaTime * playerSpeed);
}

2. 冲刺时无法跳跃

原因:StaminaBar的空指针异常导致Update方法中断,跳跃逻辑未执行。修复Stamina的空指针问题后,此问题自动解决。

额外优化:检查playerRunSpeed的值,当前设置为1f比playerSpeed的2f小,不符合冲刺的预期,建议改为更大的值(比如5f)。

3. 跳跃时按冲刺键悬浮

原因:同样是空指针异常导致重力更新代码playerVelocity.y += gravityValue * Time.deltaTime;未执行,角色下落逻辑中断。修复Stamina的空指针问题后,重力会正常计算,角色不再悬浮。


额外代码优化建议

  • InputManager中的staminaBar和playerController变量也未初始化,若后续需要在InputManager中处理Stamina逻辑,建议在Awake或Start中初始化:
private void Awake()
{  
    // ... 现有单例代码
    playerController = FindObjectOfType<PlayerController>();
    staminaBar = FindObjectOfType<StaminaBar>();
}
  • 移除PlayerController中手动设置滑块值的代码staminaBar.staminaSlider.value = currentStamina;,因为StaminaBar的UseStamina和RegenStamina方法已经处理了滑块更新。

内容的提问来源于stack exchange,提问作者raphael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:10:34