首页 > 其他分享 >07. 泛型事件框架

07. 泛型事件框架

时间:2024-03-02 23:23:53浏览次数:20  
标签:BaseEventSO ScriptableObject 07 框架 baseEventSO listeners 事件 泛型 监听

事件监听和发布

我们要实现这样一个功能,当玩家在 Map 场景中点击一个图标的时候,需要发送事件给场景管理器,场景管理器监听事件,然后执行切换场景的操作

在勇士传说中,我们使用 ScriptableObject.UnityAction 发布事件,以及监听事件,那时候每种类型都有一个 ScriptableObject,非常繁琐。所以我们这次使用了泛型来简化代码编写

编写代码

目录结构

在 Scripts/Events 目录下,创建 Editor(用于扩展 Inspector 窗口)、MonoBehaviour(用于事件监听)、ScriptableObject(用于事件发布)

在 Game Data 目录下,创建 Events(用于创建事件)

ScriptableObject

首先,我们需要定义一个 BaseEventSO,代码如下

在 BaseEventSO 里面,定义了一个 UnityAction,用于事件发布和订阅。当发布者调用 RaiseEvent 的时候,就会通知订阅者,同时记下当前的发布者

然后需要定义一个 ObjectEventSO,用于传递 object 类型的事件

MonoBehaviour

和 ScriptableObject 一样,我们需要定义 BaseEventListener,用于监听事件。它的写法和勇士传说里很多监听者的写法一样,在OnEnable的时候注册事件监听,在OnDisable的时候注销事件监听,在事件产生的时候调用 UnityEvent 的 Invoke

同样我们也写一个监听 object 事件的类

Events

因为我们已经创建好 ObjectEventSO 了,所以我们可以创建一个 Event 出来,名字叫做LoadRoomEvent

在 RoomPrefab 里发布 LoadRoomEvent

在 SceneLoadManager 里面监听 LoadRoomEvent

当 RoomPrefab 发布事件的时候,SceneLoadManager 就能监听到这个事件,然后调用OnLoadRoomEvent方法

扩展 Inspector

如上图所示,当我们查看 LoadRoomEvent 的时候,可以看到消息的发布者,以及消息的订阅者。这是怎么实现的呢?

消息的发布者,其实在 ScriptableObject/BaseEventSO 里面已经实现了

消息的订阅者,代码比较复杂,我贴出来,大家看看就好

BaseEventSOEditor

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

[CustomEditor(typeof(BaseEventSO<>))]
public class BaseEventSOEditor<T> : Editor
{
    private BaseEventSO<T> baseEventSO;

    private void OnEnable() {
        if (baseEventSO == null)
        {
            baseEventSO = target as BaseEventSO<T>;
        }
    }

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        EditorGUILayout.LabelField($"订阅数量: {GetListeners().Count}");

        foreach (var listener in GetListeners())
        {
            EditorGUILayout.LabelField(listener.ToString());
        }
    }

    private List<MonoBehaviour> GetListeners()
    {
        List<MonoBehaviour> listeners = new List<MonoBehaviour>();

        if (baseEventSO == null || baseEventSO.OnEventRaised == null)
        {
            return listeners;
        }

        var subscribers = baseEventSO.OnEventRaised.GetInvocationList();
        foreach (var subscriber in subscribers)
        {
            var obj = subscriber.Target as MonoBehaviour;
            if (!listeners.Contains(obj))
            {
                listeners.Add(obj);
            }
        }

        return listeners;
    }
}

ObjectEventSOEditor

项目相关代码

代码仓库:https://gitee.com/nbda1121440/DreamOfTheKingdom.git

标签:20240302_1225

标签:BaseEventSO,ScriptableObject,07,框架,baseEventSO,listeners,事件,泛型,监听
From: https://www.cnblogs.com/hellozjf/p/18049448

相关文章

  • AT_arc083_b [ABC074D] Restoring Road Network 题解
    难度虚高,建议评橙/黄qwq。首先我们发现这是一道最短路问题,且\(N\le300\),于是采取floyd算法解决。具体地,我们分情况分类讨论。令我们当前枚举到的最短路径起点为\(i\),终点为\(j\),中转点为\(k\),输入的矩阵为\(dis\)。若\(dis_{i,j}>dis_{i,k}+dis_{k,j}\),则一定无......
  • nrf52832蓝牙开发踩过的坑-京鸿通信科技-15507589165
    转自:http://www.manongjc.com/detail/26-htjapkxksqidwuo.html本文章向大家介绍nrf52832蓝牙开发踩过的坑,主要包括nrf52832蓝牙开发踩过的坑使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。接触nrf52832芯片已经有一段时间了......
  • rewrk一个更现代的http框架基准测试实用程序
    引言    rewrk一个更现代的http框架基准测试实用程序。HTTP基准测试(HTTPbenchmarking)是一种测量和评估HTTP服务器或应用程序性能指标的活动。其目的是在特定条件下模拟大量用户请求,以测量服务器或应用程序的响应能力、吞吐量、延迟等指标,从而评估其性能表现。HTTP基准测试通......
  • 读人工不智能:计算机如何误解世界笔记07_自动驾驶
    1.      认知能力1.1.        认知能力是人工智能从一开始就面临的核心挑战1.2.        卡雷尔机器人1.2.1.          解决卡雷尔问题的关键在于提前了解障碍物的位置,并让卡雷尔绕过它们1.2.2.          人类程序员可以看到......
  • Java流程控制07:DoWhile循环
    DoWhile循环2.do...while循环2.1对于while语句而言,如果不满足条件,则不能进入循环。但有时候我们需要及时不满足条件,也至少执行一次2.2do...while循环和while循环相似,不同的是,do...while循环至少会执行一次语法:......
  • SC5307A SC5308A丨6 GHz射频下变频器
    产品简介:频率范围:100kHz至6GHz更多信息请加weixin-pt890111获取 SC5307A和SC5308A是高性能三级超外差下变频器,旨在满足诸如射频仪器,无线通信,卫星链路,软件定义无线电和信号智能等要求苛刻的应用。两个模块的输入射频频率范围为D至6GHz,可选IF带宽为80MHz,160MHz和320MHz。......
  • SC5407A SC5408A丨6 GHz射频上变频器
    产品简介:频率范围:100kHz至6GHz;在10kHz偏移,1GHz载波时,低残余相位噪声<-100dBc/Hz更多信息请加weixin-pt890111获取 SC5407A和SC5408A是高性能三级外差上变频器。输入射频频率范围从DC到6GHz,模块具有80MHz,160MHz和320MHz的可选IF带宽。每个模块都使用YIG振荡器作......
  • 07. 按键输入
    一、按键简介  常态下,独立按键是断开的,按下的时候才闭合。每个独立按键会单独占用一个IO口,通过IO口的高低电平判断按键的状态。但是按键在闭合和断开的时候,都存在抖动现象,即按键在闭合时不会马上就稳定的连接,断开时也不会马上断开。这是机械触点,无法避免。  按键抖动波......
  • 深入浅出Go语言:泛型入门指南
    深入浅出Go语言:泛型入门指南原创 麻凡 麻凡 2024-03-0109:00 湖南 听全文随着Go1.18版本的发布,泛型正式成为了Go语言的一部分。泛型为Go开发者带来了更强大的类型抽象能力,允许我们编写更加灵活和可复用的代码。本文将带你了解Go泛型的基础知识,让你快速上手这一新特......
  • 【STL和泛型编程】4. hashtable、unordered_set、unordered_map
    1.hashtable前置知识:【数据结构】3.跳表和散列 基本原理:将Key计算成一个数值,然后取余数得到它在表头中的位置table(篮子)里每个指针都指向一个链表(桶)来存储余数相同的值如果桶内的元素个数比篮子个数还多,则将篮子的大小扩充篮子是vector,数量是质数,初始为53,53扩充后为97......