欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Unity基于C#事件委托机制,最轻松易懂的版本,一个实例解决你的困惑】

程序员文章站 2022-05-06 11:29:05
...

PS:题主涉世尚浅,如有不对的地方还请大佬指出~

对于C#的委托和事件机制,看似复杂抽象,但其逻辑条理十分清晰,所以理解起来也不会太难,关键在于了解它两的联系,以及工作原理。

委托

观察者模式:
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
什么是委托:
C#语言通过委托来实现回调函数的机制,而回调函数是一种很有用的编程机制,可以被广泛的用在观察者模式中。
委托的作用:
实现unity消息机制,回调函数。

事件
事件机制广泛应用于mvc模式中,灵活的事件机制能够弥补Unity中的一些缺陷,比如协程的执行。因为协程不能返回值,也不能通过out或者ref传递。通过事件机制,可以知道协程执行进度并且返回执行结果。


主摄像机挂载Controller
【Unity基于C#事件委托机制,最轻松易懂的版本,一个实例解决你的困惑】
新建三个空物体,新建一个员工类Employee,分别挂在3个员工空物体上。
【Unity基于C#事件委托机制,最轻松易懂的版本,一个实例解决你的困惑】

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 + ",我有事情就不去了!");

    }

}

输出结果
【Unity基于C#事件委托机制,最轻松易懂的版本,一个实例解决你的困惑】

移除2个员工
【Unity基于C#事件委托机制,最轻松易懂的版本,一个实例解决你的困惑】