如何用Unity新输入系统实现蹲站按钮切换?解决输入过快问题
问题原因
你遇到的问题核心是输入检测逻辑错误:crouch.IsPressed()会在按住按键的每帧都返回true。当你按下蹲伏键时,第一帧会触发Crouch()把isCrouching设为true;紧接着同一帧或下一帧,第二个if的条件crouch.IsPressed() && isCrouching就会满足,立刻执行Stand()把isCrouching又设回false,导致角色看起来“刚蹲下就站起来”。
另外你的Stand()方法还存在一个小问题:没有把角色位置恢复到原来的高度,长期切换会让角色位置越来越低。
修复方案
以下是几种可行的解决方式,按推荐程度排序:
方案1:新输入系统绑定单次触发事件(推荐)
如果使用Unity新输入系统,不要在Update/FixedUpdate里轮询输入,直接给蹲伏按钮绑定performed事件(只在按键按下的瞬间触发一次):
private void Awake() { // 绑定蹲伏按键的单次触发事件 crouch.performed += ctx => ToggleCrouch(); } private void ToggleCrouch() { isCrouching = !isCrouching; if (isCrouching) { // 蹲下逻辑 transform.localScale = new Vector3(transform.localScale.x, 0.75f, transform.localScale.z); transform.position = new Vector3(transform.position.x, transform.position.y - 0.15f, transform.position.z); } else { // 站起逻辑(修正位置) transform.localScale = new Vector3(transform.localScale.x, 1f, transform.localScale.z); transform.position = new Vector3(transform.position.x, transform.position.y + 0.15f, transform.position.z); } }
方案2:旧输入系统用GetKeyDown检测单次按下
如果使用旧输入系统,把持续检测的IsPressed()换成只检测按键按下瞬间的GetKeyDown():
private void Update() { // 只在按键按下的那一帧触发 if (Input.GetKeyDown(KeyCode.LeftControl)) // 替换成你的蹲伏按键 { isCrouching = !isCrouching; if (isCrouching) { Crouch(); } else { Stand(); } } } // 修正Stand方法的位置恢复逻辑 private void Stand() { transform.localScale = new Vector3(transform.localScale.x, 1f, transform.localScale.z); transform.position = new Vector3(transform.position.x, transform.position.y + 0.15f, transform.position.z); isCrouching = false; }
方案3:用标志位防止重复触发(应急方案)
如果一定要保留IsPressed()的检测方式,可以加一个标志位,确保每次按键按下只触发一次切换:
private bool hasHandledCrouch = false; private void Update() { if (crouch.IsPressed()) { if (!hasHandledCrouch) { hasHandledCrouch = true; isCrouching = !isCrouching; if (isCrouching) Crouch(); else Stand(); } } else { // 松开按键后重置标志位,允许下次触发 hasHandledCrouch = false; } } // 记得修正Stand方法的位置逻辑 private void Stand() { transform.localScale = new Vector3(transform.localScale.x, 1f, transform.localScale.z); transform.position = new Vector3(transform.position.x, transform.position.y + 0.15f, transform.position.z); isCrouching = false; }
内容的提问来源于stack exchange,提问作者Swirlz
相关产品推荐
相关产品推荐

