Unity 新的输入系统Input System(一)

落花浮王杯 提交于 2020-01-20 01:57:35

最近看见Unity出了新的输入系统Input System,本着喜新厌旧的原则,就让我们来学习学习这个新系统。

官方文档:https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/Installation.html

 

安装

运行环境:Unity 2019.1+ 和 .NET 4 runtime

官方的文档中已经讲得很详细了,我英语这么差都能看懂,大家肯定莫得问题。

简单来说就是在Package Manager中安装Input System,然后在Project Settings中的Player设置里将Active Input Handling设置为Input System即可。

设置好后运行工程,会发现之前的UGUI的界面无法响应点击事件,我们需要将默认场景中的EventSystem中的Standalone Input Module变更为新的Input System UI Input Module组件。

 

简单入门

环境配置好后,我们就可以在脚本中直接通过获取输入设备来获取输入,比如

var gamepad = Gamepad.current;//手柄
var keyboard = Keyboard.current;//键盘
var mouse = Mouse.current;//鼠标
var pointer = Pointer.current;//指针

if (gamepad != null)
{
    Debug.Log(gamepad.leftStick.ReadValue());//手柄遥感的偏移
    if (gamepad.bButton.wasPressedThisFrame)
        Debug.Log("按下B键");
}
if (keyboard != null)
{
    //执行顺序 isPressed = false -> 按下:wasPressedThisFrame = true -> 中途:isPressed = true -> 松开:wasReleasedThisFrame = true -> isPressed = false
    if (keyboard.wKey.wasPressedThisFrame)
        Debug.Log("w键按下(一直按住w键的话,也只执行一次)");
    if (keyboard.wKey.wasReleasedThisFrame)
        Debug.Log("w键松开");
    Debug.Log("是否按住w键:" + keyboard.wKey.isPressed);
}
if (mouse != null)
{
    Debug.Log(mouse.scroll.ReadValue());//滚轮的滚动值,向前滚Y的值为正,向后滚为负

    if (mouse.leftButton.wasPressedThisFrame)
        Debug.Log("按鼠标左键");
    if (mouse.rightButton.wasPressedThisFrame)
        Debug.Log("按鼠标右键");
    if (mouse.middleButton.wasPressedThisFrame)
        Debug.Log("按滚轮键");
}
if (pointer != null)
{
    Debug.Log(pointer.delta.ReadValue());//与上一帧的偏移
    Debug.Log(pointer.position.ReadValue());//在空间中的坐标
}

更加详细的介绍我们可以在文档中 支持的输入设备 处查阅

 

通过上面的方法,我们会发现加入我们有些事件可以通过多种输入来触发,比如射击,可以通过鼠标左键、点击屏幕、按键盘,这样就会很麻烦,需要获取很多的设备去设置。或者我们想在后期添加新的输入来控制,比如使用遥感来射击等等,也会很不方便。为了解决这种问题,我们还可以通过Input Action来间接的获取输入。

首先我们给一个GameObject添加PlayerInput组件,每个PlayerInput组件即代表一个玩家。添加好组件后,如果我们要接受到输入,还需要创建Action。我们可以点击组件上的Create Actions按钮来创建,会弹出一个对话框,来选择存放生成的.inputactions文件路径。创建成功后就会弹出下面这样的编辑界面,先保持默认即可。

通过这个界面,我们可以看出,假如我们有个角色移动的操作要处理,即图中的Move Action,看Move的内部可以知道,触发该Action的方式有手柄的左遥感,或者键盘的wasd按键等等。这样相比之前的直接获取输入设备而言可以更好的控制触发条件,并且后期添加新的设备触发条件的话,只需要更改这个Asset文件即可。

 

接着我们要为创建好的Action设置响应,通过Player Input组件的Behavior属性,来设置Player Input组件通知游戏代码的方式。

Send Messages 通过在Player Input所属的GameObject上,利用GameObject.SendMessage()来通知
Broadcast Messages 通过在Player Input所属的GameObject上,利用GameObject.BroadcastMessage()来通知
Invoke Unity Events 为每个消息使用单独的UnityEvent,选中的时候会在下面显示Event属性来让我们设置

Invoke C Sharp Events

在脚本中注册事件回调,可用的事件有

onActionTriggered(玩家所以操作的事件集合)

onDeviceLose(设备丢失)

onDeviceRegaine(设备恢复)

除了Action的通知外,Player Input还会发送下面两个常规通知

Device Lost Event 玩家丢失了输入设备,例如设备没电了,或者断开连接等
Device Regained Event 玩家的设备恢复正常使用

 

我们这里先选择Invoke Unity Events的方式来通知事件,在下面的Events折叠栏中,我们可以去关联脚本中的方法。每个事件的方法都需要一个InputAction.CallbackContext参数,我们可以从中获取一些事件信息。

public void OnMove(InputAction.CallbackContext context)
{
    Vector2 move = context.ReadValue<Vector2>();
}

 

大致了解了之后,我们再来看看几个官方的Demo,从Package Manager中导入demo

我们先来看看Simple Demo,打开SimpleDemo_UsingPlayerInput.unity运行,我们可以用wasd来移动,鼠标指针来控制朝向,点击鼠标左键来发射(其他几个例子的效果也是一样的,实现的方式不同)。

点击Player查看其Player Input组件,实现的方法就和我们上面所介绍的一样,如果我们想要添加一个方式,利用Q键来发射。只需要在Actions的编辑界面中,fire出点击右边的小加号选择Add Binding,然后关联上KeyBoard的Q键即可。

大家自行理解下即可,这样就是一个最简单的利用新的Input System的例子。

其他几个demo的内容和后续的内容详解后续继续补充。

祝看客们新年快乐!

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!