首页 > 编程语言 > 详细

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

时间:2021-05-01 20:47:22      阅读:35      评论:0      收藏:0      [点我收藏+]

目标

开发中遇到了点问题,用事件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方法取消订阅。

运行结果如下:
技术分享图片

参考资料

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

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

原文:https://www.cnblogs.com/OtusScops/p/14719928.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!