第1章: InputSystem概述
InputSystem概述
InputSystem是什么
InputSystem是Unity提供的一种新的输入系统
最新InputSystem的运行环境需要
Unity 2019.4 以上版本 + .NET 4 runtime
它相对于老的输入系统更具拓展性和可自定义的替代方案
简单来说:InputSystem是Unity提供的一套更好用更方便的用于检测键盘、
鼠标、手柄、摇杆等等设备输入的系统
InputSystem和InputManager的区别
老输入系统(InputManager):
我们需要自己写各种检测代码来判断设备输入,并处理对应逻辑
新输入系统(InputSystem):
不仅可以像老输入系统一样使用,还增加了输入配置的概念,新输入系统
将输入操作进行封装,让我们可以在Unity内进行输入配置文件编辑
我们不需要写代码来判断设备输入(输入判定直接在面板上配置),只需要把工作重心放在逻辑处理上
学习大纲
第2章: InputSystem知识点
第1节: 导入InputSystem
InputSystem导入
知识点一 InputSystem包导入
packageManager中导入Input System
知识点二 选择开启哪一种输入模式
选择InputSystem和 老InputManager的启用情况
File——>Build Setting——>Player Setting——>Other——>Active Input Handling
可以同时启用也可以只启用其中之一,每次启用后会重启Unity
当试图调用未被启用的某一项的API的时候,编译器并不会直接报错,而是运行的时候才会报错。
第2节: 代码检测输入
键盘输入
导入
新输入系统依然保留了代码检测输入的API让我们实现和老输入系统相同的操作。
还提供了一些额外的功能扩展,比如额外的回调函数和更多更标准化的不同操作仪器适配。
知识点一 获取当前键盘设备(需要引用命名空间)
新输入系统 提供了对应的输入设备类 帮助我们对某一种设备输入进行检测
如下面代码,就是获取用户当前使用的键盘输入设备类。
Keyboard keyBoard = Keyboard.current;
知识点二 单个按键 按下抬起长按
首先要得到某一个按键 通过键盘类对象 点出 各种按键 来获取
和老输入系统类似,通常会放到Update里面检测
//回车按下
if(keyBoard.enterKey.wasPressedThisFrame)
{
}
//D键抬起
if(keyBoard.dKey.wasReleasedThisFrame)
{
}
//空格长按
if(keyBoard.spaceKey.isPressed)
{
}
知识点三 通过事件监听按键按下
通过给keyboard对象中的 文本输入事件 添加委托函数
通过参数便可以获得每次输入的内容,并执行某些操作
keyBoard.onTextInput += (c) =>
{
print("通过lambda表达式" + c);
};
知识点四 任意键按下监听
可以处理 任意键 按下 抬起 长按 相关的逻辑
keyBoard.anyKey.wasPressedThisFrame
鼠标输入
知识点一 获取当前鼠标设备(需要引用命名空间)
Mouse mouse = Mouse.current;
知识点二 鼠标各键位 按下 抬起 长按
鼠标左键
mouse.leftButton
鼠标右键
mouse.rightButton
鼠标中键
mouse.middleButton
鼠标 向前向后键(某些鼠标拥有,通常位于侧面)
mouse.forwardButton;
mouse.backButton;
//左键按下
if(mouse.leftButton.wasPressedThisFrame)
{
}
//左键抬起
if(mouse.leftButton.wasReleasedThisFrame)
{
}
//右键长按
if(mouse.rightButton.isPressed)
{
}
知识点三 鼠标位置相关
获取当前鼠标位置
mouse.position.ReadValue();
得到鼠标两帧之间的一个偏移向量
mouse.delta.ReadValue();
鼠标中间 滚轮的方向向量
mouse.scroll.ReadValue();
触屏输入
知识点一 获取当前触屏设备
Touchscreen ts = Touchscreen.current;
由于触屏相关都是在移动平台或提供触屏的设备上使用
在windows运行获得的结果为null
所以在windows测试时最好做一次判空
知识点二 得到触屏手指信息
得到触屏手指数量
print(ts.touches.Count);
得到单个触屏手指
TouchControl tc = ts.touches[0];
得到所有触屏手指
foreach (var item in ts.touches)
{
}
知识点三 手指按下 抬起 长按 点击
//按下 抬起
if(tc.press.wasPressedThisFrame)
{
}
if(tc.press.wasReleasedThisFrame)
{
}
//长按
if(tc.press.isPressed)
{
}
//点击手势
if(tc.tap.isPressed)
{
}
连续点击次数
print(tc.tapCount);
知识点四 手指位置等相关信息
位置
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;
}
手柄输入
导入
手柄的样式不是完全固定的,主要主流可以分为ps,xbox和switch手柄。
不过他们的不同之处主要集中在左侧的布局和手柄右侧按键的符号。总体上的游戏按键设计思路其实大差不差,因此开发者对于游戏内的手柄设计经常可以三个类型互通,最多做点定制化。
知识点一 获取当前手柄
Gamepad gamePad = Gamepad.current;
如没有插入手柄会直接判定为null
知识点二 手柄摇杆
摇杆按下
右摇杆 按下抬起长按相关
gamePad.rightStickButton
左摇杆
gamePad.leftStickButton
2个键位都可以使用长按抬起的判定
摇杆方向
左摇杆
print(gamePad.leftStick.ReadValue());
右摇杆
print(gamePad.rightStick.ReadValue());
知识点三 手柄方向键
对应手柄上4个方向键 上下左右
gamePad.dpad.left
gamePad.dpad.right
gamePad.dpad.up
gamePad.dpad.down
4个键位都可以使用长按抬起的判定
知识点四 手柄右侧按键
通用
在不同类型的手柄上4个键位可能不同,这里Unity提供了通用的选择
上键
gamePad.buttonNorth
下键
gamePad.buttonSouth
右键
gamePad.buttonWest
左键
gamePad.buttonEast
4个键位都可以使用长按抬起的判定
指定键位
可以工具不同类型的手柄进行指定键位的设置
○
gamePad.circleButton
△
gamePad.triangleButton
□
gamePad.squareButton
X
gamePad.crossButton
x
gamePad.xButton
a
gamePad.aButton
b
gamePad.bButton
Y
gamePad.yButton
都可以使用长按抬起的判定
知识点五 手柄中央按键
中央键
gamePad.startButton
gamePad.selectButton
wasPressedThisFrame
wasReleasedThisFrame
都可以使用长按抬起的判定
知识点六 手柄肩部按键
左右前方肩部键
gamePad.leftShoulder
gamePad.rightShoulder
左右后方触发键
gamePad.leftTrigger
gamePad.rightTrigger
肩部键位都可以使用长按抬起的判定
其它输入
知识点一 新输入系统中的输入设备类
常用
Keyboard—键盘
Mouse—鼠标
Touchscreen—触屏
Gamepad—手柄
其它
Joystick—摇杆
Pen—电子笔
Sensor(传感器)
Gyroscope—陀螺仪
GravitySensor—重力传感器
加速传感器
光照传感器
等等
可以前往:
传感器支持 |输入系统 |1.2.0 (unity3d.com)
查看
知识点二 关于没有细讲的设备
对于我们没有细讲的设备
平时在开发中不是特别常用
如果想要学习他们的使用
最直接的方式就是看官方的文档
或者直接进到类的内部查看具体成员
通过查看变量名和方法名即可了解使用方式
知识点三 注意事项
新输入系统的设计初衷就是想提升开发者的开发效率
我们不提倡写代码来处理输入逻辑
之后我们学了配置文件相关知识后
都是通过配置文件来设置监听(监视窃听)的输入事件类型
我们只需要把工作重心放在输入触发后的逻辑处理
所以我们目前讲解的知识都是为了之后最准备
实际开发中使用较少
第3节: InputAction类
InputAction类
知识点一 InputAction是什么?
顾名思义,InputAction是InputSystem帮助我们封装的输入动作类
它的主要作用,是不需要我们通过写代码的形式来处理输入
而是直接在Inspector窗口编辑想要处理的输入类型
当输入触发时,我们只需要把精力花在输入触发后的逻辑处理上
我们在想要用于处理输入动作的类中
申明对应的InputAction类型的成员变量(注意:需要引用命名空间UnityEngine.InputSystem)
知识点二 InputAction参数相关
知识点三 InputAction的使用
1.设置InputAction公共变量,并在外部编辑。
public InputAction move;
2.需要调用的时候,启用输入检测
move.Enable();
3.操作监听相关
这些时间的触发时机由外部对公共变量move的编辑决定
可以根据需求自己定制,定制内容请参考下文知识点四的特殊输入规则设置。
//开始操作
move.started += TestFun;
private void TestFun(InputAction.CallbackContext context)
{
print("开始事件调用");
}
//真正触发
move.performed += (context) =>
{
print("触发事件调用");
};
//结束操作
move.canceled += (context) =>
{
print("结束事件调用");
};
补充:回调参数Context的关键参数
move.performed += (context) =>
{
//当前状态
//没有启用 Disabled
//等待 Waiting
//开始 Started
//触发 Performed
//结束 Canceled
//context.phase
print(context.phase);
//动作行为信息
print(context.action.name);
//控件(设备)信息
print(context.control.name);
//获取返回的某个类型的值
context.ReadValue<float>
//持续时间
print(context.duration);
//开始时间
print(context.startTime);
};
知识点四 特殊输入设置
设置特殊输入规则
当绑定了一个键位后,你可以在interactions部分选择一个触发的类型,比如长按,快速点击等特殊输入,不同的特殊输入类型决定了三种委托函数会在何种时机触发,具体差别可以参考知识点2里面的特殊输入参数。
这个设置可以针对里面的某个键位单独设置,也可以通过inputaction旁边的齿轮进行全局设置,全局设置后会作用到所有的键位上面。
Input System 基础设置(一些默认值设置)
特殊输入设置里面的默认参数是可以改变的,我们可以通过Edit->Project Setting->Input System Package进行设置,在大量创建配置文件的时候会省去一些时间。