【问题标题】:Unity3D new input system run while walk is still being performedUnity3D 新输入系统在行走时运行
【发布时间】:2021-09-25 09:21:46
【问题描述】:

我正在开发一款 2D 游戏,并且正在使用新的 Unity3D 输入系统。

我的步行工作正常。

基本上,我得到随 A 和 D 变化的输入浮点数,以朝着应有的方向前进。 然后我将带有命令的浮点数发送到移动脚本以移动。

我遇到的问题是,当我还按住运行按钮 (Z) 并且我仍在行走(按 A - D)时,我仍在以该速度行走并且在我释放之前不会改变速度步行按钮。

如果我在走路前按住运行按钮 (Z),那么它就会运行。 但我想边走边跑。

我当前的代码:

private InputAction movementInput, runInput;
private bool isRunning;

private void Awake()
{
    movementInput.performed += context => OnMove(context);
    movementInput.canceled += context => OnMove(context);

    runInput.performed += context => this.isRunning = true;
    runInput.canceled += context => this.isRunning = false;
}

private void OnMove(InputAction.CallbackContext context)
{
    if(!isRunning)
    {
        movementComponent.move(mySpriteRenderer, context.ReadValue<float>());
        Debug.Log("NotRunning");
    }
    else
    {
        movementComponent.run(mySpriteRenderer, context.ReadValue<float>());
        Debug.Log("Running");
    }

}

所以在走路时按住 Z 按钮跑步(按 A 或 D)后,我没有收到“正在运行”调试。 如果我停止并释放 A 和 D 按钮,按住 Z 按钮,然后按 A 或 D,然后我会收到“正在运行”调试,但如果我在仍然按住 A 或 D 的同时释放它,它仍在运行。

它似乎创建了移动调用开始时值的快照,然后忽略了在那段时间发生的所有变化。

【问题讨论】:

    标签: c# unity3d input controller 2d


    【解决方案1】:

    如果我是你,我会尝试不同的方式来移动角色: 向播放器添加一个 characterController 组件并给脚本一个引用。

    [SerializeField] private CharacterController chr;
    [SerializeField] private float speed;
    
    void Update(){
        float horizontal = Input.GetAxisRaw("Horizontal");
        Vector3 dir = new Vector2(horizontal, 0);
        chr.Move(dir * speed * Time.deltaTime);
    }
    

    【讨论】:

    • 那是使用将被弃用的旧输入系统。我知道该怎么做,但我想使用基于事件的新输入系统。
    猜你喜欢
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多