Unity添加下蹲逻辑后跑步状态moveSpeed变量无法正确赋值
问题根因
代码是按从上到下的顺序逐行执行的,你写的Running逻辑块对moveSpeed的赋值,会被后面执行的Crouching逻辑块强制覆盖:
当你按住LeftShift触发跑步逻辑时,moveSpeed会先被设为4,但只要你没有同时按住C键,Crouching逻辑的else分支就会立刻触发,把moveSpeed重新改回2,最终跑步的速度设置完全不生效。删除下蹲代码后没有了后续的覆盖逻辑,跑步功能自然恢复正常。
修复代码
调整状态判断的优先级(常规游戏逻辑下蹲优先级最高,下蹲状态下即使按跑步键也保持蹲移速度),去掉重复的默认值赋值,避免值被后执行的逻辑覆盖:
// 先默认设置普通走路状态与速度 moveSpeed = 2; animator.SetBool("isRunning", false); animator.SetBool("isCrouching", false); // 最高优先级:下蹲判断 if (Input.GetKey(KeyCode.C)) { animator.SetBool("isCrouching", true); moveSpeed = 1; } // 非下蹲状态才判断跑步逻辑 else if (Input.GetKey(KeyCode.LeftShift)) { animator.SetBool("isRunning", true); moveSpeed = 4; }
开发注意点
- 多状态互斥的逻辑要先明确优先级,按优先级从高到低写判断分支,高优先级状态触发时直接拦截低优先级的逻辑执行
- 不要在每个独立的if-else块里重复给同一个变量赋默认值,顺序执行时后面的赋值会直接覆盖前面的结果
- 动画参数的设置要和移动速度的逻辑保持同步,避免出现动画状态和实际移动速度不匹配的bug
内容的提问来源于stack exchange,提问作者Eichel
相关产品推荐
相关产品推荐

