Unity UGUI系列十 EventSystem 和Input输入事件

一、Event System

参考
【Unity学习笔记】事件系统EventSystem

第一次在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 启用此属性可强制此独立输入模块处于活动状态。
二、输入及虚拟轴

参考
unity --19 输入及虚拟轴

早期游戏开发时候,都选用这种模式,通过分别对鼠标或者键盘的按钮判断来执行:

  • 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 自上一帧这根手指屏幕位置变化,二维向量

你可能感兴趣的:(Unity UGUI系列十 EventSystem 和Input输入事件)