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示例
- 获取PlayerInput组件:
PlayerInput input = this.GetComponent<PlayerInput>();
- 添加委托函数:
input.onDeviceLost += OnDeviceLost;
input.onDeviceRegained += OnDeviceRegained;
input.onControlsChanged += OnControlsChanged;
input.onActionTriggered += OnActionTrigger;
- 处理事件:
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>().x 、callbackContext.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使用示例
- 创建预制体方块,添加PlayerInput组件和脚本,创建配置文件并关联到预制体的PlayerInput组件,再关联到PlayerInputManger的玩家预制体上(预制体需有PlayerInput组件)。
- 调整方块预制体对象输入行为为手动关联模式,关联脚本上的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;
}
- 选择模式(如按A键和手柄开始键创建新预制体),PlayerInputManager自动处理输入控制。
- 让方块预制体挂载摄像机,勾选分屏选项实现分屏效果。
- 使用单例获取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