Unity - 新输入系统的问题

问题描述 投票:0回答:1

代码:

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 使用映射来使其工作。

c# unity-game-engine input
1个回答
0
投票

为了执行回调函数,您需要订阅事件。

在不迷失于架构的情况下展示这一点的最简单方法是暴露一个

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用于重置存储的输入值。

© www.soinside.com 2019 - 2024. All rights reserved.