unity3d 读取Unity输入系统中的“零输入”

z0qdvdin  于 2023-01-17  发布在  其他
关注(0)|答案(2)|浏览(203)

我正在为一个2D游戏创建一个非常简单的玩家水平移动脚本(代码如下)。我想使用较新的输入系统,而不是默认的输入管理器。
Unity's guide之后,我可以设置控件,使其像示例中那样工作。但是,教程正在更新玩家控制的对象的 position,而我想更新它的 velocity。将输入中读取的值清零,如示例所示(步骤4.25)用于更新位置,而不是速度,因为速度升高并立即回到零。但是,如果速度没有被归零,即使在玩家释放移动键之后,物体的速度也保持不变(我还没有用模拟输入测试过)。
基本上,当复合输入没有按键时(或者操纵杆处于中立位置),它不会将其报告为Vector2.zero。输入事件似乎只在按键被按下时发生,而不是在按键被释放时发生......至少我能收集到的是这样。
所以我想知道一种基于输入系统来设置速度目标的方法,当键被释放时,速度目标会归零。类似于输入管理器中的OnButtonUp()
我的代码:

using UnityEngine;
 using UnityEngine.InputSystem;

 public class PlayerHorizontalMovement : MonoBehaviour
 {
     [Tooltip("[units/s]")]
     [SerializeField] private float horizontalSpeed = 3f;

     [Tooltip("[units/s^2]")]
     [SerializeField] private float horizontalAccel = 60f;

     private PlayerControls controls;

     private Rigidbody2D myRigidbody;

     private float velocityGoal;

     private void Awake()
     {
         controls = new PlayerControls();
         controls.Player.Move.performed += context => velocityGoal = context.ReadValue<Vector2>().x;
     }

     private void Start()
     {
         myRigidbody = GetComponent<Rigidbody2D>();
         velocityGoal = 0f;
     }

     private void FixedUpdate()
     {
         Vector3 newVelocity = myRigidbody.velocity;

         // X axis velocity update
         newVelocity.x = Mathf.MoveTowards(newVelocity.x, velocityGoal, horizontalAccel * Time.fixedDeltaTime);
         myRigidbody.velocity = newVelocity;
     }

     private void OnEnable() => controls.Player.Enable();

     private void OnDisable() => controls.Player.Disable();
 }
yvfmudvl

yvfmudvl1#

您有几个选项,但根据您所获得的内容和您所遵循的教程,我认为最简单的方法是添加cancelled操作状态,如下所示:

private void Awake()
{
    controls = new PlayerControls();
    controls.Player.Move.performed += context => velocityGoal = context.ReadValue<Vector2>().x;
    controls.Player.Move.canceled += context => velocityGoal = 0;
}

根据Unity文档对Actions的描述,您可能会对以下阶段感兴趣:
| 阶段|说明|
| - ------|- ------|
| 残疾人|操作已禁用,无法接收输入。|
| 等待|操作已启用并正在主动等待输入。|
| 开始日期|输入系统已接收到启动与操作交互的输入。|
| 执行|与操作的交互已完成。|
| 取消|已取消与操作的交互。|

nqwrtyyt

nqwrtyyt2#

这个应该适用于旧的/默认的输入系统,但我对新的输入系统一无所知:

if (!Input.anyKey)
{
    Debug.Log("No button is being pressed");
}

相关问题