2022-09-09 Unity InputSystem5——PlayerInput

一、PlayerInput 介绍

​ PlayerInput 是 InputSystem 提供的专门用于接受玩家输入来处理自定义逻辑的组件

​ 主要工作原理:

  1. 配置输入文件(InputActions 文件)
  2. 通过 PlayerInput 关联配置文件,它会自动解析该配置文件
  3. 关联对应的响应函数,处理对应逻辑

​ 好处:

  • 不需要自己进行相关输入的逻辑书写
  • 通过配置文件即可配置想要监听的对应行为
  • 让我们专注于输入事件触发后的逻辑处理
image-20220909005915085
  1. Actions:行为
    一套输入动作和玩家相关联,帮助我们监听一些按键的输入

    • Default Control Scheme:默认启用哪一个控制方案
    • Default Actions Map:默认启用哪一个行为映射方案
  2. Camera:关联摄像机,当分屏设置时才需修改此选项

  3. Behavior:如何通知游戏对象上执行对应逻辑

    • SendMessage:将逻辑脚本挂载在和 Playerlnput 同一对象上,会通过 SendMessage 通知执行对应函数
    • BroadcastMessage:将逻辑脚本挂载在其自身或子对象上。会通过 BroadcastMessage 通知执行对应函数
    • Invoke UnityEvent Actions:通过拖拽脚本关联函数指明想要执行的函数逻辑
    • Invoke CSharp Events:通过 C# 事件监听处理对应逻辑,通过获取 PlayerInput 进行事件监听

二、PlayerInput 行为模式

(一)Send Messages

​ 在自定义脚本中,申明名为 “On+行为名” 的函数,没有参数或者参数类型为 InputValue

​ 将该自定义脚本挂载到 PlayerInput 依附的对象上,当触发对应输入时 会自动调用函数,并且还有默认的 3 个和设备相关的函数可以调用

扫描二维码关注公众号,回复: 14527252 查看本文章
  • 设备注册(当控制器从设备丢失中恢复并再次运行时会触发):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<Vector2>()

// 3.当触发输入时会自动触发事件调用对应函数

三、PlayerInputManager

​ PlayerInputManager 组件主要是用于管理本地多人输入的输入管理器,它主要管理玩家加入和离开

(一)面板参数

image-20220909013634153
  1. Norification Behavior:当玩家进入时 PlayerInputManager 如何通知关联的对象

    它的工作方式和 PlayerInput 相同

  2. Join Behavior:玩家加入的机制

    • Join Players When Button Is Pressed:当有新设备加入按下任意键,或者而没有任何玩家时按下任意键
    • Join Players When Action Is Triggered:当有新设备加入按下指定按键触发玩家加入
    • Join Players Manually:不要自动加入玩家,需要自己手动加入玩家
  3. Player Prefab:挂在 PlayerInput 组件的游戏对象

  4. Joining Enabled By Default:启用后,新加玩家按照 JoinBehavior 的规则加入

  5. Limit Number Of Players:启用后,可以限制加入游戏的玩家数量

    • Max Player Count:允许参加游戏的最大玩家数量
  6. Enable Split-Screen:如果启用,会自动为每个对象分配可用屏幕区域的一部分,用于多人游戏分屏

    • Maintain Aspect Ratio:假值使游戏能够生成屏幕区域,其纵横比与细分屏幕时的屏幕分辨率不同
    • Set Fixed Number:如果该值大于零,则 PlayerlnputManager 始终将屏幕分割为固定数量的矩形,而不考虑实际的玩家数量。
    • Screen Rectangle:可用于分配播放器拆分屏幕的规范化屏幕矩形

(二)PlayerInputManager使用

// 获取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)

image-20220909015918306
  1. Move Repeat Delay:生成初始 IMoveHandler 之间的初始延迟(秒)

    OnMove 导航事件,并在移动操作保持激活状态时生成重复的导航事件。

  2. Move Repeat Rate:移动动作保持激活时,生成重复导航事件之间的间隔(秒)

    请注意,这是由帧速率限制的;每帧不会有多个移动重复事件,因此,如果帧速率低于重复率,则有效重复率将低于此设置。

  3. XR Tracking Origin:XR 跟踪原点

  4. Deselect On Background CLick:

    默认情况下,当指针被点击并且没有击中任何游戏对象时,当前选择被清除。然而,这可能会妨碍键盘和游戏板导航,因为它们需要关闭当前选定的对象。要防止自动取消选择,请将此属性设置为 false。

  5. Pointer Behavior:如何处理将输入送入 UI 的多个指针

    • Single Mouse Or Pen BUt Multi Touch And Track

      对于未分类为触摸或跟踪输入的所有输入,其行为类似于单个统一指针,对于跟踪和触摸输入,其行为类似于所有指针。

      例如,如果在鼠标和笔上接收到并发输入,则将两者的输入馈送到同一 UI 指针实例中。其中一个的位置输入将覆盖另一个的位置。

      请注意,当从触摸或跟踪设备接收到输入时,鼠标和笔的单个统一指针将被删除,包括在鼠标 / 笔光标当前悬停在对象上时发送的 IPointerExit 事件。

    • Single Unified Pointer

      所有指针输入都是统一的,因此只有一个指针。这包括触摸和跟踪输入。

      例如,这意味着,无论有多少设备将输入输入输入点,只有帧中最后一个这样的输入才会生效并成为当前 UI 指针的位置。

    • All Pointers As Is

      UI 输入模块不会统一任何指针输入。任何设备,包括提供输入指针类型动作的触摸和跟踪设备,都将是其自己的指针(或触摸输入的多个指针)。

      注意:这可能意味着 UI 中将有任意数量的指针,并且可能同时指向多个对象。

  6. 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 组件

image-20220909021204935

(二)多人游戏使用多套 UI

​ 如果同一设备上的多人游戏,每个人想要使用自己的一套独立 UI,需要将 EventSystem 中的 EventSystem 组件替换为 Multiplayer Event System 组件

image-20220909021252910

​ 与 EventSystem 组件不同,可以在场景中同时激活多个 MultiplayerEventSystem。这样,您可以有多个玩家,每个玩家都有自己的 InputSystemUIInputModule 和 MultiplayerEventSystem 组件,每个玩家都可以有自己的一组操作来驱动自己的 UI 实例。

​ 如果您正在使用 PlayerInput 组件,还可以设置 PlayerInput 以自动配置玩家的 InputSystemUIInputModule 以使用玩家的操作
MultilayerEventSystem 组件的属性与事件系统中的属性相同

​ 此外,MultiplayerEventSystem 组件还添加了一个 PlayerRoot 属性,您可以将其设置为一个游戏对象,该游戏对象包含此事件系统应在其层次结构中处理的所有 UI 可选择项

(三)On-Screen 组件相关

​ On-Screen 组件可以模拟 UI 和用户操作的交互

  1. On-Screen Button:按钮交互
  2. On-Screen Stick:摇杆交互

五、InputDebug

​ InputDebug 顾名思义是输入调试器的意思,我们可以通过输入调试窗口检测输入相关信息

​ 当我们的输入不按预期工作时,可以通过它来排查问题

  1. Window(窗口) -> Analysis(分析) -> Input Debugger(输入调试器)
  2. PlayerInput组件 -> Open Input Debugger
image-20220909022310391
  1. Add Devices Not Listed in Supported Devices:添加未在支持的设备中列出的设备

  2. Enable Event Diagnostics:启用事件诊断

  3. Simulate TOuch Input From Mouse or pen:模拟鼠标或笔的触摸输入

  4. Remote Devices:远程设备

  5. Devices:系统中当前所有输入设备列表

    • Unsupported:不支持、无法识别的设备列表
  6. Layouts:设备布局列表

    所有已注册的设备控制列表

    • Abstract Devices:抽象设备
    • Specific Devices:特定设备
  7. Settings:设置相关

    默认的一些特殊输入设置

  8. Metrics:指标相关

添加未在支持的设备中列出的设备

猜你喜欢

转载自blog.csdn.net/zheliku/article/details/126775310
09