您的位置:首页 > 移动开发 > Unity3D

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,我们可以通过继承自此基类来扩展设置我们自己的监听系统。监听系统的原理很简单,就是声明各种事件的委托,然后将指定事件的处理函数通过赋值方式绑定到对应的委托上,具体实例代码如下:

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中做对应每个按钮事件的处理就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: