其他分享
首页 > 其他分享> > 【unity2D】API-学习记录6-事件UnityEvent

【unity2D】API-学习记录6-事件UnityEvent

作者:互联网

目标

开发中遇到了点问题,用事件UnityEvent比较好解决,现在来学习UnityEvent的基本使用方法,以期解决问题。

前言

  1. UnityEvent的发展史大概是这样的:

 委托Delegate --> 事件(C#)Event --> 事件UnityEvent

  1. UnityEvent和C#Event在语法上有较大区别。

  2. UnityEvent在语法上完全脱离了Delegate,所以,即使不学Delegate,也能学UnityEvent。不过,要是学了Delegate和C#Event的话,理解UnityEvent会比较容易,建议都学。

是什么

参考博文C# Event/UnityEvent辨析第二个小标题下的解释,非常形象。

简单来讲,就是发布者(Publisher)。Event在特定时间发出一条信息,通知所有订阅者,使它们相应地执行各自动作。

使用步骤

代码相关

using UnityEngine;
using UnityEngine.Events;//引用命名空间

[System.Serializable]//序列化ZombieEvent,使其在Editor中显示,则可在Editor中选定订阅者
public class ZombieEvent : UnityEvent<string,int>{}
//这一步对应C#Event中的“定义委托类型”

public class EventTest : MonoBehaviour
{
   public ZombieEvent zombieEvent;
   //这一步对应C#Event中的“基于委托类型,定义事件”
   //这里的是实例事件,在上一篇中的是静态事件

	void Start()
	{
		if(zombieEvent == null)
		{
			zombieEvent = new ZombieEvent();//实例化
		}

		zombieEvent.Invoke("Zombies get into your yard.",6);//用Invoke发出通知
	}

}

using UnityEngine;

public class Pea : MonoBehaviour
{
	public EventTest MyZombieEvent;
	
	void OnEnable()
	{
		MyZombieEvent = GameObject.Find("EventTest").GetComponent<EventTest>();
		MyZombieEvent.zombieEvent.AddListener(PeaAttack); //订阅事件
	}

	void OnDisable()
	{
		MyZombieEvent.zombieEvent.RemoveListener(PeaAttack); //取消订阅
	}
	
	public void PeaAttack(string zombieAction,int zombieCount)//这一步对应C#Event中的“定义委托函数”
	{
		Debug.Log(zombieAction + "There are " + zombieCount + " zombies. Peas are attacking zombies.");
	}
}

using UnityEngine;

public class Cabbage : MonoBehaviour
{
	public EventTest MyZombieEvent;
	
	void OnEnable()
	{
		MyZombieEvent = GameObject.Find("EventTest").GetComponent<EventTest>();
		MyZombieEvent.zombieEvent.AddListener(CabbageAttack); //订阅事件
	}

	void OnDisable()
	{
		MyZombieEvent.zombieEvent.RemoveListener(CabbageAttack); //取消订阅
	}
	
	public void CabbageAttack(string zombieAction,int zombieCount)//这一步对应C#Event中的“定义委托函数”
	{
		Debug.Log(zombieAction + "There are " + zombieCount + " zombies. Cabbages are attacking zombies.");
	}
}

订阅事件的两种方法

  1. 用[System.Serializable]来序列化事件,使其在Editor中显示,则可在Editor中手动编辑订阅。

  2. 代码控制订阅。正如上面代码中所写:先获取到类的实例,再访问类中的事件。用AddListener方法进行订阅,RemoveListener方法取消订阅。

运行结果如下:
image

参考资料

【Unity3D API的学习与使用】Unity中的事件响应——UnityEvent
做游戏 - Unity技术与技巧 - 事件(Event)
C# Event/UnityEvent辨析

标签:zombieEvent,unity2D,C#,MyZombieEvent,Event,API,UnityEvent,public
来源: https://www.cnblogs.com/OtusScops/p/14719928.html