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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • 输入事件(函数) •OnMouseEnter鼠标移入:鼠标移入到当前Collider 时调用。 •OnMouseO...
    Y_U_阅读 813评论 0 0
  • 任何游戏都应该提供给用户交互的方式,可以想象一个没有任何交互的游戏是什么样的。如果没有输入系统带来的,用户与游戏的...
    游戏开发小Y阅读 2,351评论 0 3
  • 一、Unity简介 1. Unity界面 Shift + Space : 放大界面 Scene界面按钮渲染模式2D...
    MYves阅读 8,149评论 0 22
  • 认输入轴: Horizontal 和 Vertical被映射到w, a, s, d键和方向键Fire1, Fire...
    _凉笙阅读 816评论 0 0
  • 原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 默认输入轴: Horizontal 和 Vertic...
    游戏开发小Y阅读 1,576评论 0 0