PlayerInput 是 InputSystem 提供的专门用于接受玩家输入来处理自定义逻辑的组件
主要工作原理:
好处:
Actions:行为
一套输入动作和玩家相关联,帮助我们监听一些按键的输入
Camera:关联摄像机,当分屏设置时才需修改此选项
Behavior:如何通知游戏对象上执行对应逻辑
(一)Send Messages
在自定义脚本中,申明名为 “On+行为名” 的函数,没有参数或者参数类型为 InputValue
将该自定义脚本挂载到 PlayerInput 依附的对象上,当触发对应输入时 会自动调用函数,并且还有默认的 3 个和设备相关的函数可以调用
设备注册(当控制器从设备丢失中恢复并再次运行时会触发):OnDeviceRegained(PlayerInput input)
设备丢失(玩家失去了分配给它的设备之一,例如,当无线设备耗尽电池时):OnDeviceLost(PlayerInput input)
控制器切换:OnControlsChanged(PlayerInput input)
(二)Broadcast Messages
基本和 SendMessage 规则一致
唯一的区别是,自定义脚本不仅可以挂载在 PlayerInput 依附的对象上,还可以挂载在其子对象下
(三)Invoke Unity Events
该模式可以让我们在 Inspector 窗口上通过拖拽的形式关联响应函数
但是注意:响应函数的参数类型需要改为 InputAction.CallbackContext
(四)Invoke C Sharp Events
// 1.获取PlayerInput组件
PlayerInput input = this.GetComponent<PlayerInput>();
// 2.获取对应事件进行委托函数添加
input.onDeviceLost += OnDeviceLost;
input.onDeviceRegained += OnDeviceRegained;
input.onControlsChanged += OnControlsChanged;
input.onActionTriggered += OnActionTrigger;
// input.currentActionMap["Move"].ReadValue()
// 3.当触发输入时会自动触发事件调用对应函数
PlayerInputManager 组件主要是用于管理本地多人输入的输入管理器,它主要管理玩家加入和离开
(一)面板参数
Norification Behavior:当玩家进入时 PlayerInputManager 如何通知关联的对象
它的工作方式和 PlayerInput 相同
Join Behavior:玩家加入的机制
Player Prefab:挂在 PlayerInput 组件的游戏对象
Joining Enabled By Default:启用后,新加玩家按照 JoinBehavior 的规则加入
Limit Number Of Players:启用后,可以限制加入游戏的玩家数量
Enable Split-Screen:如果启用,会自动为每个对象分配可用屏幕区域的一部分,用于多人游戏分屏
(二)PlayerInputManager使用
// 获取PlayerInputManager
PlayerInputManager.instance
// 玩家加入时
PlayerInputManager.instance.onPlayerJoined += playerInput => { print("创建了一个玩家"); };
// 玩家离开时
PlayerInputManager.instance.onPlayerLeft += playerInput => { print("离开了一个玩家"); };
新输入系统 InputSystem 不支持 IMGUI(GUI)注意:编辑器代码不受影响
如果当前激活的是 InputSystem,那么 OnGUI 中的输入判断相关内容不会被触发
必须要选择 Both 或者只激活老输入系统 InputManager 才能让 OnGUI 中内容有用
新输入系统支持 UGUI,但是需要使用新输入系统输入模块(Input System UI Input Module)
Move Repeat Delay:生成初始 IMoveHandler 之间的初始延迟(秒)
OnMove 导航事件,并在移动操作保持激活状态时生成重复的导航事件。
Move Repeat Rate:移动动作保持激活时,生成重复导航事件之间的间隔(秒)
请注意,这是由帧速率限制的;每帧不会有多个移动重复事件,因此,如果帧速率低于重复率,则有效重复率将低于此设置。
XR Tracking Origin:XR 跟踪原点
Deselect On Background CLick:
默认情况下,当指针被点击并且没有击中任何游戏对象时,当前选择被清除。然而,这可能会妨碍键盘和游戏板导航,因为它们需要关闭当前选定的对象。要防止自动取消选择,请将此属性设置为 false。
Pointer Behavior:如何处理将输入送入 UI 的多个指针
Single Mouse Or Pen BUt Multi Touch And Track
对于未分类为触摸或跟踪输入的所有输入,其行为类似于单个统一指针,对于跟踪和触摸输入,其行为类似于所有指针。
例如,如果在鼠标和笔上接收到并发输入,则将两者的输入馈送到同一 UI 指针实例中。其中一个的位置输入将覆盖另一个的位置。
请注意,当从触摸或跟踪设备接收到输入时,鼠标和笔的单个统一指针将被删除,包括在鼠标 / 笔光标当前悬停在对象上时发送的 IPointerExit 事件。
Single Unified Pointer
所有指针输入都是统一的,因此只有一个指针。这包括触摸和跟踪输入。
例如,这意味着,无论有多少设备将输入输入输入点,只有帧中最后一个这样的输入才会生效并成为当前 UI 指针的位置。
All Pointers As Is
UI 输入模块不会统一任何指针输入。任何设备,包括提供输入指针类型动作的触摸和跟踪设备,都将是其自己的指针(或触摸输入的多个指针)。
注意:这可能意味着 UI 中将有任意数量的指针,并且可能同时指向多个对象。
Actions Asset
包含控制 UI 的所有操作的输入操作资产。您可以使用以下属性选择资产中的哪些操作对应于哪些 UI 输入。
默认情况下,这将引用名为 DefaultInputActions 的内置资产,该资产包含用于驱动 UI 的常见默认操作。如果要设置自己的操作,请创建自定义输入操作资源并在此处分配。在 Inspector 中将新资源引用指定给此字段时,编辑器会尝试根据常用命名约定自动将操作映射到 UI 输入。
Point:提供 2D 屏幕位置的动作。用作指向 UI 元素的光标,以实现鼠标样式的 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 位置的动作。结合跟踪设备方向,这允许通过指向空间中的 UI 可选择项进行 XR 样式的UI交互。
设置为传递操作类型和向量 3 值类型。
Tracked Orientation
传递表示一个或多个空间跟踪设备(如 XR hand 控制器)旋转的四元数的操作。结合跟踪设备位置,这允许通过指向空间中的 UI 可选择项进行 XR 样式的 UI 交互。
设置为传递操作类型和四元数值类型。
(一)VR 相关中使用新输入系统注意事项
如果想在 VR 项目中使用新输入系统配合 UGUI 使用,需要在 Canvas 对象上添加 Tracked Device Raycaster 组件
(二)多人游戏使用多套 UI
如果同一设备上的多人游戏,每个人想要使用自己的一套独立 UI,需要将 EventSystem 中的 EventSystem 组件替换为 Multiplayer Event System 组件
与 EventSystem 组件不同,可以在场景中同时激活多个 MultiplayerEventSystem。这样,您可以有多个玩家,每个玩家都有自己的 InputSystemUIInputModule 和 MultiplayerEventSystem 组件,每个玩家都可以有自己的一组操作来驱动自己的 UI 实例。
如果您正在使用 PlayerInput 组件,还可以设置 PlayerInput 以自动配置玩家的 InputSystemUIInputModule 以使用玩家的操作
MultilayerEventSystem 组件的属性与事件系统中的属性相同
此外,MultiplayerEventSystem 组件还添加了一个 PlayerRoot 属性,您可以将其设置为一个游戏对象,该游戏对象包含此事件系统应在其层次结构中处理的所有 UI 可选择项
(三)On-Screen 组件相关
On-Screen 组件可以模拟 UI 和用户操作的交互
InputDebug 顾名思义是输入调试器的意思,我们可以通过输入调试窗口检测输入相关信息
当我们的输入不按预期工作时,可以通过它来排查问题
->
Analysis(分析) ->
Input Debugger(输入调试器)->
Open Input DebuggerAdd Devices Not Listed in Supported Devices:添加未在支持的设备中列出的设备
Enable Event Diagnostics:启用事件诊断
Simulate TOuch Input From Mouse or pen:模拟鼠标或笔的触摸输入
Remote Devices:远程设备
Devices:系统中当前所有输入设备列表
Layouts:设备布局列表
所有已注册的设备控制列表
Settings:设置相关
默认的一些特殊输入设置
Metrics:指标相关
添加未在支持的设备中列出的设备