Unity协程无法正常修改玩家移动速度问题求助
速度提升道具仅蹲伏速度生效的问题排查与解决
问题场景
我用挂载了SpeedBoost脚本的空游戏对象做速度提升道具,其下有预制体子对象。玩家触发道具时,OnTriggerEnter会启动协程,在3秒内提升玩家行走、奔跑、蹲伏速度并禁用道具;计时结束后恢复玩家默认速度,重新激活道具。但实际只有蹲伏速度得到提升,行走和奔跑速度无变化。已尝试调整代码顺序、删除蹲伏速度代码段,确认提升后数值均高于默认值,且无其他代码干扰,另一个无协程的减速道具可正常工作。
现有代码
private void OnTriggerEnter(Collider other) { if (other.tag == "Player") { StartCoroutine(RespawnSpeedBoost()); } } IEnumerator RespawnSpeedBoost() { // reference movement script to get the speed values movement.walkSpeed = boostedWalkSpeed; // 12f movement.sprintSpeed = boostedSprintSpeed; // 12f movement.crouchSpeed = boostedCrouchSpeed; // 8f speedBoost.SetActive(false); yield return new WaitForSeconds(3); speedBoost.SetActive(true); movement.walkSpeed = walkSpeed; // 4f movement.sprintSpeed = sprintSpeed; // 6f movement.crouchSpeed = crouchSpeed; // 2f }
排查方向与解决办法
检查移动脚本的实时覆盖逻辑:玩家移动脚本的
Update/FixedUpdate里如果有每一帧重置walkSpeed、sprintSpeed的代码(比如直接写死默认值),会覆盖协程的赋值。删掉这类实时重置的代码,只在初始化或特定状态切换时设置默认速度。验证赋值是否成功:在协程赋值后添加日志打印,确认数值是否正确设置到移动脚本中:
IEnumerator RespawnSpeedBoost() { movement.walkSpeed = boostedWalkSpeed; movement.sprintSpeed = boostedSprintSpeed; movement.crouchSpeed = boostedCrouchSpeed; Debug.Log($"赋值后行走速度:{movement.walkSpeed},奔跑速度:{movement.sprintSpeed},蹲伏速度:{movement.crouchSpeed}"); speedBoost.SetActive(false); yield return new WaitForSeconds(3); speedBoost.SetActive(true); movement.walkSpeed = walkSpeed; movement.sprintSpeed = sprintSpeed; movement.crouchSpeed = crouchSpeed; }如果日志显示数值正确但移动无变化,说明移动脚本里有其他逻辑覆盖了速度值。
确认移动脚本的变量访问权限:确保
walkSpeed、sprintSpeed是public变量,或者有公开的setter方法,避免外部无法正确赋值。检查状态切换的硬编码逻辑:玩家切换行走/奔跑状态时,是否直接硬写了速度值而不是使用
walkSpeed/sprintSpeed变量。比如把rb.velocity = transform.forward * 6f改成rb.velocity = transform.forward * sprintSpeed,确保使用变量而非固定数值。
内容的提问来源于stack exchange,提问作者RelevantUni98
相关产品推荐
相关产品推荐

