19.Unity进阶InputSystem总结

19.总结


19.1 知识点

学习的主要内容

总结讲什么

对比

选择建议

总结


19.2 核心要点速览

InputSystem开启方法

开启方法:File——>Build Setting——>Player Setting——>Other——>Active Input Handling

代码检测输入

键盘输入

获取方式 操作检测 说明
using UnityEngine.InputSystem; <br> Keyboard keyBoard = Keyboard.current; 单个按键按下 通过keyBoard.具体按键.wasPressedThisFrame判断,如if (Keyboard.current.spaceKey.wasPressedThisFrame) 可检测空格键按下
单个按键抬起 利用keyBoard.具体按键.wasReleasedThisFrame,例如if (Keyboard.current.dKey.wasReleasedThisFrame) 检测D键抬起
单个按键长按 使用keyBoard.具体按键.isPressed,像if (Keyboard.current.spaceKey.isPressed) 检测空格长按状态
文本输入监听 lambda表达式:keyBoard.onTextInput += (c) => {print("通过lambda表达式" + c);}
普通函数:先定义private void TextInput(char c) ,再keyBoard.onTextInput += TextInput;
任意键按下 if (Keyboard.current.anyKey.wasPressedThisFrame) ,但无法得知具体按下的键

鼠标输入

获取方式 操作检测 说明
Mouse mouse = Mouse.current; 各键位按下 以左键为例,if (Mouse.current.leftButton.wasPressedThisFrame) 判断左键按下
各键位抬起 if (Mouse.current.leftButton.wasReleasedThisFrame) 检测左键抬起
各键位长按 例如if (Mouse.current.rightButton.isPressed) 检测右键长按
当前位置 Mouse.current.position.ReadValue() ,原点是左下角,值为屏幕最大分辨率
两帧偏移向量 Mouse.current.delta.ReadValue() ,获取鼠标两帧间移动向量
滚轮方向向量 Mouse.current.scroll.ReadValue() ,往上滚大于0,往下滚小于0

触屏输入

获取方式 操作检测 说明
Touchscreen touchscreen = Touchscreen.current;
使用前判空:if (touchscreen == null) return;
手指数量 print(touchscreen.touches.Count) 输出当前触屏手指数量
单个触屏手指 touchscreen.touches[0] 获取指定索引的手指信息
遍历所有触屏手指 foreach (var item in touchscreen.touches) 遍历所有触屏手指
手指按下 if (touchControl.press.wasPressedThisFrame)touchControl 为指定手指对象
手指抬起 if (touchControl.press.wasReleasedThisFrame) 检测手指抬起
手指长按 if (touchControl.press.isPressed) 判断手指长按状态
点击手势 if(touchControl.tap.isPressed) 检测手指点击
连续点击次数 print(touchControl.tapCount) 输出手指连续点击次数
手指位置 print(touchControl.position.ReadValue()) 获取当前手指位置
首次接触位置 print(touchControl.startPosition.ReadValue()) 得到手指第一次接触时位置
接触区域大小 touchControl.radius.ReadValue() 读取手指接触区域半径大小
偏移位置 touchControl.delta.ReadValue() 获取手指偏移位置
手指状态 UnityEngine.InputSystem.TouchPhase touchPhase = touchControl.phase.ReadValue();
通过switch语句判断:
csharp<br>switch (touchPhase)<br>{<br>//无<br>case UnityEngine.InputSystem.TouchPhase.None:<br>break;<br>//开始接触<br>case UnityEngine.InputSystem.TouchPhase.Began:<br>break;<br>//移动<br>case UnityEngine.InputSystem.TouchPhase.Moved:<br>break;<br>//结束<br>case UnityEngine.InputSystem.TouchPhase.Ended:<br>break;<br>//取消<br>case UnityEngine.InputSystem.TouchPhase.Canceled:<br>break;<br>//静止<br>case UnityEngine.InputSystem.TouchPhase.Stationary:<br>break;<br>default:<br>break;<br>}

手柄输入

获取方式 操作检测 说明
Gamepad gamePad = Gamepad.current;
使用前判空:if (gamePad == null) return;
左摇杆方向向量 print(gamePad.leftStick.ReadValue()) ,右和上是正方向
右摇杆方向向量 print(gamePad.rightStick.ReadValue())
左摇杆按下 if (gamePad.leftStickButton.wasPressedThisFrame) 判断左摇杆按下
左摇杆抬起 if (gamePad.leftStickButton.wasReleasedThisFrame) 检测左摇杆抬起
左摇杆长按 if (gamePad.leftStickButton.isPressed) 检测左摇杆长按
方向键(以左方向键为例) 按下:if (gamePad.dpad.left.wasPressedThisFrame)
抬起:if (gamePad.dpad.left.wasReleasedThisFrame)
长按:if (gamePad.dpad.left.isPressed)
右侧按键(以北向按钮为例) gamePad.buttonNorth ,按下检测如if (Gamepad.current.buttonNorth.wasPressedThisFrame) ,也可按具体名字如gamePad.triangleButton 等监听
中央按键(开始键) gamePad.startButton ,按下检测if (Gamepad.current.startButton.wasPressedThisFrame)
中央按键(选择键) gamePad.selectButton ,按下检测if (Gamepad.current.selectButton.wasPressedThisFrame)
肩部按键(左侧前方) gamePad.leftShoulder ,按下检测if (Gamepad.current.leftShoulder.wasPressedThisFrame)
肩部按键(左侧后方) gamePad.leftTrigger ,按下检测if (Gamepad.current.leftTrigger.wasPressedThisFrame)

其他输入

设备类型 说明 学习方式
Joystick(摇杆) 用于输入操作 查看官方文档或类内部成员,了解属性和方法
Pen(电子笔) 实现特定输入 同上
Sensor(传感器) 包含陀螺仪(UnityEngine.InputSystem.Gyroscope )、重力传感器等 查看官方文档,或通过代码示例如UnityEngine.InputSystem.Gyroscope gyroscope = UnityEngine.InputSystem.Gyroscope.current; gyroscope.angularVelocity.ReadValue(); ,查看类内部成员使用

InputAction

InputAction参数设置

设置项 详情
Actions输入动作设置 设置检测的输入类型
Action Type(动作类型) Value:用于状态连续更改的输入,多个设备绑定时只发送最受控制设备的输入
Button:每次按下时触发的Action
Pass Through:和Value类似,多个设备绑定时发送所有设备的输入
Control Type(控制类型) 选择类型后会筛选输入设备,如Vector2只能选返回Vector2变量类型的设备(手柄摇杆、鼠标位置等),Button只能选按钮返回值设备(鼠标左键、手柄按键等),包括Any、Analog、Axis、Bone、Digital、Double、Dpad、Eyes、Integer、Quaternion、Stick、Touch、Vector2、Vector3等
Interactions相互作用设置 用于特殊输入(长按、多次点击等),满足条件时触发行为,有started(开始)、performed(触发)、canceled(结束)三个事件
相互作用设置参数 Hold:长按操作,按下触发started,按住时间大于等于Hold Time触发performed,否则触发canceled
Tap:点击操作,按下触发started,在Max Tap Duriation时间内松开触发performed,否则触发canceled
SlowTap:类似Hold,按住时间大于等于Max Tap Duriation,松开时触发performed
MultiTap:多次点击操作,Tap Count为点击次数,Max Tap Spacing为点击间隔,Max Tap Duration为每次点击持续时间,满足条件触发performed
Press:类似按钮操作,Trigger Behavior有Press Only(按下触发started和performed,不触发canceled)、Release Only(按下触发started,松开触发performed)、Press And Release(按下和松开都触发started和performed,不触发canceled)、Press Point(利用按钮浮点值区分按下状态)
Processors值处理加工设置 Clamp:将输入值钳制到[min..max]范围
Invert:反转控件值(乘以-1)
Invert Vector 2:反转Vector2轴的值
Invert Vector 3:反转Vector3轴的值
Normalize:将输入值规格化为[0..1]或[-1..1]
Normalize Vector 2:将输入向量规格化为单位长度
Normalize Vector 3:将输入向量规格化为单位长度
Scale:将输入值乘以系数
Scale Vector 2:沿x、y轴乘以相应值
Scale Vector 3:沿x、y、z轴乘以相应值
死区设置 Axis Deadzone:缩放控件值,使绝对值小于最小值为0,大于最大值为1或-1,避免无意输入和确保最大值
Stick Deadzone:缩放Vector2控件值,幅值小于最小值为(0,0),大于最大值规格化为长度1

InputAction输入绑定类型

绑定类型 详情
Add Binding 添加单按键输入绑定,如鼠标左右键按下
Add Positive\Negative Binding Or Add 1D Axis Composite 添加1D轴组合(类似水平竖直热键,返回-1~1值),参数有Negative(负面按键)、Positive(正向按键)、Composite Type(复合类型)、MinValue(最小值)、MaxValue(最大值)、Which Side Wins(同时按下处理方式,Neither:取中间值,Positive:取maxValue,Negative:取minValue)
Add Up\Down\Left\Right Composite Or Add 2D Vector Composite 添加2D向量组合(类似水平竖直热键组合,Vector的x、y表示两个轴),参数有Up、Down、Left、Right、Composite Type(复合类型)、Mode(处理模式,Analog:模拟值,Digital Normalized:单位化向量,Digital:未单位化向量)
Add Up\Down\Left\Right\Forward\Backward Composite 添加3D向量组合,比2D多一维参数,需关联多两个键
Add Button With One Modifier Composite 添加带有一个复合修改器的按钮(双组合键,如Ctrl+C),参数有Modifier(复合输入内容)、Button(输入内容)
Add Button With Two Modifier Composite 添加带有两个复合修改器的按钮(三组合键,如Ctrl+K+U),参数有Modifier(两个复合输入内容)、Button(输入内容)

InputAction使用方法

操作 详情
启用输入检测 move.Enable();
操作监听 - 开始操作 move.started += StartedTestFun;
private void StartedTestFun(InputAction.CallbackContext context) { print("开始事件调用"); }
操作监听 - 真正触发 move.performed += (context) => { print("触发事件调用"); }
操作监听 - 结束操作 move.canceled += (context) => { print("结束事件调用"); }
关键参数CallbackContext 可获取当前状态(context.phase,如Disabled、Waiting、Started、Performed、Canceled)、动作行为信息(context.action.name)、控件(设备)信息(context.control.name)、获取值(context.ReadValue<float>)、持续时间(context.duration)、开始时间(context.startTime

InputAction特殊设置及系统设置

设置项 详情
特殊输入设置 可在Interactions中为整个动作或单个设备设置特殊输入条件,如长按时间等;可点击创建InputSystem默认值设置文件并修改
Input System Package设置 UpdateMode:更新模式(Process Events In Dynamic Update、Process Events In Fixed Update、Process Events Manually)
Background Behavior:后台行为(Reset And Disable Non Background Devices、Reset And Disable All Devices、Ignore Focus、Filter Noise on .current、Compensate Orientation)
Default Deadzone Min:默认死区最小值
Default Deadzone Max:默认死区最大值
Default Button Press Point:默认按钮按下点
Button Release Threshold:按钮释放阈值
Default Tap TIme:默认点击时间
Default Slow Tap Time:默认慢速点击时间
Default Hold Time:默认保持时间
Tap Radius:点击半径
MultTap Delay TIme:多次点击延迟时间
Supported Devices:可设置支持的设备,不设置则支持所有可识别设备,设置后缩小编辑器显示范围并避免无关设备输入
Motion Usage:动作使用
Description:描述
Play Mode Input Behavior:播放模式输入行为(Pointers And Keyboards Respect Game View Focus、All Devices Respect Game View Focus、All Device Input Always Goes To Game View)

InputActions输入操作配置文件

类别 详情
定义 输入系统中是 InputAction 的集合,记录想要处理的行为和动作(InputAction 相关信息),可自定义 InputAction(如开火、移动、旋转等)并关联对应的输入动作,与 PlayerInput 关联后,PlayerInput 自动解析文件,触发输入动作时以分发事件形式通知执行行为
创建方式 在 Project 窗口右键选择 Create 创建 InputActions 配置文件,文件后缀为 .inputactions,本质是 json 文件
编辑方式 双击创建出的文件弹出配置窗口进行配置,每次更改后需点击保存配置或勾选自动保存
配置窗口参数 ActionMaps 行动地图窗口:可理解为行为分组配置,能配置多套操作规范,可右键或点击加号创建新配置、移除等
Actions 输入动作窗口:在此可通过加号或右键创建各种 InputAction,无需在代码中声明变量,可直接添加键盘配置
Properties 输入操作绑定的输入属性:与普通 InputAction 点击齿轮的选项相同
工具栏:提供保存、搜索等功能按键
设置编辑器显示的控制方案 选项:Gamepad(手柄)、Joystick(摇杆)、KeyboardMouse(键盘鼠标)、Touch(触屏)、XR(VR/AR 等)、All Devices(设备选择)
作用:切换控制方案后,若该方案由多个设备配合控制,可进一步筛选对应设备,如切换键盘鼠标方案后可二次筛选
保存配置 Auto-Save:自动保存配置
搜索栏:可搜索对应动作行为
编辑配置文件基本操作流程 1. 左上角添加控制方案(如手柄和鼠标键盘),在下面小列表分别选择设备
2. 在每个绑定设备中选择设备的控制方案
3. 左上角选择控制方案可筛选设备,选择后还可二次筛选设备
InputSystem中专门用于任意键按下的方案
InputSystem.onAnyButtonPress.CallOnce
InputSystem.onAnyButtonPress.CallOnce((control) =>
{
    print("InputSystem中专门用于任意键按下的方案 路径" + control.path);
    print("InputSystem中专门用于任意键按下的方案 名字" + control.name);
});
通过Json数据加载配置文件
string json = Resources.Load<TextAsset>("PlayerInputTest").text;

// 使用 InputActionAsset 类的静态方法 FromJson 解析 json 字符串,返回解析后的 InputActionAsset 对象,并将其存储在变量 asset 中
InputActionAsset asset = InputActionAsset.FromJson(json);

// 将解析后的 InputActionAsset 对象赋值给 input 对象的 actions 属性
input.actions = asset;

输入配置文件生成CSharp代码

类别 详情 示例
课前准备 创建配置文件,在配置文件中创建两套行为 假设创建一个游戏相关的输入配置文件,一套行为是角色的战斗操作(如开火等),另一套行为是角色的移动和跳跃操作
根据配置文件生成C#代码 1. 选择 InputActions 文件,勾选 Generate C# Class
2. 在 Inspector 窗口设置生成路径(如 Assets/Scripts/GeneratedInputCode)、类名(如 CustomInputActions)、命名空间(如 MyGame.Input)
3. 应用后生成代码,生成的代码根据 InputAction 配置文件解析 Json 生成类并提供一些方法
例如,在 Unity 项目中,已经创建好名为 MyInputActions.inputactions 的配置文件,选中它后在 Inspector 窗口勾选 Generate C# Class,设置生成路径为 Assets/Scripts/InputCode,类名为 GameInputActions,命名空间为 GameProject.Input,点击应用后,在指定路径下生成对应的 C# 代码文件
使用C#代码进行监听 声明对象 GameInputActions input; 声明一个用于监听输入的配置文件对象(这里以 GameInputActions 为例,对应前面生成的类名)
Start 方法 1. 创建生成的代码对象:input = new GameInputActions(); 实例化配置文件对象
2. 激活配置文件的输入:input.Enable(); 启用输入
3. 添加事件监听:
input.Action1.Fire.performed += (context) => { print("鼠标点击 开火"); };
input.Action2.Space.performed += (context) => { print("空格按下 跳跃"); };
假设 Action1 是战斗操作行为组,Fire 是其中的开火输入动作;Action2 是移动跳跃行为组,Space 是其中的跳跃输入动作
Update 方法 print("wasd移动" + input.Action1.Move.ReadValue<Vector2>()); 监听输入并打印相关信息
假设 Move 是 Action1 行为组中用于控制角色移动的输入动作,通过 ReadValue 获取移动的向量值并打印

PlayerInput

PlayerInput介绍

类别 详情
PlayerInput定义 InputSystem提供的用于接受玩家输入并处理自定义逻辑的组件
PlayerInput工作原理 1. 配置输入文件(InputActions文件)
2. 通过PlayerInput关联配置文件,自动解析
3. 关联响应函数,处理对应逻辑
PlayerInput好处 1. 无需自己书写输入逻辑
2. 通过配置文件配置监听行为
3. 专注于输入事件触发后的逻辑处理
添加PlayerInput组件 选择一个对象(一般为玩家对象),为其添加PlayerInput组件
PlayerInput参数 Actions(行为)
Default Scheme(默认控制方案)
Ui Input Module(UI输入模块)
Camera(摄像机)
Behavior(行为执行模式):
SendMessage:逻辑脚本挂载在与PlayerInput同一对象上,通过SendMessage通知执行函数
BroadcastMessage:逻辑脚本可挂载在自身或子对象上,通过BroadcastMessage通知执行函数
Invoke UnityEvent Actions:在Inspector窗口通过拖拽关联函数,响应函数参数类型为InputAction.CallbackContext,可关联其他对象的脚本函数
Invoke CSharp Events:通过获取PlayerInput进行事件监听,可得到对应行为的值,如input.currentActionMap[“Move”].ReadValue()
SendMessage示例

在自定义脚本中声明名为“On+行为名”的函数,无参数或参数类型为InputValue,挂载到PlayerInput依附对象上。代码如下:

public void OnMove(InputValue value)
{
    print("Move");
    print("Move" + value.Get<Vector2>());
}


public void OnFire(InputValue value)
{
    print("Fire");
    if (value.isPressed)
    {
        print("Fire按下");
    }
}
BroadcastMessage示例

基本规则同SendMessage,自定义脚本还可挂载在子对象上。

Invoke Unity Events示例

在脚本中声明函数:

public void MyFire(InputAction.CallbackContext context)
{
    print("开火1");
}

public void MyMove(InputAction.CallbackContext context)
{
    print("移动1");
}

public void MyLook(InputAction.CallbackContext context)
{
    print("Look1");
}

在Inspector窗口通过拖拽关联函数。

Invoke C Sharp Events示例
  1. 获取PlayerInput组件:
PlayerInput input = this.GetComponent<PlayerInput>();
  1. 添加委托函数:
input.onDeviceLost += OnDeviceLost;
input.onDeviceRegained += OnDeviceRegained;
input.onControlsChanged += OnControlsChanged;
input.onActionTriggered += OnActionTrigger;
  1. 处理事件:
public void OnActionTrigger(InputAction.CallbackContext context)
{
    print("触发OnActionTrigger");
    switch (context.action.name)
    {
        case "Fire":
            if (context.phase == InputActionPhase.Performed)
                print("开火");
            break;
        case "Look":
            print("看向");
            print(context.ReadValue<Vector2>());
            break;
        case "Move":
            print("移动");
            print(context.ReadValue<Vector2>());
            break;
    }
}

PlayerInput玩家输入管理组件

类别 详情
关键参数 InputValue:
判断是否按下:inputValue.isPressed
获取Vector2类型值:inputValue.Get<Vector2>()
InputAction.CallbackContext:
获取Vector2类型值的x和y属性:callbackContext.ReadValue<Vector2>().xcallbackContext.ReadValue<Vector2>().y
获取输入行为名字:callbackContext.action.name
获取输入控件名字:callbackContext.control.name
获取输入控件所属设备名字:callbackContext.control.device.name
获取输入阶段枚举值:callbackContext.phase
获取输入阶段字符串表示:callbackContext.phase.ToString()
PlayerInputManager作用 用于管理本地多人输入的输入管理器,管理玩家加入和离开,如分屏游戏和双手柄游戏
PlayerInputManager组件参数 Notification Behavior:当玩家进入时,PlayerInputManager通知关联对象的方式,与PlayerInput工作方式相同
Join Behavior(玩家加入机制):
Join Players When Button Is Pressed:新设备加入或无玩家时按下任意键加入
Join Players When Join Action Is Triggered:新设备加入时按下指定按键触发加入,一般选择此项
Join Players Manually:手动加入玩家
Player Prefab:挂载PlayerInput组件的游戏对象
Joining Enabled By Default:启用后,新加玩家按JoinBehavior规则加入,默认勾选
Limit Number Of Players:启用后,可限制加入游戏的玩家数量,Max Player Count为允许的最大玩家数
Enable Split_Screen:启用后,自动为每个对象分配屏幕区域用于多人分屏游戏
Maintain Aspect Ratio:控制分屏区域纵横比与实际屏幕分辨率匹配
Set Fixed Number:大于零时,始终将屏幕分割为固定数量矩形
Screen Rectangle:用于分配玩家分屏的规范化屏幕矩形
PlayerInputManager使用示例
  1. 创建预制体方块,添加PlayerInput组件和脚本,创建配置文件并关联到预制体的PlayerInput组件,再关联到PlayerInputManger的玩家预制体上(预制体需有PlayerInput组件)。
  2. 调整方块预制体对象输入行为为手动关联模式,关联脚本上的Move函数,代码如下:
private Vector3 dir;
void Update()
{
    this.transform.Translate(dir * 10 * Time.deltaTime);
}

public void Move(InputAction.CallbackContext context)
{
    dir = context.ReadValue<Vector2>();
    dir.z = dir.y;
    dir.y = 0;
}
  1. 选择模式(如按A键和手柄开始键创建新预制体),PlayerInputManager自动处理输入控制。
  2. 让方块预制体挂载摄像机,勾选分屏选项实现分屏效果。
  3. 使用单例获取PlayerInputManager并添加玩家加入和离开事件:
//获取PlayerInputManager
//PlayerInputManager.instance
//玩家加入时
PlayerInputManager.instance.onPlayerJoined += (playerInput) =>
{
    print("创建了一个玩家");
};
//玩家离开时
PlayerInputManager.instance.onPlayerLeft += (playerInput) =>
{
    print("离开了一个玩家");
};

UGUI配合使用

类别 详情
InputSystem对UI的支持情况 不支持IMGUI(GUI),此限制仅对编辑器代码有效。若激活InputSystem,OnGUI中输入判断内容不触发,让OnGUI内容有效需选“Both”或只激活老输入系统InputManager;支持UGUI,需用新输入系统的输入模块(Input System UI Input Module)处理相关输入
UGUI中新输入系统输入模块参数 Move Repeat Delay
Move Repeat Rate:移动动作保持激活时,生成重复导航事件的间隔(秒),受帧速率限制,每帧不会有多个移动重复事件
XR Tracking Origin:无明确详细说明
Deselect On Background CLick:默认点击指针未击中游戏对象时清除当前选择,可能妨碍键盘和游戏板导航,设为false可防止自动取消选择
Pointer Behavior:
Single Mouse Or Pen BUt Multi Touch And Track:未分类为触摸或跟踪输入的按单个统一指针处理,跟踪和触摸输入按所有指针处理,触摸或跟踪设备输入时,鼠标和笔的单个统一指针会被删除
Single Unified Pointer:所有指针输入统一为一个指针,只有帧中最后一个输入生效
All Pointers As Is:UI输入模块不统一指针输入,每个设备输入都是独立指针,可能出现多个指针同时指向多个对象的情况
Actions Asset:包含控制UI的所有操作的输入操作资产,默认引用DefaultInputActions内置资产,可创建自定义资源并在此分配,编辑器会根据命名约定自动映射操作到UI输入
Point:提供2D屏幕位置的动作,用于鼠标样式的UI交互,设置为传递操作类型和向量2值类型
Left Click:映射到与UI交互的主光标按钮的操作,设置为传递操作类型和按钮值类型
Middle Click:映射到与UI交互的中间光标按钮的操作,设置为传递操作类型和按钮值类型
Right Click:映射到与UI交互的辅助光标按钮的操作,设置为传递操作类型和按钮值类型
Scroll Wheel:提供手势输入以允许在UI中滚动的操作,设置为传递操作类型和向量2值类型
Move:提供用于选择当前活动用户界面的二维矢量的操作,允许游戏板或箭头键样式的UI导航,设置为传递操作类型和向量2值类型
Submit:与当前选择的UI接触或“单击”的操作,设置为按钮动作类型
Cancel:退出与当前选定UI的任何交互的操作,设置为按钮动作类型
Tracked Position:提供一个或多个空间跟踪设备(如XR hand控制器)的3D位置的动作,结合跟踪设备方向实现XR样式的UI交互,设置为传递操作类型和向量3值类型
Tracked Orientation:传递表示一个或多个空间跟踪设备(如XR hand控制器)旋转的四元数的操作,结合跟踪设备位置实现XR样式的UI交互,设置为传递操作类型和四元数值类型
VR项目使用注意事项 在VR项目中用新输入系统配合UGUI,需在Canvas对象上添加Tracked Device Raycaster组件
多人游戏使用多套UI 同一设备多人游戏,每人想用独立UI,需将EventSystem中的EventSystem组件替换为Multiplayer Event System组件(先移除InputSystemUIInputModule和EventSystem组件再添加);可同时激活多个MultiplayerEventSystem,每个玩家有自己的InputSystemUIInputModule和MultiplayerEventSystem组件及操作来驱动UI;若使用PlayerInput组件,可设置其自动配置玩家的InputSystemUIInputModule;MultilayerEventSystem组件属性与事件系统中属性相同,还添加了playerRoot属性,可设为包含此事件系统应处理的所有UI可选择项的游戏对象
On - Screen组件相关 可模拟UI和用户操作的交互,如On - Screen Button用于按钮交互,On - Screen Stick用于摇杆交互,关联之前输入配置文件设置好逻辑和关联设备的小球输入,如On - Screen Stick关联手柄摇杆可像手柄摇杆一样控制小球移动,On - Screen Button关联空格键可像按空格键一样控制小球跳跃

InputDebug输入调试器

类别 详情
InputDebug定义 即输入调试器,可通过输入调试窗口检测输入相关信息,用于在输入不按预期工作时排查问题
打开InputDebug窗口的方式 1. 通过菜单栏:Window(窗口)-> Analysis(分析)-> Input Debugger(输入调试器)
2. 通过PlayerInput组件:点击PlayerInput组件上的Open Input Debugger
InputDebug窗口信息 - 未运行状态 Options操作下拉框
Devices
Unsupported
Layouts
Controls
Abstract Devices
Specific Devices
Settings
Metrics
InputDebug窗口信息 - 运行状态 双击设备可进行相关操作和查看更详细信息(文档中未明确具体内容,仅提及双击设备这一操作)


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏