• 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 个和设备相关的函数可以调用

    • 设备注册(当控制器从设备丢失中恢复并再次运行时会触发):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.当触发输入时会自动触发事件调用对应函数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    三、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("离开了一个玩家"); };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    四、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:指标相关

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

  • 相关阅读:
    Python计算器(包含机制转换)
    基于SSM的外卖点餐系统设计与实现
    SpringCloud Alibaba
    1分钟 Serverless 极速搭建真网站 领猫超卡之《极速搭建 Zblog 博客系统》场景体验
    【LeetCode】【前K个高频单词】
    基于AI视觉的表面缺陷检测设备优势显著,加速制造业数智化转型
    踩坑ImageMagick将ios图片文件HEIC格式转jpg/png等
    【计算机网络】 TCP协议头相关知识点
    Python 操作pdf文件(pdfplumber读取PDF写入Excel)
    独立站卖家如何让消费者沉淀为私域流量
  • 原文地址:https://blog.csdn.net/zheliku/article/details/126775310