一、Event System
第一次在Unity中创建UI元素时,总会自动生成一个EventSystem物体,它包含三个组件:Transform、EventSystem、Standalone Input Module。如果我们把它删除了,会发现UI上的事件(比如点击、拖拽)将不会被检测到。没错,它就是用来处理UI相关的事件的。
EventSystem基于输入给物体发送事件,它在整个事件系统中扮演的主要角色是:
- 管理被选中的物体
- 管理正在使用的Input Module
- 管理射线
-
根据需要更新所有Input Module
它相当于于一个管理者和通讯者,如果仅仅把此组件挂在一个游戏物体上是无效的,因为它还要结合其它组件一起使用。
image.png
1.First Selected
一开始默认选中的物体
2.Send Navigation Events
事件系统是否允许导航事件(移动/提交/取消)。如果取消了,按上下左右就不能切换选中项了。
3.Drag Threshold
拖拽操作的容限区域(以像素为单位)。
即鼠标当前帧和上一帧达到此值,才会响应拖拽事件
4.Standalone Input Module
Input Module是事件系统运行逻辑的主要所在,它主要用于:
- 处理输入
- 管理事件状态
- 发送事件给游戏物体
在EventSystem中,同一时刻只能激活一个Input Module,并且此组件必须挂载到EventSystem组件相同物体上才能有效。
在Inspector面板上,它的前四个属性是用来设置移动、提交和取消按钮的,Input Module会在这些按钮触发时将事件发送给选中的物体。这里的值要设置为Input Manager(Edit->Project Setting->Input Manager)面板中已有的值。
- Horizontal Axis 水平移动轴
- Vertical Axis 垂直移动轴
- Submit Button 提交按钮
- Cancel Button 取消按钮
- Input Actions Per Second 每秒的输入值个数
- Repeat Delay 每秒重复率生效前输入操作的延迟(秒)
- Force Module Active 启用此属性可强制此独立输入模块处于活动状态。
二、输入及虚拟轴
早期游戏开发时候,都选用这种模式,通过分别对鼠标或者键盘的按钮判断来执行:
- Input.GetMouseButton 系列: 判断鼠标,参数0是左键,参数1是右键
- Input.GetKey 系列: 判断键盘,参数可用keycode枚举
为了解决不同控制设备之间的差异(键盘左右,或者摇杆左右操作逻辑相同),再加上玩家有自定义按键的需求,因此unity建议不使用第一种传统输入法(代码写死了),而是提供了虚拟按键,即虚拟输入轴。这样脚本代码访问虚拟输入轴,而虚拟轴和真实的控制设备绑定,间接访问来达到统一兼容的目的。
Edit => project setting => input,点击input之后会在unity右 上角显示你要设置的新的输入轴所有的按键设置InputManager。
image.png
image.png
虚拟输入还有一个好处: 现代游戏的输入和早期游戏不太一样,早期游戏中,上,下,左,右等都是离散的状态,可以直接用0,1,2等表示;而现代游戏输入往往具有中间状态,比如轻触按钮是“走”,连续按住不放是“加速跑”,它需要形如0.1,0.3,0.5,1等多级梯度。使用unity的虚拟输入,哪怕是键盘也能模拟多级梯度,当我们按住“A”键时,这个键绑定的虚拟轴的值会逐渐从0增加到1。
-
bool Input.GetButton(“虚拟轴名”):该系列可读取虚拟轴,而不用关心真实绑定的键来源于鼠标,或者键盘,或者其他控制设备。它仅判断有没有键被按下或者抬起,无法判断方向是左,还是右。
-
float Input.GetAxis(“虚拟轴名”):即能判断有没有键被按下或者抬起,又能判断方向,返回值是一个-1到1之间的浮点数,值为0表示没有键被按下。[-1,0)表示有键被按下,方向左,(0,1]表示有键被按下,方向右。
-
Input.GetAxisRaw(“虚拟轴名”): 返回值是-1,0,1的离散值。
public class Axis : MonoBehaviour {
void Start () {
}
void Update () {
//Horizontal是控制水平方向的值,也就是x轴的值
//GetAxisRaw方法获取虚拟轴,当某键按下时会直接返回1或-1,没有变化过程
float x1 = Input.GetAxisRaw("Horizontal");
//GetAxis方法获取虚拟轴会有一个变化过程
float x2 = Input.GetAxis("Horizontal");
//Vertical是控制垂直方向的值,也就是z轴的值
float y = Input.GetAxis("Vertical");
//利用Translate方法来控制gameobject移动
transform.Translate(new Vector3(x1,0,y)*Time.deltaTime);
}
}
- Gravity:输入复位的速度,仅用于类型为键/鼠标的按键。
- Dead:任何小于该值的输入值(不论正负值)都会被视为0, 用于摇杆。
- Sensitivity:灵敏度,对于键盘输入,该值越大则响应时间越快,该值越小则越平滑。对于鼠标输入,设置该值会对鼠 标的实际移动距离按比例缩放。
- Snap:如果启用该设置,当轴收到反向的输入信号时,轴的数值会立即置为0,否则会缓慢的应用反向信号值。仅用 于键/鼠标输入。
- Invert:启用该参数可以让正向按钮发送负值,反向按钮发送正值。
三、键盘事件
返回bool值,传入参数是键名称或KeyCode值
Input.GetKey 某个键是否被持续按下
Input.GetKeyDown 某个键是否被按下
Input.GetKeyUp 某个键是否被弹起
if(Input.GetKey('a'))
{
}
if(Input.GetKey(KeyCode.A))
{
}
四、鼠标
返回bool值,传入参数0是左键/1是右键/2是中键
- Input.GetMouseButtonDown 当按钮按下
- Input.GetMouseButtonUp 当按钮抬起
- Input.GetMouseButton 某键被持续按下
Input.mousePosion 鼠标位置获取
if(Input.GetMouseButton(0))
{
GameObject Cube = GameObject.Find("Cube");
Cube.transform.localScale += new Vector3(1,1,1);
}
五、移动设备输入
Input.touchCount
最后一帧有多少根手指触碰。不同设备能追踪到的数量不同,苹果最多支持五根手指
Input.touches 存储每根手指状态的数组,可以通过索引来访问每根手指的一些信息
finggerId 触摸的唯一索引
position 这根手指当前所在的屏幕位置
deltaPosition 自上一帧这根手指屏幕位置变化,二维向量
网友评论