本来想写一大片篇幅来介绍的,不然怎么对得起这个标题,果然还是太懒了,直接上代码吧
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class UnityEventTest : MonoBehaviour
{
public UnityAction myAction;
public UnityEvent myEvent;
private void Start()
{
//添加监听方法1:将myAction和SendEvent1方法绑定
myAction = new UnityAction(SendEvent1);
//添加监听方法2:将myAction和SendEvent2方法绑定
myAction += SendEvent2;
//为Event添加监听者myAction
myEvent.AddListener(myAction);
//lamda表达式
myEvent.AddListener(() =>
{
LamdaEvent(1, 2);
}
);
}
void SendEvent1()
{
Debug.Log("new出来的UnityAction事件");
}
void SendEvent2()
{
Debug.Log("+=的监听事件");
}
public void SendEvent3()
{
Debug.Log("在面板上挂载的事件");
}
public void LamdaEvent(int i, int j)
{
Debug.Log("输出的是" + i + "和" + j);
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
//触发myEvent事件
myEvent.Invoke();
}
}
}
将此脚本挂载到GameObject上会出现这个面板
![](https://img.haomeiwen.com/i42761/7276ba5bac280d0f.png)
是不是很眼熟呢,这个就是UGUI中的Button点击事件会用到的UnityEvent事件系统。
在脚本中申明了UnityAction和UnityEvent两个类型的字段,UnityEvent相当于是发起了一个消息,而UnityEvent监听了UnityAction这个监听者,而Action又可以被SendEvent1和SendEvent2两个方法所监听,在代码中分别使用了两种方法进行监听绑定。一种就是直接new一个UnityAction出来,另外一种就是使用C#中的委托机制+=方法进行绑定。还有另外的一种绑定方法,就是在上图面板上点击加号,手动绑定公开的方法,就是跟绑定鼠标点击事件一样的方式。
最后要介绍的是UnityEvent监听的lamda表达式,用lamda表达式可以更方便自由得传入参数,添加更多逻辑。
虽然介绍了几种使用方式,但如何能更好的使用到项目中还是得好好思考一番。
网友评论