unity3d 如何在Unity InputSystem中持久化输入

34gzjxbg  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(176)

我想在玩家移动的时候执行一个滚动,让他们在按住移动键的情况下继续向那个方向移动。但是,由于Unity的InputSystem的Action函数是在InputValue改变的时候调用的,所以在滚动之前按住键会有一个问题,这会阻止Action函数被调用。

using UnityEngine;
using UnityEngine.InputSystem;

public class Will : MonoBehaviour
{
    public enum WillState
    {
        IDLE,
        RUN,
        ROLL
    }

    private Rigidbody2D _rigid;
    private Animator _anim;

    public WillState _currentState;
    public Vector2 _moveInput;
    public float Horizontal { get; private set; }
    public float Vertical { get; private set; }

    private float _moveSpeed = 1.0f;
    private float _rollDistance = 1.4f;

    public bool _canMove = true;

    private void Awake()
    {
        _rigid = GetComponent<Rigidbody2D>();
        _anim = GetComponent<Animator>();
    }

    private void Update()
    {
        switch (_currentState)
        {
            case WillState.IDLE:
                _anim.Play("Idle");
                break;
            case WillState.RUN:
                _anim.SetFloat("MoveX", _moveInput.x);
                _anim.SetFloat("MoveY", _moveInput.y);
                _anim.Play("Run");
                break;
            case WillState.ROLL:
                _anim.Play("Roll");
                break;
        }
    }

    private void FixedUpdate()
    {
        switch (_currentState)
        {
            case WillState.IDLE:
                break;
            case WillState.RUN:
                _rigid.MovePosition(_rigid.position + _moveInput * _moveSpeed * Time.fixedDeltaTime);
                break;
            case WillState.ROLL:
                _rigid.MovePosition(_rigid.position + _moveInput * _rollDistance * Time.fixedDeltaTime);
                break;
        }
    }

    void OnMove(InputValue value)
    {
        if (_canMove)
        {
            _moveInput = value.Get<Vector2>();
            if (_moveInput != Vector2.zero)
            {
                ChangeState(WillState.RUN);
            }
            else
            {
                ChangeState(WillState.IDLE);
            }
        }
    }

    void OnRoll()
    {
        _canMove = false;
        ChangeState(WillState.ROLL);
    }

    void RollFinished()
    {
        _canMove = true;
        ChangeState(WillState.IDLE);
    }

    void ChangeState(WillState newState)
    {
        _currentState = newState;
    }

}

RollFinished函数用于在滚动动画结束时调用事件函数。滚动后,播放器变为空闲状态,必须重新键入才能移动。我想在滚动后调用OnMove函数,即使我在滚动前仍在输入。
我已经看了很多关于Unity InputSystem的视频和手册,但我不能想出一个好的解决方案。

erhoui1w

erhoui1w1#

看起来它不是Unity输入系统,但你的代码逻辑是问题所在。你的代码在OnMove函数中忽略了滚动期间的输入。所以可能是这样的:

void OnMove(InputValue value)
    {
        _moveInput = value.Get<Vector2>();
        TryMove();
    }
    
    private void TryMove()
    {
        if (_canMove)
        {
            if (_moveInput != Vector2.zero)
            {
                ChangeState(WillState.RUN);
            }
            else
            {
                ChangeState(WillState.IDLE);
            }
        }
    }

    void RollFinished()
    {
        _canMove = true;
        TryMove();
    }

相关问题