我正在为一个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();
}
2条答案
按热度按时间yvfmudvl1#
您有几个选项,但根据您所获得的内容和您所遵循的教程,我认为最简单的方法是添加
cancelled
操作状态,如下所示:根据Unity文档对Actions的描述,您可能会对以下阶段感兴趣:
| 阶段|说明|
| - ------|- ------|
| 残疾人|操作已禁用,无法接收输入。|
| 等待|操作已启用并正在主动等待输入。|
| 开始日期|输入系统已接收到启动与操作交互的输入。|
| 执行|与操作的交互已完成。|
| 取消|已取消与操作的交互。|
nqwrtyyt2#
这个应该适用于旧的/默认的输入系统,但我对新的输入系统一无所知: