unity UI事件
由于工作需要到持续按键,所以了解了一下unity UI事件,本文主要转载于http://www.cnblogs.com/zou90512/p/3995932.html?utm_source=tuicool&utm_medium=referral,并对相关问题进行解释。
我们最常用到的就是unity的button组件,其实button组件所响应的事件为unity众多ui事件中的PointerClick事件,unity的ui事件如下图所示:
实现响应事件有以下三种:
(一)在相关UI控件上挂脚本,脚本继承相关事件对应的接口,并在接口函数中完成相应方法的实现即可。
(二)在相关控件上添加EventTrigger组件,点击AddNewEnvetType添加事件类型,即对应的UI事件,然后就可以挂载响应的方法。
(三)便是在程序实现。第一步也需要在相关控件上添加EventTrigger组件,然后添加监听。代码如下
void Start() { var trigger = transform.gameObject.GetComponent<EventTrigger>(); if (trigger == null) trigger = transform.gameObject.AddComponent<EventTrigger>(); // 实例化delegates trigger.triggers = new List<EventTrigger.Entry>(); // 定义需要绑定的事件类型。并设置回调函数 EventTrigger.Entry entry = new EventTrigger.Entry(); // 设置 事件类型 entry.eventID = EventTriggerType.PointerClick; // 设置回调函数 entry.callback = new EventTrigger.TriggerEvent(); UnityAction<BaseEventData> callback = new UnityAction<BaseEventData>(OnScriptControll); entry.callback.AddListener(callback); // 添加事件触发记录到GameObject的事件触发组件 trigger.triggers.Add(entry); }
在此理解一下此段代码:我们要添加一个我们想要的事件,就需要对EventTrigger添加内容,添加的内容有两个,一个为事件类型,一个为对应事件实现的函数,或者说方法。
EventTrigger通过Entry类打包了这两个内容,eventID绑定事假类型,callback绑定事件对应的方法。通过unityaction定义相关委托以及绑定的方法,通过添加监听AddListener来实现。
由于在众多图片或者text上实现点击事件是则需要每一个都添加点击事件,比较麻烦,借鉴别人的EventListener来
using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; public class UGUIEventListener : EventTrigger { public UnityAction<GameObject> onClick; //可以重载EventTrigger的其他虚方法来实现点击拖动等事件 public override void OnPointerClick(PointerEventData eventData) { base.OnPointerClick(eventData); if(onClick != null) { onClick(gameObject); } } public static UGUIEventListener Get(GameObject go) { UGUIEventListener listener = go.GetComponent<UGUIEventListener>(); if (!listener) listener = go.AddComponent<UGUIEventListener>(); return listener; } }
给text和image添加事件
using UnityEngine; using UnityEngine.UI; public class UGUIButtonClick : MonoBehaviour { public Text textTitle; public Image imageTitle; private void Awake() { UGUIEventListener.Get(textTitle.gameObject).onClick = OnClick; UGUIEventListener.Get(imageTitle.gameObject).onClick = OnClick; } void OnClick(GameObject go) { if(go == textTitle.gameObject) { Debug.Log("Text clicked"); } else if(go == imageTitle.gameObject) { Debug.Log("Image clicked"); } } }
PS:三维物体实现上述点击事件需要在Main Camera上挂载physics raycaster组件,然后在三维物体上挂载EventTrigger就可以实现相关方法方法