【Unity基于C#事件委托机制,最轻松易懂的版本,一个实例解决你的困惑】
程序员文章站
2022-05-06 11:29:05
...
PS:题主涉世尚浅,如有不对的地方还请大佬指出~
对于C#的委托和事件机制,看似复杂抽象,但其逻辑条理十分清晰,所以理解起来也不会太难,关键在于了解它两的联系,以及工作原理。
委托
观察者模式:
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
什么是委托:
C#语言通过委托来实现回调函数的机制,而回调函数是一种很有用的编程机制,可以被广泛的用在观察者模式中。
委托的作用:
实现unity消息机制,回调函数。
事件
事件机制广泛应用于mvc模式中,灵活的事件机制能够弥补Unity中的一些缺陷,比如协程的执行。因为协程不能返回值,也不能通过out或者ref传递。通过事件机制,可以知道协程执行进度并且返回执行结果。
主摄像机挂载Controller
新建三个空物体,新建一个员工类Employee,分别挂在3个员工空物体上。
using UnityEngine;
using System.Collections;
public class Controller : MonoBehaviour {
public static Controller _instance;
public delegate void OnClikEvent(int money); //定义委托 OnClikEvent是公司HR发的聚餐活动公告 ,只要愿意去的必须缴纳money元的费用
public event OnClikEvent OnClik; //定义事件 OnClik是一个基于本次活动的签到表,只要签到了就表示要去这次聚餐活动,就得缴纳费用。
void Awake()
{
_instance = this;
}
void Update () { //收钱
if (Input.GetKeyDown(KeyCode.Space))
{ //按下空格键,表示HR在这里进行统一收钱,收所有已经签到了的同事的钱。(也就是已经注册OnClik事件的付款方法)。
if (OnClik!=null){//OnClik相当于一个集合,每一个注册OnClik的方法都成为它的元素。
OnClik(100); //HR规定收款金额
Debug.Log("收款完毕!");
}
}
}
}
Employee类
using UnityEngine;
using System.Collections;
using System;
public class Employee : MonoBehaviour { //员工类
[SerializeField]private new string name; //员工名字
void Start () {
Controller._instance.OnClik +=PayOnEvent; //注册事件,当前员工报名填表了
}
void PayOnEvent(int money) //付钱的方法
{
Debug.Log("我是"+name+",成功付款:-"+money+" 元");
}
void OnDisable() //当被禁用或者被销毁时调用 //移除事件,当前员工反悔不去了。//那么小明不在OnClik事件中了,所以总部收不了他的钱
{
Controller._instance.OnClik -= PayOnEvent;
Debug.Log("我是" + name + ",我有事情就不去了!");
}
}
输出结果
移除2个员工
上一篇: PHP多文件上传类实例,