您现在的位置是:首页 >其他 >Unity InputSystem (二)网站首页其他

Unity InputSystem (二)

拿起键盘就是干 2023-05-22 12:00:02
简介Unity InputSystem (二)

InputActionAssets 是包含输入操作以及其关联的绑定和控制方案的资源,文件以 .inputactions 文件扩展名存储,并且是以纯 json 文件存储的。
![[Pasted image 20230407135340.png]]

创建 InputActionAssets 文件

![[1680846629618.png]]

在 Assets 窗口内选择创建 InputActions 文件

ControlSchemes

控制的解决方案(个人的理解是针对平台来提高解决方案),用于关联Action同时对设备相对应的Action进行分类。InputSystem会根据设备类型自动切换方案。
![[Pasted image 20230407152526.png]]

InputActionAssets 编辑窗口分为三个窗格:
1. ActionMaps 列出了资产中的操作映射。每个操作映射都是可以批量启用或禁用的操作
2. 中间窗格包含当前所选操作映射中的操作,以及与每个操作关联的绑定。
3. 右窗格包含当前选定的操作或绑定的属性。

ActionMaps

行为集合,用于将输入信号转换为Action(配置某个行为),点击右侧加号可创建Action。
何时需要多个 ActionMaps
比如一个吃鸡游戏,有行走状态、驾驶汽车的状态、在界面上的状态。

这时我们就需要为这些状态各自配置独立的Action Map去控制操作。如,为行走状态配置ActionMap映射移动(wasd)、跳跃(空格),同时你又需要另一个Action Maps 用于控制驾驶 映射开车(wasd)、跳车(空格)。

这两种操作之间可能会发生按键冲突,你可以在不同的状态下切换Action Maps从而满足游戏需求。

Action

Add Binding:普通的绑定,可以绑定一个信号。
Add Positive Negatyite Binding 一维绑定,两个按钮的组合,返回值为float
Add UpDownLeftRight Composite 二维绑定, 四个按钮的组合,返回值为 vector2,例如WASD
ADD UpDownLeftRightForwardBackward Composite 返回值为 vector3.
Add Button With One Modifier Composite:需要同时按下两个按钮的组合,例如ctrl+1
Add Button With Two Modifier Composite:需要同时按下三个按钮的组合,例如shift+ctrl+1
![[1680852723753.png]]

Action Type

Value :主要用于状态连续变化的输入,例如鼠标的移动,遥感。
Button :用于每次按下时触发的Action
Pass-Through :类似于Value,区别在于多个设备都绑定这个Action,Pass-Through会发送执行所有设备的输入

Interactions

(交互)主要用于一些特殊的输入模式,例如其中的Hold模式,要求控件至少保持的时间。
可以在Action或者Binding下设置它,如果在Action下设置,那么该Action下的每个Binding都会在达成条件下触发这个Interaction。如果在同一个Action或Binding上绑定多个Interaction,则会按照其顺序进行检测。

Default

当Action Type为Value或Button时,当输入设备响应会调用started回调(例如按钮按下,或者鼠标开始拖动),当设备响应中时会调用performed回调(在started后触发,调用一次。若为Value的话,当值发生变化会再次触发,例如遥感,按住之后每次偏移位置都会触发一次),当输入设备结束响应会调用canceled回调(例如按钮松开,或者鼠标停止拖动)。当Action Type为PassThrough的时候,只会调用performed回调。

Press

可以实现类似按钮的操作
Press Only 按下的时候触发started和performed。不触发canceled
Release Only 按下的时候触发started,松开的时候触发performed。不触发canceled
Press And Release 按下的时候触发started和performed,松开的时候会再次触发started和performed。不触发canceled

Press Point

在Input System中,每个按钮都有对应的浮点值,例如普通的按钮,将会在0(未按下)和1(按下)之间。因此我们可以利用这个值(Press Point)来进行区分,当大于等于这个值则认为按钮按下了。

Hold

适用于需要输入设备保持一段时间的操作。当按钮按下会触发started,若在松开按钮前,按住时间大于等于Hold Time则会触发performed(时间一到就触发),否则触发canceled。

Tap

和Hold相反,需要在一段时间内按下松开来触发。当按钮按下会触发started,若在Max Tap Duriation时间内(小于)松开按钮,触发performed,否则触发canceled。

SlowTap

类似Hold,但是它在按住时间大于等于Max Tap Duriation的时候,并不会立刻触发performed,而是会在松开的时候才触发performed

MultiTap

用作于多次点击,例如双击或者三连击。Tap Count为点击次数,Max Tap Spacing为每次点击之间的间隔(默认值为 2 * Max Tap Duration)。Max Tap Duration为每次点击的持续时间,即按下和松开按钮的这段时间。当每次点击时间小于Max Tap Duration,且点击间隔时间小于Max Tap Spacing,点击Tap Count次,触发performed。

Processors

输入处理器获取一个值并为其返回处理结果。接收的值和结果值的类型必须相同

Unity 提供的预定义处理器有以下几类

Clamp

将输入值固定在 […] 范围内。min max

Invert

反转 action 中的值(即,将值乘以 -1)。

Invert Vector 2

反转 Vector2 X,Y 取反

Invert Vector 3

反转 Vector3 X,Y,Z 取反

Normalize

归一化

Normalize Vector 2

将输入向量规范化为单位长度,与 Vector2.normalized 相同

Normalize Vector 3

将输入向量规范化为单位长度,与 Vector3.normalized 相同

Scale Vector 2

将所有输入值乘以倍数

Scale Vector 3

将所有输入值乘以倍数

Axis deadzone

限定轴的范围,

Stick deadzone

自定义 Processors

自定义类型继承 InputProcessor<TValue> 类,并实现 Process 方法 ,并将 自定义Processors 注册进 InputSystem 中

# if UNITY_EDITOR
[InitializeOnLoad]
# endif
public class MyValueShiftProcessor : InputProcessor<float>
{
    public float valueShift = 0;

	#if UNITY_EDITOR
    static MyValueShiftProcessor()
    {
        Initialize();
    }
    #endif
    
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    static void Initialize()
    {
        InputSystem.RegisterProcessor<MyValueShiftProcessor>();
    }

    public override float Process(float value, InputControl control)
    {
        return value + valueShift;
    }
}

如果需要将自定义 Processors 用于 InputActionAssets 面板,需要为 Processors 创建 Editor 代码

// No registration is necessary for an InputParameterEditor.
// The system will automatically find subclasses based on the
// <..> type parameter.
#if UNITY_EDITOR
public class MyValueShiftProcessorEditor : InputParameterEditor<MyValueShiftProcessor>
{
    private GUIContent m_SliderLabel = new GUIContent("Shift By");

    public override void OnEnable()
    {
        // Put initialization code here. Use 'target' to refer
        // to the instance of MyValueShiftProcessor that is being
        // edited.
    }

    public override void OnGUI()
    {
        // Define your custom UI here using EditorGUILayout.
        target.valueShift = EditorGUILayout.Slider(m_SliderLabel,
            target.valueShift, 0, 10);
    }
}
#endif

PlayerInput

Actions:InputActions配置文件

Default Scheme:一个默认的控制方案

Auto-Switch:运行过程中自动根据设备输入选择方案

Default Map:默认的映射集合

Behavior:事件调用方式类型

  1. SendMesssages
    使用Unity自带的SendMessage消息机制,查找并回调当前游戏对象所挂脚本中的回调函数。对应Action的回调函数为On+”Action的名字“。
  2. BroadcastMessages
    使用Unity自带的SendMessage消息机制,向当前游戏对象及层次结构中向下的所有游戏对象查找并回调所挂脚本中的回调函数。回调函数规则同SendMessages
  3. Invoke UnityEvents
    采用UnityEvent配置每个Action的回调函数,允许你自定义回调函数方法名
  4. Invoke C Sharp Events
    与UnityEvents类似,只是这些事件是 API 上可用的普通 C# 事件。无法从 editor 配置这些。相反,必须在脚本中的手动为事件注册回调。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。