Unity3D 学习笔记8 —— UGUI控制和按钮的监听系统
2016-04-12 10:43
666 查看
一、UGUI简介:
随着Unity原生UI系统UGUI日渐完善,如今在项目中使用UGUI相较于NGUI更为简单快捷,因为NGUI的基于深度(depth属性)层级管理机制和图集式图片管理(图集和散图必须同时存在,占用两倍空间)显然很繁琐而且灵活性差。
图片管理:在UGUI中,虽然我们依然可以采用将散图打包成图集的方式来管理图集,但是大多数情况下,我们更倾向于通过代码动态地为每张散图创建一个与之绑定的prefab预设体,而不采用将多张图片打包成图集的形式。具体实现参考:UGUI研究院之全面理解图集与使用(三)
层级管理:不同于NGUI基于深度属性的层级管理模式,在UGUI中,UI的显示与其渲染顺序有关,而其渲染顺序又取决于该组件在Hierarchy中的节点位置,绑在相同父节点上的两个子UI,位置靠前的优先进行渲染,故渲染次序在最后面的显示在最顶层。transform.SetSiblingIndex
和 GetSiblingIndex就是设置与获取 GameObject在兄弟节点的位置,具体实现参考:UGUI研究院之UI的深度学习(二)
二、控制和按钮的监听:
UGUI中事件触发的基类是UnityEngine.EventSystem.EventTrigger,我们可以通过继承自此基类来扩展设置我们自己的监听系统。监听系统的原理很简单,就是声明各种事件的委托,然后将指定事件的处理函数通过赋值方式绑定到对应的委托上,具体实例代码如下:
随着Unity原生UI系统UGUI日渐完善,如今在项目中使用UGUI相较于NGUI更为简单快捷,因为NGUI的基于深度(depth属性)层级管理机制和图集式图片管理(图集和散图必须同时存在,占用两倍空间)显然很繁琐而且灵活性差。
图片管理:在UGUI中,虽然我们依然可以采用将散图打包成图集的方式来管理图集,但是大多数情况下,我们更倾向于通过代码动态地为每张散图创建一个与之绑定的prefab预设体,而不采用将多张图片打包成图集的形式。具体实现参考:UGUI研究院之全面理解图集与使用(三)
层级管理:不同于NGUI基于深度属性的层级管理模式,在UGUI中,UI的显示与其渲染顺序有关,而其渲染顺序又取决于该组件在Hierarchy中的节点位置,绑在相同父节点上的两个子UI,位置靠前的优先进行渲染,故渲染次序在最后面的显示在最顶层。transform.SetSiblingIndex
和 GetSiblingIndex就是设置与获取 GameObject在兄弟节点的位置,具体实现参考:UGUI研究院之UI的深度学习(二)
二、控制和按钮的监听:
UGUI中事件触发的基类是UnityEngine.EventSystem.EventTrigger,我们可以通过继承自此基类来扩展设置我们自己的监听系统。监听系统的原理很简单,就是声明各种事件的委托,然后将指定事件的处理函数通过赋值方式绑定到对应的委托上,具体实例代码如下:
using UnityEngine; using System.Collections; using UnityEngine.EventSystems; public class EventTriggerListener : EventTrigger { public delegate void VoidDelegate (GameObject go); public VoidDelegate onClick; public VoidDelegate onDown; public VoidDelegate onEnter; public VoidDelegate onExit; public VoidDelegate onUp; public VoidDelegate onSelect; public VoidDelegate onUpdateSelect; public VoidDelegate onBeginDrag; static public EventTriggerListener Get (GameObject go) { EventTriggerListener listener = go.GetComponent<EventTriggerListener>(); if (listener == null) listener = go.AddComponent<EventTriggerListener>(); return listener; } public override void OnPointerClick(PointerEventData eventData) { if(onClick != null) onClick(gameObject); } public override void OnPointerDown (PointerEventData eventData){ if(onDown != null) onDown(gameObject); } public override void OnPointerEnter (PointerEventData eventData){ if(onEnter != null) onEnter(gameObject); } public override void OnPointerExit (PointerEventData eventData){ if(onExit != null) onExit(gameObject); } public override void OnPointerUp (PointerEventData eventData){ if(onUp != null) onUp(gameObject); } public override void OnSelect (BaseEventData eventData){ if(onSelect != null) onSelect(gameObject); } public override void OnUpdateSelected (BaseEventData eventData){ if(onUpdateSelect != null) onUpdateSelect(gameObject); } public override void OnBeginDrag(PointerEventData eventData){ if(onBeginDrag != null) onBeginDrag(gameObject); } public override void OnEndDrag(PointerEventData eventData) { } public override void OnDrag(PointerEventData data) { } }假如需要监听其他事件,只需要按照需求拓展EventTriggerListener类即可。具体在项目中,我们调用的方式如下:
using UnityEngine; using System.Collections; using UnityEngine.UI; public class ModelController : MonoBehaviour { Button button_run,button_walk, button_attack; // Use this for initialization void Start () { button_run = transform.FindChild("Button_run").GetComponent<Button>(); button_walk = transform.FindChild("Button_walk").GetComponent<Button>(); button_attack = transform.FindChild("Button_attck").GetComponent<Button>(); EventTriggerListener.Get(button_run.gameObject).onClick = OnButtonClick; EventTriggerListener.Get(button_walk.gameObject).onClick = OnButtonClick; EventTriggerListener.Get(button_attack.gameObject).onClick = OnButtonClick; } private void OnButtonClick(GameObject go) { //在这里监听按钮的点击事件 if (go == button_run.gameObject){ Debug.Log("button_run"); }else if (go == button_walk.gameObject){ Debug.Log("button_walk"); }else if (go == button_attack.gameObject){ Debug.Log("button_attack"); } } // Update is called once per frame void Update () { } }如此,我们只需在OnButtonClick中做对应每个按钮事件的处理就可以了。
相关文章推荐
- unity移动端内存优化——NGUI
- unity平台的预处理
- 碰撞检测之OBB-OBB的SweepTest
- Unity3D集成有米广告及友盟SDK
- Unity LayerMask用法
- Unity3D中的Texture2D纹理失真解决办法
- unity中用BMfont制作自定义美术中文字体
- Unity3D学习笔记(二)小地图的制作(UGUI)
- Unity3D去掉全屏时的屏幕黑边
- Unity 单例与实例的区别
- Unity+高通Vuforia SDK——AR
- UnityEditor 如何将一个资源文件夹下的对象拖曳赋值到文件夹外的某个对象组件属性中
- Unity导入素材解析不了的解决方法
- Unity3D
- Unity之通过Shader实现雪景
- Double Vision (Unity 5.0)
- Unity3D小功能 小技巧 小教程 小原理(持续更新...)
- [Unity] 导出Android APK包出错
- C# 类型实例化的语法糖--unity下诡异结果
- Unity IOS横版游戏 SplashImage 闪屏旋转 成竖屏的问题