【Unity3d】新输入系统New InputSystem 0.1.2版本简介
Unity又弄了新的输入系统, https://github.com/Unity-Technologies/InputSystem 论坛: https://forum.unity.com/forums/new-input-system.103/ 16年4月开始公开,到现在还没有弄完???
文档:
https://docs.unity3d.com/Packages/[email protected]/manual/index.html
视频讲解: https://www.youtube.com/watch?v=Pzd8NhcRzVo
为什么要弄新的输入系统?
GitHub上介绍是: “Unity的高效多功能输入系统”
可以将输入设备和 动作逻辑分离开。 通过映射的配置类关联。
这个帖子的声明包含挺多信息的: https://forum.unity.com/threads/input-system-update.508660/
提到为什么延期?, 是不是依然基于事件的? 可扩展性! 还有性能提升! 将来新旧系统共存等问题?
安装,设置, 自己看文档! 测试还不能选Both, 会报错。
使用试一试 :
下面的代码会输出Log 显示是否按下鼠标位置和 空格键。
using UnityEngine;
using UnityEngine.Experimental.Input;
public class InputTest : MonoBehaviour
{
private void Update()
{
Debug.LogFormat("Mouse Position : {0}", Mouse.current.position.ReadValue());
Debug.LogFormat("Press Space Key: {0}", Keyboard.current.spaceKey.isPressed);
}
}
Mouse.current获取当前鼠标,position.ReadValue()使用当前鼠标坐标。
Keyboard.current得到键盘, spaceKey.isPressed它是否被按下。除了isPressed之外,您还可以获取诸如是否wasPressedThisFrame按下,是否 wasReleasedThisFrame (在当前帧中释放)等信息。
在这个例子中是访问鼠标和键盘,用相同的方法可以测试 Joystick,Accelerometer,Gamepad,Gyroscope,Joystick,Pen,Touchscreen 的API也是可用的。
InputAction
InputAction是基于新输入系统的输入采集。 与之前的 Input Manager系统不同了 。这是每次输入完成时调用事件的地方,必须事先在委托中注册处理。
这个过程有趣的是每帧可以接收多个输入。由于它可以独立于帧接收输入,那就可以期望不会跳过输入。
例如,在较低的Gif动画中,在低帧率和高帧率环境中获得鼠标的位置,Input Manager(现在系统)与 新 Input System 绘制线。Input Manager由于只获取了帧开始处的鼠标,因此只能绘制非常简单的图形, 那么两者绘制的线条精细度是不一样的!!!
是否可以异步获取输入取决于 平台。
新旧输入系统。 即使帧率下降,新输入系统依然正常
准备InputAction字段 并使用 inputAction.performed 接收输入时的行为。在下面的示例中,mouseInput 在鼠标坐标进行 响应处理(假设它在您移动鼠标时有效),fireInput 在按下按钮时进行响应(假设您按下按钮)。
由于输入不能仅定义它,还要使用 inputAction.Enable() **。
using UnityEngine;
using UnityEngine.Experimental.Input;
public class InputTest2 : MonoBehaviour
{
public InputAction mouseInput; //鼠标输入
public InputAction fireInput; //按键输入
private void OnEnable()
{
mouseInput.Enable();
fireInput.Enable();
}
private void OnDisable()
{
mouseInput.Disable();
fireInput.Disable();
}
private void Awake()
{
mouseInput.performed += _ =>
{
var value = _.ReadValue<Vector2>();
Debug.LogFormat("pos:{0}, time:{1}", value, _.time);
};
fireInput.performed += _ =>
{
Debug.Log("Fire");
};
}
}
需要做设置:
确保仅在按下期间调用事件 ,这样处理:
InputActions
Input Actions 除了组合多个输入和绑定信息之外,还有一个生成代码的功能,以便在输入时简化行为的实现。
生成一个代码来获取鼠标位置并再次单击输入。
- Assets > Create > Input Actions 创建 资产。名为: MyInputSample。
- MyInputSample 双击打开,Action Maps 在+ 上点击的创建 名为: Player 。
- Actions在+ 上点击,将继续注册绑定的输入。
- Save Asset 按x关闭绑定界面 。
- 选中 MyInputSample资产, 在Inspector 面板上 勾选 Generate C# Class 和 Generate Interface然后单击。
- Apply按按钮。
按“Apply” 按钮 会自动生成同名的 MyInputSample.cs 文件
然后实现代码, 来测试生成的内容:
using UnityEngine;
using UnityEngine.Experimental.Input;
public class MyInputSampleTest : MonoBehaviour, ISampleActions
{
[SerializeField] MyInputSample input;
private void Awake()
{
input.Sample.SetCallbacks(this);
}
private void OnEnable()
{
input.Enable();
}
private void OnDisable()
{
input.Disable();
}
public void OnFire(InputAction.CallbackContext context)
{
Debug.Log("Fire");
}
public void OnMousePosiiton(InputAction.CallbackContext context)
{
var value = context.ReadValue<Vector2>();
Debug.Log(value);
}
}
声明 MyInputSample 类型字段 , 设置 监听。
运行, 移动鼠标将会显示日志。
添加 Control Schema
作用就是可以针对不同的输入设备进行设置。 前面都是鼠标键盘。 你可以设置 添加针对游戏手柄的设置。
绑定实际上是文本,所以可以代码动态修改。
例如,Fire要将 PC Schema 中 从鼠标单击更改为Space键,请编写如下所示的代码。
input.Sample.Fire.ApplyBindingOverride("<Keyboard>/space", input.PCScheme.bindingGroup);
字符串从哪里来的? WIndow > Input Debuger 中 点击... 可以看到
Input Debug
Window -> Input Debugger 点击