该文章专栏是向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);
}
总结
父节点调用子节点可以直接方法调用
子节点通知父节点用委托或事件
跨模块通信用事件