Unity3D 学习笔记8 —— UGUI控制和按钮的监听系统

一、UGUI简介:

        随着Unity原生UI系统UGUI日渐完善,如今在项目中使用UGUI相较于NGUI更为简单快捷,因为NGUI的基于深度(depth属性)层级管理机制和图集式图片管理(图集和散图必须同时存在,占用两倍空间)显然很繁琐而且灵活性差。

        图片管理:在UGUI中,虽然我们依然可以采用将散图打包成图集的方式来管理图集,但是大多数情况下,我们更倾向于通过代码动态地为每张散图创建一个与之绑定的prefab预设体,而不采用将多张图片打包成图集的形式。具体实现参考:UGUI研究院之全面理解图集与使用(三)

        层级管理:不同于NGUI基于深度属性的层级管理模式,在UGUI中,UI的显示与其渲染顺序有关,而其渲染顺序又取决于该组件在Hierarchy中的节点位置,绑在相同父节点上的两个子UI,位置靠前的优先进行渲染,故渲染次序在最后面的显示在最顶层。transform.SetSiblingIndexGetSiblingIndex就是设置与获取 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();
		if (listener == null) listener = go.AddComponent();
		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
        如此,我们只需在OnButtonClick中做对应每个按钮事件的处理就可以了。



你可能感兴趣的:(Unity3D游戏开发,Unity学习笔记)