Unity事件
程序员文章站
2022-07-13 22:19:16
...
文章目录
前言
我们最常用到的就是unity的button组件,其实button组件所响应的事件为unity众多ui事件中的PointerClick事件,unity的ui事件如下图所示:
1.响应事件的方式
1.1 通过集成接口
在相关UI控件上挂脚本,脚本继承上图中相关事件对应的接口,并在接口函数中完成相应事件方法的实现即可。
1.2 添加EventTrigger组件
在UI上添加EventTrigger组件,点击AddNewEnvetType添加事件类型,即对应的UI事件,然后就可以挂载响应的方法。
PS:三维物体实现上述点击事件需要在Main Camera上挂载physics raycaster组件,然后在三维物体上挂载EventTrigger就可以实现相关方法方法
1.3 代码添加
需要在相关控件上添加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来实现。
2.UGUIEventListener
2.1 UGUIEventListener代码
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;
}
}
2.2 UGUIEventListener使用
给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");
}
}
}