我想在玩家移动的时候执行一个滚动,让他们在按住移动键的情况下继续向那个方向移动。但是,由于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的视频和手册,但我不能想出一个好的解决方案。
1条答案
按热度按时间erhoui1w1#
看起来它不是Unity输入系统,但你的代码逻辑是问题所在。你的代码在OnMove函数中忽略了滚动期间的输入。所以可能是这样的: