一、PlayerInput 介绍
? PlayerInput 是 InputSystem 提供的专门用于接受玩家输入来处理自定义逻辑的组件
? 主要工作原理:
- 配置输入文件(InputActions 文件)
- 通过 PlayerInput 关联配置文件,它会自动解析该配置文件
- 关联对应的响应函数,处理对应逻辑
? 好处:
- 不需要自己进行相关输入的逻辑书写
- 通过配置文件即可配置想要监听的对应行为
- 让我们专注于输入事件触发后的逻辑处理
-
Actions:行为 一套输入动作和玩家相关联,帮助我们监听一些按键的输入
- Default Control Scheme:默认启用哪一个控制方案
- Default Actions Map:默认启用哪一个行为映射方案
-
Camera:关联摄像机,当分屏设置时才需修改此选项 -
Behavior:如何通知游戏对象上执行对应逻辑
- SendMessage:将逻辑脚本挂载在和 Playerlnput 同一对象上,会通过 SendMessage 通知执行对应函数
- BroadcastMessage:将逻辑脚本挂载在其自身或子对象上。会通过 BroadcastMessage 通知执行对应函数
- Invoke UnityEvent Actions:通过拖拽脚本关联函数指明想要执行的函数逻辑
- Invoke CSharp Events:通过 C# 事件监听处理对应逻辑,通过获取 PlayerInput 进行事件监听
二、PlayerInput 行为模式
(一)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
PlayerInput input = this.GetComponent<PlayerInput>();
input.onDeviceLost += OnDeviceLost;
input.onDeviceRegained += OnDeviceRegained;
input.onControlsChanged += OnControlsChanged;
input.onActionTriggered += OnActionTrigger;
三、PlayerInputManager
? PlayerInputManager 组件主要是用于管理本地多人输入的输入管理器,它主要管理玩家加入和离开
(一)面板参数
-
Norification Behavior:当玩家进入时 PlayerInputManager 如何通知关联的对象 它的工作方式和 PlayerInput 相同 -
Join Behavior:玩家加入的机制
- Join Players When Button Is Pressed:当有新设备加入按下任意键,或者而没有任何玩家时按下任意键
- Join Players When 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:如果该值大于零,则 PlayerlnputManager 始终将屏幕分割为固定数量的矩形,而不考虑实际的玩家数量。
- Screen Rectangle:可用于分配播放器拆分屏幕的规范化屏幕矩形
(二)PlayerInputManager使用
PlayerInputManager.instance
PlayerInputManager.instance.onPlayerJoined += playerInput => { print("创建了一个玩家"); };
PlayerInputManager.instance.onPlayerLeft += playerInput => { print("离开了一个玩家"); };
四、UGUI 配合使用
? 新输入系统 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 和用户操作的交互
- On-Screen Button:按钮交互
- On-Screen Stick:摇杆交互
五、InputDebug
? InputDebug 顾名思义是输入调试器的意思,我们可以通过输入调试窗口检测输入相关信息
? 当我们的输入不按预期工作时,可以通过它来排查问题
- Window(窗口)
-> Analysis(分析) -> Input Debugger(输入调试器) - PlayerInput组件
-> Open Input Debugger
-
Add Devices Not Listed in Supported Devices:添加未在支持的设备中列出的设备 -
Enable Event Diagnostics:启用事件诊断 -
Simulate TOuch Input From Mouse or pen:模拟鼠标或笔的触摸输入 -
Remote Devices:远程设备 -
Devices:系统中当前所有输入设备列表
- Unsupported:不支持、无法识别的设备列表
-
Layouts:设备布局列表 所有已注册的设备控制列表
- Abstract Devices:抽象设备
- Specific Devices:特定设备
-
Settings:设置相关 默认的一些特殊输入设置 -
Metrics:指标相关
添加未在支持的设备中列出的设备
|