unity3d 对象不会停止移动,使用新输入系统

pw9qyyiw  于 2023-04-21  发布在  其他
关注(0)|答案(4)|浏览(195)

我已经看过了文档和任何与新输入系统相关的东西。我知道它是相当新的,在1.0.0上有很多变化。
我刚刚开始在统一后,长时间的休息,并开始我一直试图移动一个 * 播放器 * 左右。我得到了它的工作,但它不停止后,释放键盘键。
一开始我没有改变默认的InputActions设置。

我确实试过将交互更改为 Press〉Press & Release,我让它工作了,但如果我按下正确的键,例如,并在改变键(方向)时保持按下它,它会继续向正确的方向移动。我退出了这个,因为它说只需使用“按钮”操作类型,但它改变了WASD的整个设置。

这是我的播放器脚本。它可能与输入系统无关,但与我的代码有关:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerBehaviour : MonoBehaviour 
{
    private InputActions _controls;
    private Vector2 movementInput;
    public float _speed = 12f;

    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
    }

    private void OnEnable()
    {
        _controls = new InputActions();
        _controls.Player.Move.performed += ctx => movementInput = ctx.ReadValue<Vector2>();
        _controls.Player.Move.Enable();
    }

    void Update()
    {
        Debug.Log("transform.position: " + transform.position);
        transform.position += new Vector3(movementInput.x * _speed * Time.deltaTime,
                                        0,
                                        movementInput.y * _speed * Time.deltaTime);
    }

    private void OnDisable()
    {
        _controls.Player.Move.Disable();
    }
}

**更新:我一直在做这个,并添加了更多,但无法通过我的原始问题。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerMovement : MonoBehaviour
{
    private InputActions _controls;

    private Vector2 movementInput;
    public float _speed = 12f;

    public CharacterController controller;
    public Camera playerCamera;
    private Vector2 lookPosition;
    private float mouseSensitivity = 50f;
    float xRotation = 0f;

    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
    }

    private void OnEnable()
    {
        _controls = new InputActions();
        _controls.Player.Move.performed += ctx => movementInput = ctx.ReadValue<Vector2>();
        _controls.Player.Move.Enable();
        _controls.Player.Look.performed += ctx => lookPosition = ctx.ReadValue<Vector2>();
        _controls.Player.Look.Enable();
    }

    void Update()
    {
        float x = movementInput.x;
        float z = movementInput.y;
        Vector3 move = transform.right * x + transform.forward * z;
        controller.Move(move * _speed * Time.deltaTime);

        float lookX = lookPosition.x * mouseSensitivity * Time.deltaTime;
        float lookY = lookPosition.y * mouseSensitivity * Time.deltaTime;

        xRotation -= lookPosition.y;
        xRotation = Mathf.Clamp(xRotation, -90f, 90f);
        playerCamera.transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);
        transform.Rotate(Vector3.up * lookX);
    }

    private void OnDisable()
    {
        _controls.Player.Move.Disable();
        _controls.Player.Look.Disable();
    }
}
bvn4nwqk

bvn4nwqk1#

我遇到了同样的问题。以前我使用PlayerInput和UnityEvents,WASD Move 工作得很好。后来我想改成C#事件,就像你的代码一样:只使用performeddelegate。
深入研究PlayerInput源代码,我注意到UnityEvents在所有三个started/performed/canceled委托中注册。
解决方案:

_controls.Player.Move.started += ctx => movementInput = ctx.ReadValue<Vector2>()
_controls.Player.Move.performed += ctx => movementInput = ctx.ReadValue<Vector2>()
_controls.Player.Move.canceled += ctx => movementInput = ctx.ReadValue<Vector2>()

也不需要添加 Press 操作,它可以在没有它的情况下工作。

snz8szmq

snz8szmq2#

所以,是的,正如我提到的,我得到了它的工作添加 * 新闻 * 互动。

  • 在交互中移动 * Action -〉WASD Binding -〉“+”和 Press。然后将触发器行为设置为 Press And Release

我开车离开了这个,因为如果我按下我的方式通过多个WASD键,它保持在第一个键按下的方向移动。

lokaqttq

lokaqttq3#

有一个简单的解决方法。只需删除按下和释放,将动作类型设置为值,控制类型设置为任何。如果需要(我非常怀疑),在脚本中更改几行以支持值。

k5hmc34c

k5hmc34c4#

你需要取消,因为你的矢量正在设置,但没有重置!

相关问题