相信各位自学入门的都不免受到C#一些高级特性的困扰,网上的教程都讲得十分详细,导致自己没有看下去的欲望。
这篇文章将会尽量采用贴合零基础初学者的语言,达到委托与事件的入门理解,至于更复杂的应用这里就不多讲了。
Unity是一款采用c#的游戏引擎,那么他的一些高级特性一定会或多或少与我们平时见过的游戏类似,委托与事件就是如此。
委托 ,即Delegation,相当于RPG游戏中的主城任务板,你定义的一些函数,相当于任务板上贴着的的任务纸条。
我们直接从例子入手:
using UnityEngine;
public delegate void DelegationBoard();
//创建一个任务板的"概念",并非实例,不可以直接用
public class TestDraft : MonoBehaviour
{
public DelegationBoard delegateBoard;
//让任务板实例化,可以指定实例使用(添加,删除任务)
public void ClearBoard()
{
if (delegateBoard != null)
{
delegateBoard();
}
}
//调用这个方法的时候,如果任务板上有任务,就会完成任务板上的所有任务
public void AddTask()
{
delegateBoard += SomeTask;
}
//调用这个方法的时候,会在任务板上添加一个任务
public void RemoveTask()
{
delegateBoard -= SomeTask;
}
//调用这个方法的时候,会在任务板上删除一个任务
public void SomeTask()
{
//这里是“任务”的详细内容
}
private void Start()
{
AddTask();
//结果:添加了一个SomeTask
AddTask();
//结果:添加了一个SomeTask
RemoveTask();
//结果:移除了一个SomeTask
ClearBoard();
//结果:完成了任务板上仅有的一个SomeTask
}
}
正如注释中写着的,委托就好像一个任务板,函数就是一个个任务。委托存在的某些意义,就是把很多函数存到一个盒子里面,然后调用一个Box()的方法,一口气调用盒子里的所有方法。
事件也是同理:
public event DelegationBoard delegateBoardEvent;
public DelegationBoard delegateBoard;
//让任务板实例化,可以指定实例使用(添加,删除任务)
唯一的区别在于event在外部类中无法直接使用=赋值,也就是说event不能在除了自己声明的那个类里使用=号直接赋值,只能使用+=和-=,这样就避免了其他类中赋值导致任务板被清空,上面的任务都丢失了而没有被执行。也就是相当于event让自己所处的类成为了管理员,只有管理员可以拆除这个任务板,让所有尚未完成的任务被撤出,其他类就相当于玩家,玩家只有发布和删除任务的权限。
至于所谓的Func和Action,这只是Unity帮我们定做的一些特殊任务板。
总而言之,委托、事件、Func、Action云云,都可以抽象类比成任务板,带着这个想法,再去理解他和函数指针的相似性,以及委托的一些进阶用法,大概也会更加轻松