代码:
using UnityEngine;
using UnityEngine.InputSystem;
public class Mover : MonoBehaviour
{
[SerializeField] private float moveSpeed = 5f;
private Vector2 moveInput;
public void OnMove(InputAction.CallbackContext context)
{
moveInput = context.ReadValue<Vector2>();
Debug.Log($"Move Input (performed): {moveInput}");
}
private void FixedUpdate()
{
MovePlayer();
Debug.Log($"Move Input in Update: {moveInput}");
}
void MovePlayer()
{
Vector3 move = new Vector3(moveInput.x, 0, moveInput.y) * moveSpeed * Time.deltaTime;
transform.Translate(move, Space.World);
}
}
我试图学习如何统一使用新的输入系统 - 但没有成功。 我正在使用教程,在切换到新的输入系统之前,一切正常。 现在 - 带有“移动输入”的日志是正确的(按下或释放按钮时从 0 更改为 1,从 1 更改为 0)。
但我无法让我的玩家移动,因为在固定更新中这两个值始终为 0。 我做错了什么?
我检查了其他主题,但这些解决方案对我不起作用,因为它们使用刚体。我不想在这种情况下使用它。
#编辑
我通过这样做实现了类似的东西:
using UnityEngine;
using UnityEngine.InputSystem;
public class Mover : MonoBehaviour
{
[SerializeField] float moveSpeed = 6f;
private Vector2 moveInput;
private InputAction moveAction;
void Awake()
{
moveAction = GetComponent<PlayerInput>().actions["Move"];
}
void Update()
{
moveInput = moveAction.ReadValue<Vector2>();
MovePlayer();
Debug.Log($"Move Input in Update: {moveInput}");
}
void MovePlayer()
{
Vector3 move = new Vector3(moveInput.x, 0, moveInput.y) * moveSpeed * Time.deltaTime;
transform.Translate(move);
}
}
我更喜欢这样做,但为了获得知识,我想知道如何通过 OnMove 使用映射来使其工作。
为了执行回调函数,您需要订阅事件。
在不迷失于架构的情况下展示这一点的最简单方法是暴露一个
InputAction
。PlayerInput
的实例,请使用它来代替此公开的引用。
在
OnEnable
中,订阅 performed
和 canceled
事件。OnDisable
中,取消订阅这些活动。
[SerializeField] private InputAction moveAction;
private Vector2 moveInput;
private void OnEnable()
{
moveAction.performed += OnMoveActionPerformed;
moveAction.canceled += OnMoveActionCanceled;
moveAction.Enable();
}
private void OnDisable()
{
moveAction.performed -= OnMoveActionPerformed;
moveAction.canceled -= OnMoveActionCanceled;
moveAction.Disable();
}
private void OnMoveActionPerformed(InputAction.CallbackContext context)
{
moveInput = context.ReadValue<Vector2>();
}
private void OnMoveActionCanceled(InputAction.CallbackContext context)
{
moveInput = Vector2.zero;
}
这里Performed用于存储输入值,cancel用于重置存储的输入值。