Unity进阶-InputSystem
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;
}
}
};