Unity3D新InputSystem行走时按奔跑键不触发奔跑状态问题如何解决
问题根因
你当前的逻辑只有在movementInput(A/D键)的状态变化时才会调用OnMove执行移动逻辑。按奔跑键Z的时候只会修改isRunning的布尔值,不会主动触发移动逻辑的重新计算,所以状态不会即时更新,只有再次触发A/D的输入事件才会读取新的isRunning值。
解决方案1:奔跑输入触发时主动调用移动逻辑(改动最小)
在奔跑输入的回调里,修改完isRunning之后,主动读取当前的移动输入值,执行一次移动逻辑:
private InputAction movementInput, runInput; private bool isRunning; private void Awake() { movementInput.performed += context => OnMove(context.ReadValue<float>()); movementInput.canceled += context => OnMove(0); runInput.performed += context => { isRunning = true; // 读取当前移动输入值,主动更新移动状态 OnMove(movementInput.ReadValue<float>()); }; runInput.canceled += context => { isRunning = false; OnMove(movementInput.ReadValue<float>()); }; } private void OnMove(float moveDir) { if(!isRunning) { movementComponent.move(mySpriteRenderer, moveDir); Debug.Log("NotRunning"); } else { movementComponent.run(mySpriteRenderer, moveDir); Debug.Log("Running"); } }
解决方案2:把移动逻辑放到Update中执行(更推荐,扩展性更强)
输入事件只负责更新状态值,实际的移动逻辑每帧根据最新的状态计算,后续如果新增其他影响移动的状态(比如硬直、跳跃、减速buff)都不用再改输入回调:
private InputAction movementInput, runInput; private bool isRunning; private float currentMoveDir; // 缓存当前移动方向 private void Awake() { // 移动输入只负责更新缓存的方向值 movementInput.performed += context => currentMoveDir = context.ReadValue<float>(); movementInput.canceled += context => currentMoveDir = 0; // 奔跑输入只负责更新奔跑状态 runInput.performed += context => isRunning = true; runInput.canceled += context => isRunning = false; } private void Update() { // 每帧用最新的状态执行移动逻辑 if(!isRunning) { movementComponent.move(mySpriteRenderer, currentMoveDir); } else { movementComponent.run(mySpriteRenderer, currentMoveDir); } }
内容的提问来源于stack exchange,提问作者Vasil3
相关产品推荐
相关产品推荐

