Unity 从零开始的框架搭建1-2 事件的发布-订阅-取消的小优化及调用对象方法总结[半干货]

该文章专栏是向QFrameWork作者凉鞋老师学习总结得来,吃水不忘打井人,不胜感激 

Unity 从零开始的框架搭建1-1 unity中对象调用的三种方式的优缺点分析【干货】-CSDN博客

原来 

其实就是对上一节的事件发布订阅类的小优化,原来是这样子的

public class EventCent : MonoBehaviour
{
    private static Action mOnEventTrigger;
 
    /// <summary>
    /// 注册事件
    /// </summary>
    public static void Register(Action onEvent) {
        mOnEventTrigger += onEvent;
    }
 
    /// <summary>
    /// 注销事件
    /// </summary>
    /// <param name="onEvent"></param>
    public static void UnRegister(Action onEvent) {
        mOnEventTrigger -= onEvent;
    }
 
    /// <summary>
    /// 触发事件
    /// </summary>
    public static void Trigger() {
        mOnEventTrigger?.Invoke();
    }
}

问题 

        问题来了,这个事件发布订阅的类在这个游戏里写成这样,那在别的游戏里是不是也可能要用 ?

所以就可以用泛型,泛型约束和继承的概念,直接做成一个工具类

C# & Unity 面向对象补全计划 泛型-CSDN博客

C# & Unity 面向对象补全计划 泛型约束-CSDN博客

C# & Unity 面向对象补全计划 之 初识继承方法与多态_unity 子类必须继承或重写-CSDN博客

        为什么用泛型?

          因为要拿来继承

        为什么要继承?

         因为你可以拓展你的方法,而不需要去修改EventCenter这个工具中的类

优化 

把这个类放到一个自己想要的命名空间里,我起名叫SimpleFrameWork 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace SimpleFrameWork {
    public class EventCenterPlus<T> where T: EventCenterPlus<T> {

        protected static Action mOnEventTrigger;

        /// <summary>
        /// 注册事件
        /// </summary>
        public static void Register(Action onEvent) {
            mOnEventTrigger += onEvent;
        }

        /// <summary>
        /// 注销事件
        /// </summary>
        /// <param name="onEvent"></param>
        public static void UnRegister(Action onEvent) {
            mOnEventTrigger -= onEvent;
        }

        /// <summary>
        /// 触发事件
        /// </summary>
        public static void Trigger() {
            mOnEventTrigger?.Invoke();
        }

    }
}

使用

你这个游戏想要用,

public  class TestEvent : EventCenterPlus<TestEvent>
 {
   //这个游戏中的逻辑
}

注册

  // Start is called before the first frame update
  void Start()
  {
      EventCenterPlus<TestEvent>.Register(SphereFun);
  }

触发 

 private void Start() {
     transform.Find("SphereCtrl").GetComponent<Button>().onClick.AddListener(EventCenterPlus<TestEvent>.Trigger);        
 }

销毁

  private void OnDestroy() {
      EventCenterPlus<TestEvent>.UnRegister(SphereFun);
  }

 总结

父节点调用子节点可以直接方法调用

子节点通知父节点用委托或事件

跨模块通信用事件

猜你喜欢

转载自blog.csdn.net/2301_77947509/article/details/142817027