InputSystem概述

1.InputSystem说明:Unity提供的新的用于检测玩家设备输入的系统,InputSystem让我们可以专注于功能逻辑开发,不用操心输入检测相关代码;

2.InputSystem导入说明:packageManager中导入Input System

3.InputSystem选择说明:导入InputSystem包后,老的输入系统会被禁用掉,可以在File——>Build Setting——>Player Setting——>Other——>Active Input Handling中可以同时启用也可以只启用其中之一,每次启用后会重启Unity;

InputSystem知识点

代码检测输入

1.代码直接监听的说明:这种观察者模式的监听方式和InputManager是基本类似的,但是这也就是InputManager的弊端,所以直接得代码检测方式对于InputSystem一般是简单做法或者是有特殊需求才使用的,新输入系统的设计初衷就是想提升开发者的开发效率,不提倡写代码来处理输入逻辑,之后我们学了配置文件相关知识后,都是通过配置文件来设置监听(监视窃听)的输入事件类型,我们只需要把工作重心放在输入触发后的逻辑处理;

键盘输入监听(Keyboard)

1.获取当前键盘设别
        //新输入系统 提供了对应的输入设备类 帮助我们对某一种设备输入进行检测
        //需要引用命名空间UnityEngine.InputSystem;
        Keyboard keyBoard = Keyboard.current;

2.单个按键监听
        //首先要得到某一个按键 通过键盘类对象 点出 各种按键 来获取
        //按下
        keyBoard.按键.wasPressedThisFrame
        //抬起
        keyBoard.按键.wasReleasedThisFrame
        //长按
        keyBoard.按键.isPressed
        //可以处理 任意键 按下 抬起 长按 相关的逻辑
        Keyboard.current.anyKey.监听类型(同上)

3.通过时间监听按键按下
        //通过给keyboard对象中的 文本输入事件 添加委托函数
        //便可以获得每次输入的内容
        keyBoard.onTextInput += (c) =>
        {
            print("通过lambda表达式" + c);
        };
        keyBoard.onTextInput += TextInput;

鼠标输入监听(Mouse)

1.获取当前鼠标设备(需要引用命名空间)
        Mouse mouse = Mouse.current;
        
2.鼠标各键位 按下 抬起 长按
        //鼠标左键
        mouse.leftButton.监听类型(同上)
        //鼠标右键
        mouse.rightButton.监听类型(同上)
        //鼠标中键
        mouse.middleButton.监听类型(同上)
        //鼠标 向前向后键
        mouse.forwardButton.监听类型(同上)
        mouse.backButton.监听类型(同上)

3.鼠标位置相关
        //获取当前鼠标位置(屏幕坐标)
        mouse.position.ReadValue();
        //得到鼠标两帧之间的一个偏移向量(其实就是获取鼠标滑动方向)
        mouse.delta.ReadValue();
        //鼠标中间 滚轮的方向向量
        mouse.scroll.ReadValue();

触屏输入监听(Touchscreen)

1.获取当前触屏设备
        Touchscreen ts = Touchscreen.current;
        //由于触屏相关都是在移动平台或提供触屏的设备上使用
        //所以在使用时最好做一次判空

2.得到触屏手指信息
        //得到触屏手指数量
        ts.touches.Count
        //获取指定单个索引手指
        TouchControl tc = ts.touches[0];
        //按下 抬起 长按 
        tc.press.监听类型(同上)
        //点击手势
        tc.tap.isPressed
        //连续点击次数
        tc.tapCount;

3.手指位置等相关信息
        //位置
        print(tc.position.ReadValue());
        //第一次接触时位置
        print(tc.startPosition.ReadValue());
        //接触区域大小
        tc.radius.ReadValue();
        //偏移位置
        tc.delta.ReadValue();

        //得到当前手指的 状态(阶段)
        UnityEngine.InputSystem.TouchPhase tp = tc.phase.ReadValue();
        switch (tp)
        {
            //无
            case UnityEngine.InputSystem.TouchPhase.None:
                break;
            //开始接触
            case UnityEngine.InputSystem.TouchPhase.Began:
                break;
            //移动
            case UnityEngine.InputSystem.TouchPhase.Moved:
                break;
            //结束
            case UnityEngine.InputSystem.TouchPhase.Ended:
                break;
            //取消
            case UnityEngine.InputSystem.TouchPhase.Canceled:
                break;
            //静止
            case UnityEngine.InputSystem.TouchPhase.Stationary:
                break;
            default:
                break;
        }

手柄输入监听(Gamepad)

1.获取当前手柄
        Gamepad gamePad = Gamepad.current;

2.手柄摇杆
        //摇杆方向
        //左摇杆
        gamePad.leftStick.ReadValue()
        //右摇杆
        gamePad.rightStick.ReadValue()
        //左遥感按键监听
        gamePad.leftStickButton.监听类型(同上)
        //右摇杆按键监听
        gamePad.rightStickButton.监听类型(同上)

3.手柄方向键
        //对应手柄上4个方向键 上下左右
        gamePad.dpad.left.监听类型(同上)
        gamePad.dpad.right.监听类型(同上)
        gamePad.dpad.up.监听类型(同上)
        gamePad.dpad.down.监听类型(同上)

4.手柄右侧按键
        //通用
        //Y、△
        //gamePad.buttonNorth
        //A、X
        //gamePad.buttonSouth
        //X、□
        //gamePad.buttonWest
        //B、○
        //gamePad.buttonEast

        //wasPressedThisFrame
        //wasReleasedThisFrame
        //isPressed

        //手柄右侧按钮 x ○ △ □ A B Y 
        //○
        //gamePad.circleButton
        //△
        //gamePad.triangleButton
        //□
        //gamePad.squareButton
        //X
        //gamePad.crossButton
        //x
        //gamePad.xButton
        //a
        //gamePad.aButton
        //b
        //gamePad.bButton
        //Y
        //gamePad.yButton

5.手柄中央按键
        //中央键
        //gamePad.startButton
        //gamePad.selectButton

        //wasPressedThisFrame
        //wasReleasedThisFrame
        //isPressed

6.手柄肩部按键
        //左上右上 肩部键位
        //左右前方肩部键
        //gamePad.leftShoulder
        //gamePad.rightShoulder

        //左右后方触发键
        //gamePad.leftTrigger
        //gamePad.rightTrigger

        //wasPressedThisFrame
        //wasReleasedThisFrame
        //isPressed

其他输入监听

1.其他类型说明:
        //其它
        //Joystick—摇杆
        //Pen—电子笔

        //Sensor(传感器)
        //https://docs.unity3d.com/Packages/com.unity.inputsystem@1.2/manual/Sensors.html#accelerometer
        //Gyroscope—陀螺仪
        //GravitySensor—重力传感器
        //加速传感器
        //光照传感器
        //等等

InputAction类

1.InputAction说明:顾名思义,InputAction是InputSystem帮助我们封装的输入动作类,它的主要作用,是不需要我们通过写代码的形式来处理输入,而是直接在Inspector窗口编辑想要处理的输入类型,当输入触发时,我们只需要把精力花在输入触发后的逻辑处理上;我们在想要用于处理输入动作的类中,申明对应的InputAction类型的成员变量(注意:需要引用命名空间UnityEngine.InputSystem);

InputAction使用API

1.启动输入检测
move.Enable();

2.操作监听相关
//开始操作
move.started += TestFun;
//真正触发
move.performed += (context) =>{};
//结束操作
move.canceled += (context) =>{};

3.关键参数CallbackContext
//当前状态
//没有启用 Disabled
//等待 Waiting
//开始 Started
//触发 Performed
//结束 Canceled
context.phase
//动作行为信息
context.action.name;
//控件信息
context.control.name;
//获取值
context.ReadValue<要获取的类型>;
//持续时间
context.duration;
//开始时间
context.startTime;

InputAction齿轮面板参数

1.Actions:输入动作设置,设置检测哪些输入
	Action Type:动作类型
		Value-值类型,主要用于状态连续更改的输入,例如鼠标的移动,手柄的遥感。如果有多个设备绑定这个Action,只会发送其中一个设备(最受控制的)的输入:
		Button:按钮类型,用于每次按下时触发的Action;
		Pass Through:直通类型,和Value一样,区别在于如果有多个设备绑定这个Action,会发送所有设备的输入;
	Control Type-控制类型,在这里选择对应的类型,之后在选择对应设备按键相关属性时,会根据你选择内容的不同,筛选对应内容,这上面显示的内容就是各设备属性的返回值类型,当你选择他们后,非选择的类型将不会在之后的按键设置中出现,很多内容我们基本用不到,相当于是在这里筛选输入设备:
		Any:任何指
		Analog:模拟值,浮点数
		Axis:一维轴浮点数,例如:摇杆输入返回值
		Bone:骨骼
		Digital:数字
		Double:浮点
		Dpad:4向按钮,例如:摇杆上的D-pad
		Eyes:VR相关数值
		Integer:整数
		Quaternion:四元数
		Stick:摇杆相关
		Touch:触屏相关
		Vector2:2维向量
		Vector3:3维向量

2.Interactions-相互作用设置,用于特殊输入,比如长按、多次点击等等,当满足条件时才会触发这个行为(设置长按时间、点击次数等等,3个事,开始started,触发performed,结束canceled):
		Hold:适用于需要输入设备保持一段时间的操作。当按钮按下会触发started,若在松开按钮前,按住时间大于等于Hold Time则会触发performed(时间一到就触发),否则触发canceled;
		Tap:和Hold相反,需要在一段时间内按下松开来触发。当按钮按下会触发started,若在Max Tap Duriation时间内(小于)松开按钮,触发performed,否则触发canceled;
		SlowTap:类似Hold,但是它在按住时间大于等于Max Tap Duriation的时候,并不会立刻触发performed,而是会在松开的时候才触发performed;
		MultiTap:用作于多次点击,例如双击或者三连击。Tap Count为点击次数,Max Tap Spacing为每次点击之间的间隔(默认值为 2 * Max Tap Duration)。Max Tap Duration为每次点击的持续时间,即按下和松开按钮的这段时间。当每次点击时间小于Max Tap Duration,且点击间隔时间小于Max Tap Spacing,点击Tap Count次,触发performed。
		Press可以实现类似按钮的操作
			Press Only:按下的时候触发started和performed。不触发canceled
			Release Only:按下的时候触发started,松开的时候触发performed
			Press And Release:按下的时候触发started和performed,松开的时候会再次触发started和performed。不触发canceled;
			Press Point:在Input System中,每个按钮都有对应的浮点值,例如普通的按钮,将会在0(未按下)和1(按下)之间。因此我们可以利用这个值(Press Point)来进行区分,当大于等于这个值则认为按钮按下了。

3.Processors-值处理加工设置,对得到的值进行处理加工:
		Clamp:将输入值钳制到[min..max]范围。
		Invert:反转控件中的值(即,将值乘以-1)。
		Invert Vector 2:反转控件中的值(即,将值乘以-1)。如果invertX为真,则反转矢量的x轴;如果invertY为真,则反转矢量的y轴。
		Invert Vector 3:反转控件中的值(即,将值乘以-1)。如果反转x为真,则反转矢量的x轴;如果反转y为真,则反转y轴;如果反转z为真,则反转z轴。
		Normalize:如果最小值>=零,则将[min..max]范围内的输入值规格化为无符号规格化形式[0..1],如果最小值<零,则将输入值规格化为有符号规格化形式[-1..1]。
		Normalize Vector 2:将输入向量规格化为单位长度(1)。
		Normalize Vector 3:将输入向量规格化为单位长度(1)
		Scale:将所有输入值乘以系数。
		Scale Vector 2:将所有输入值沿x轴乘以x,沿y轴乘以y。
		Scale Vector 3:将所有输入值沿x轴乘以x,沿y轴乘以y,沿z轴乘以z。
		Axis Deadzone:axis死区处理器缩放控件的值,使绝对值小于最小值的任何值为0,绝对值大于最大值的任何值为1或-1。许多控件没有精确的静止点(也就是说,当控件位于中心时,它们并不总是精确报告0)。在死区处理器上使用最小值可避免此类控件的无意输入。此外,当轴一直移动时,某些控件不一致地报告其最大值。在死区处理器上使用最大值可确保在这种情况下始终获得最大值。
		Stick Deadzone:摇杆死区处理器缩放Vector2控件(如摇杆)的值,以便任何幅值小于最小值的输入向量都将得到(0,0),而任何幅值大于最大值的输入向量都将规格化为长度1。许多控件没有精确的静止点(也就是说,当控件位于中心时,它们并不总是精确地报告0,0)。在死区处理器上使用最小值可避免此类控件的无意输入。此外,当轴一直移动时,某些控件不一致地报告其最大值。在死区处理器上使用最大值可确保在这种情况下始终获得最大值。

InputAction添加面板参数

1.Add Binding:添加新的输入绑定(单按键输入);

2.Add Positive\Negative Binding Or Add 1D Axis Composite(2019版本):添加1D轴组合(类似Input中的水平竖直热键,返回-1~1之间的一个值)
	Negative:负面按键,例如 0~-1
	Positive:正向按键,例如 0~1
	Composite Type:复合类型
	MinValue:最小值
	MaxValue:最大值
	Which Side Wins:哪一方获胜(当同时按下时如何处理)
		Neither:双方没有优先权,返回MinValue和MaxValue的中间值
		Positive:正面优先,返回maxValue
		Negative:负面优先,返回minValue

3.Add Up\Down\Left\Right Composite Or Add 2D Vector Composite(2019版本):添加2D向量组合(类似将Input中的水平竖直热键组合在一起,得到的Vector中的x,y分别表示两个轴)
	Up:上 ( 0 , 1 )
	Down:下 ( 0 , -1 )
	Left:左 ( -1 , 0 )
	Right:右 ( 1 , 0 )
	Composite Type:复合类型
	Mode:处理模式
		Analog:模拟值,浮点值
		Digital Normalized:单位化向量
		Digital:未单位化的向量

4.Add Up\Down\Left\Right\Forward\Backward Composite-添加3D向量组合:和2D类似;

5.Add Button With One Modifier Composite:添加带有一个复合修改器的按钮(可以理解为双组合键, 比如Ctrl+C、Ctrl+V)
	Modifier:复合输入内容
	Button:触发输入内容(举例:复制按键Ctrl+C,Ctrl为Modifier,C为Button)

6.Add Button With Two Modifier Composite-添加带有两个复合修改器的按钮(可以理解为三组合键,比如Ctrl+K+U):
	Modifier:复合输入内容
	Button:触发输入内容(举例:复制按键Ctrl+K+U,Ctrl为Modifier1,K为Modifier2,U为Button)

7.输入类型说明:
	Path:从哪个控件接受输入
	Usages:常用用法
	GamePad:游戏手柄
	Joystick:操纵杆
	Keyboard:键盘
	Mouse:鼠标
	Pen:笔
	Pointer:指针
	Sensor:传感器
	TouchScreen:触屏
	Tracked Device:履带装置
	XR Controller:XR 控制器
	XR HMD:XR 头戴显示器
	Other:其它

InputSystemPackage设置

1.UpdateMode:更新模式
	Process Events In Dynamic Update:在动态更新中处理事件
	Process Events In Fixed Update:在固定更新中处理事件
	Process Events Manually:手动处理事件
	
2.Background Behavior:后台行为
	Reset And Disable Non Background Devices:重置和禁用非后台设备
	Reset And Disable All Devices:重置和禁用所有设备
	Ignore Focus:忽略焦点
	
3.Filter Noise on .current:过滤当前设备的噪音

4.Compensate Orientation:定向补偿

5.Default Deadzone Min:默认死区最小值

6.Default Deadzone Max:默认死区最大值

7.Default Button Press Point:默认按钮按下点

8.Button Release Threshold:按钮释放阈值

9.Default Tap TIme:默认点击时间

10.Default Slow Tap Time:默认慢速点击时间

11.Default Hold Time:默认保持时间

12.Tap Radius:点击半径

13.MultTap Delay TIme:多次点击延迟时间

14.Supported Devices:支持的设备,如果希望输入系统支持其可以识别的所有输入设备,请将支持的设备保留为空;但是,如果您只对某一组设备感兴趣,那么在此处添加它们将缩小编辑器中显示的范围,并避免从与项目无关的设备获取输入;在此处添加设备时,任何未被分类为受支持的设备都将显示在输入调试器的“不受支持的设备”下;

15.Motion Usage:动作使用

16.Description:描述

17.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输入动作配置文件

1.输入配置文件说明:输入系统中提供了一种输入配置文件,你可以理解它是InputAction的集合,可以在一个文件中编辑多个InputAction的信息,里面记录了想要处理的行为和动作(也就是InputAction的相关信息),我们可以在其中自己定义 InputAction(比如:开火、移动、旋转等),然后为这个InputAction关联对应的输入动作,之后将该配置文件和PlayerInput进行关联,PlayerInput会自动帮助我们解析该文件,当触发这些InputAction输入动作时会以分发事件的形式通知我们执行行为;

2.创建输入配置文件:在Project窗口右键Create创建InputActions配置文件;

输入配置文件

1.(左边)ActionMaps:行动地图窗口,可以理解为配置文件中的行为分组配置,可以配置多套操作规范;

2.(中间)Actions 输入动作窗口,我们在这里可以创建各种InputAciton;

3.(右边)Properties 输入操作绑定的输入属性

4.(上方)工具栏-提供保存、搜索等功能按键:
	Add Control:设置控制方案:
		Gamepad:手柄
		Joystick:摇杆
		KeyboardMouse:键盘鼠标
		Touch:触屏
		XR:VR/AR等
	All Devices:设备选择,当切换了控制方案后,该控制方案可能是由多个设备配合控制,可以在这里进一步筛选对应设备
	Save Asset:保存配置按钮;
	Auto-Save:自动保存配置;
	搜索栏:可以搜索对应动作行为;

输入配置文件生成C#代码

1.根据配置文件生成C#代码:选择InputActions文件后,在Inspector窗口设置生成路径,类名,命名空间,应用后生成代码;

2.使用生成后的输入代码

1.创建生成的代码对象
input = new 类名();

2.激活输入
input.Enable();

3.事件监听
input.Input名.按钮名.performed += (context) =>{};

PlayerInput

1.PlayerInput说明:PlayerInput是InputSystem提供的,专门用于接受玩家输入来处理自定义逻辑的组件,选择任意对象(一般为一个玩家对象)为其添加PlayerInput组件即可,工作原理如下:

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

PlayerInput组件面板说明:

1.Actions-行为,一套输入动作和玩家相关联,帮助我们监听一些按键的输入:
	Default Control Scheme:默认启用哪一个控制方案
	Default Actions Map:默认启用哪一个行为映射方案

2.Camera:关联摄像机,当分屏设置时才需修改此选项

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

PlayerInputBehavior详细说明

1.Send Messages
        //在自定义脚本中
        //申明名为 "On+行为名" 的函数
        //没有参数 或者 参数类型为InputValue
        //将该自定义脚本挂载到PlayerInput依附的对象上
        //当触发对应输入时 会自动调用函数

        //并且还有默认的3个和设备相关的函数可以调用
        //设备注册(当控制器从设备丢失中恢复并再次运行时会触发):OnDeviceRegained(PlayerInput input)
        //设备丢失(玩家失去了分配给它的设备之一,例如,当无线设备耗尽电池时):OnDeviceLost(PlayerInput input)
        //控制器切换:OnControlsChanged(PlayerInput input)

2.Broadcast Messages	
        //基本和SendMessage规则一致
        //唯一的区别是,自定义脚本不仅可以挂载在PlayerInput依附的对象上
        //还可以挂载在其子对象下
        
3.Invoke Unity Events
        //该模式可以让我们在Inspector窗口上通过拖拽的形式关联响应函数
        //但是注意:响应函数的参数类型 需要改为 InputAction.CallbackContext
        
4.Invoke C Sharp Events
        //1.获取PlayerInput组件
        PlayerInput input = this.GetComponent<PlayerInput>();
        //手动获取需要的值,比如在Update中获取值
        input.currentActionMap["Move"].ReadValue<Vector2>()
        
        //2.获取对应事件进行委托函数添加
        input.onDeviceLost += OnDeviceLost;
        input.onDeviceRegained += OnDeviceRegained;
        input.onControlsChanged += OnControlsChanged;
        input.onActionTriggered += OnActionTrigger;
        
        //3.当触发输入时会自动触发事件调用对应函数
        //用Switch来集中处理
    public void OnActionTrigger(InputAction.CallbackContext context)
    {
        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;
        }
    }

PlayerInputManager

1.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:如果该值大于零,则PlayerInputManager始终将屏幕分割为固定数量的矩形,而不考虑实际的玩家数量。
	Screen Rectangle:可用于分配播放器拆分屏幕的规范化屏幕矩形

UGUI配合使用

1.InputSystem对UI的支持:新输入系统InputSystem不支持IMGUI(GUI)注意:编辑器代码不受影响,新输入系统支持UGUI,但是需要使用新输入系统输入模块(Input System UI Input Module),如果当前激活的是InputSystem,那么OnGUI中的输入判断相关内容不会被触发,你必须要选择Both或者只激活老输入系统InputManager才能让OnGUI中内容有用;

2.更多支持说明

UI 支持|输入系统|1.2.0 (unity3d.com)

Input System UI Input Module组件参数说明

1.Move Repeat Delay:生成初始IMoveHandler之间的初始延迟(秒)。OnMove导航事件,并在移动操作保持激活状态时生成重复的导航事件:

2.Move Repeat Rate:移动动作保持激活时,生成重复导航事件之间的间隔(秒)。请注意,这是由帧速率限制的;每帧不会有多个移动重复事件,因此,如果帧速率低于重复率,则有效重复率将低于此设置。

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

4.Pointer Behavior-如何处理将输入送入UI的多个指针:
	Single Mouse Or Pen BUt Multi Touch And Track:对于未分类为触摸或跟踪输入的所有输入,其行为类似于单个统一指针,对于跟踪和触摸输入,其行为类似于所有指针;例如,如果在鼠标和笔上接收到并发输入,则将两者的输入馈送到同一UI指针实例中;其中一个的位置输入将覆盖另一个的位置。请注意,当从触摸或跟踪设备接收到输入时,鼠标和笔的单个统一指针将被删除,包括在鼠标/笔光标当前悬停在对象上时发送的IPointerExit事件。
	Single Unified Pointer:所有指针输入都是统一的,因此只有一个指针。这包括触摸和跟踪输入。例如,这意味着,无论有多少设备将输入输入输入点,只有帧中最后一个这样的输入才会生效并成为当前UI指针的位置。
	All Pointers As Is:UI输入模块不会统一任何指针输入。任何设备,包括提供输入指针类型动作的触摸和跟踪设备,都将是其自己的指针(或触摸输入的多个指针);注意:这可能意味着UI中将有任意数量的指针,并且可能同时指向多个对象。
	
5.Actions Asset:包含控制UI的所有操作的输入操作资产。您可以使用以下属性选择资产中的哪些操作对应于哪些UI输入;默认情况下,这将引用名为DefaultInputActions的内置资产,该资产包含用于驱动UI的常见默认操作。如果要设置自己的操作,请创建自定义输入操作资源并在此处分配。在Inspector中将新资源引用指定给此字段时,编辑器会尝试根据常用命名约定自动将操作映射到UI输入。

6.Point:提供2D屏幕位置的动作。用作指向UI元素的光标,以实现鼠标样式的UI交互;设置为传递操作类型和向量2值类型。

7.Left Click:映射到用于与UI交互的主光标按钮的操作;设置为传递操作类型和按钮值类型。

8.Middle Click:映射到用于与UI交互的中间光标按钮的操作;设置为传递操作类型和按钮值类型。

9.Right Click:映射到用于与UI交互的辅助光标按钮的操作;设置为传递操作类型和按钮值类型。


10.Scroll Wheel:提供手势输入以允许在UI中滚动的操作;设置为传递操作类型和向量2值类型。

11.Move:一种操作,提供用于选择当前活动用户界面的二维矢量。这允许游戏板或箭头键样式的UI导航;设置为传递操作类型和向量2值类型

12.Submit:与当前选择的UI接触或“单击”的操作;设置为按钮动作类型。

13.Cancel:退出与当前选定UI的任何交互的操作;设置为按钮动作类型。

14.Tracked Position:提供一个或多个空间跟踪设备(如XR hand控制器)的3D位置的动作。结合跟踪设备方向,这允许通过指向空间中的UI可选择项进行XR样式的UI交互;设置为传递操作类型和向量3值类型。

15.Tracked Orientation:传递表示一个或多个空间跟踪设备(如XR hand控制器)旋转的四元数的操作。结合跟踪设备位置,这允许通过指向空间中的UI可选择项进行XR样式的UI交互;设置为传递操作类型和四元数值类型。

Multiplayer Event System多人组件说明

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

2.Multiplayer Event System组件说明:与EventSystem组件不同,可以在场景中同时激活多个MultiplayerEventSystem,这样,您可以有多个玩家,每个玩家都有自己的InputSystemUIInputModule和MultiplayerEventSystem组件,每个玩家都可以有自己的一组操作来驱动自己的UI实例,如果您正在使用PlayerInput组件,还可以设置PlayerInput以自动配置玩家的InputSystemUIInputModule以使用玩家的操作;MultilayerEventSystem组件的属性与事件系统中的属性相同,此外,MultiplayerEventSystem组件还添加了一个playerRoot属性,您可以将其设置为一个游戏对象,该游戏对象包含此事件系统应在其层次结构中处理的所有UI可选择项;

Tracked Device Raycaster组件配对VR中Canvas组件

1.使用条件说明:如果想在VR项目中使用新输入系统配合UGUI使用,需要在Canvas对象上添加Tracked Device Raycaster组件;

On-Screen组件(绝对重点)

1.使用说明:On-Screen组件可以模拟UI和用户操作的交互,如On-Screen Button用来按钮交互,On-Screen Stick用来摇杆交互

InputDebug

1.InputDebug说明:InputDebug顾名思义是输入调试器的意思,我们可以通过输入调试窗口检测输入相关信息,当我们的输入不按预期工作时,可以通过它来排查问题;

2.打开InputDebug窗口

  • 1.Window(窗口)->Analysis(分析)->Input Debugger(输入调试器)
  • 2.PlayerInput组件->Open Input Debugger

InputDebug窗口信息说明

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:系统中当前所有输入设备列表;

6.Unsupported:不支持、无法识别的设备列表;

7.Layouts:设备布局列表,所有已注册的设备控制列表;

8.Abstract Devices:抽象设备;

9.Specific Devices:特定设备;

10.Settings:设置相关,默认的一些特殊输入设置;

11.Metrics:指标相关,输入系统资源使用情况的统计信息;

知识补充

InputSystem专门任意键方案(改键)

1.方案说明:InputSystem.onAnyButtonPress.CallOnce((control) =>();

  • 如果用Call 按键盘会报错 但是也能正常执行;
  • 用CallOnce 只会执行一次 但是不会报错;

Json手动加载输入配置文件

string json = Resources.Load<TextAsset>("PlayerInputTest").text;
InputActionAsset asset = InputActionAsset.FromJson(json);

input.actions = asset;

input.onActionTriggered += (context) =>
{
    if(context.phase == InputActionPhase.Performed)
    {
        switch (context.action.name)
        {
            case "Move":
                print("移动");
                break;
            case "Look":
                print("看向");
                break;
            case "Fire":
                print("开火");
                break;
        }
    }
};

改键