[Unity] No.3 EventManager事件管理 与 观察者模式

这篇具有很好参考价值的文章主要介绍了[Unity] No.3 EventManager事件管理 与 观察者模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

EventManager事件管理

前文讲到了InputManager,在其后需要一个事件的管理者用于调度任务的执行,包括:
①查看发生了什么事;
②出事后看看都需要通知谁干什么事;
以上两个内容就对应了EventManager中关键的监听回调,而在讲EventManager之前还需要知道,它是符合观察者这一模式的。

1. 观察者模式

此处不会像第一篇文章那样子给出观察者的设计模式,因为后续会给出EventManager的一个样例代码,会更容易理解。只需知道的是,观察者模式是一对多的关系,多个观察者对象会同时监听一个主题对象,当主题对象的状态变化时,各个观察者会根据这一变化做出对应的行为。

举一个简单的例子学生们(观察者)在教室上课,当下课铃响了(主题对象状态改变),各个学生听到后会去完成自己课间需要做的事情,如:上厕所、打水、给对象发消息等等。

注意:下课铃就是上一篇文章中提到的InputManager发来的!

2. 回调函数

回调是一个过程,当一个函数被当作参数传入另一个目标函数,目标函数执行完后去执行被传入的这个函数这一过程即为回调,被当作参数的函数被称为回调函数。在EventManager中:
目标函数:监听的函数,等待消息到来,可理解为监听行为(等待下课铃),该函数执行完后(事件发生收到消息后),去执行之前传入的回调函数;
回调函数:当前listener监听到事件后去执行的函数,可理解为响应的行为(上厕所、打水、给对象发消息),回调函数一般事先已经定好了(想干什么早就打算好了,就等着时机到来);

3. 事件管理者

一个事件管理者的框架如下,主要:
①定义了回调函数,用delegate声明;
②定义了存放信息的字典;
③定义了添加监听关系的函数Add();
④定义了发送事件的的函数SendEvent():
⑤定义了删除关系的相关函数;

using System.Collections.Generic;
using System.Diagnostics.Tracing;
using Unity.VisualScripting;
using UnityEngine;

namespace UnityLearn
{
    // 抽象的回调函数,在listener中会定义具体的
    public delegate void EventCallBack(EventDataBase data);
    public class EventManager : SingleMono<EventManager>
    {
        // 存放 事件类型-监听者 
        Dictionary<EventType, List<EventListener>> eventListenerList = new Dictionary<EventType, List<EventListener>>();
        // 添加 (事件类型-监听者) 这一关系
        public void Add(EventType eventType, object listener, EventCallBack callBack)
        {
            if (listener == null)
            {
                return;
            }
            
            AddEvent(eventType);
            eventListenerList[eventType].Add(new EventListener(listener, callBack));
        }

        // 添加事件
        private void AddEvent(EventType eventType)
        {
            // 第一次出现这个事件,添加进字典
            if (!eventListenerList.ContainsKey(eventType))
            {
                eventListenerList.Add(eventType, new List<EventListener>());
            }
        }

        // 发送事件
        public void SendEvent(EventType eventType, EventDataBase evenData)
        {
            if (eventListenerList.ContainsKey(eventType))
            {
                // 获取所有该消息的监听者
                List<EventListener> listenerList = eventListenerList[eventType];
                for (int i = 0; i < listenerList.Count; ++i)
                {
                    listenerList[i].CallBack(evenData);
                }
            }   
        }

        // 移除某个监听者
        public void RemoveEventListener(EventType eventType, object listener)
        {
            List<EventListener> listenerList;
            if (eventListenerList.TryGetValue(eventType, out listenerList))
            {
                for (int i = 0; i < listenerList.Count; ++i)
                {
                    listenerList.RemoveAt(i);
                    return;
                }
            }
        }

        // 移除某个监听类别
        public void RemoveEvent(EventType eventType)
        {
            if (eventListenerList.ContainsKey(eventType))
            {
                eventListenerList.Remove(eventType);
            }
        }

        // 移除所有监听关系
        public void Clear()
        {
            eventListenerList.Clear();
        }
    }
}

一个事件管理者会管很多很多的事情,即存在很多很多的EventType,上述例子中的“铃声响起”只是众多事情中的一个。每个EventType需要在一个枚举中声明,如:

using Unity.VisualScripting;

namespace UnityLearn
{
    public enum EventType
    {
        MouseInput = 10002,
    }
}

4. 监听者

一个监听者的示例代码如下:

using UnityEngine;

namespace UnityLearn
{
    public class EventListener
    {
        public object Listener { get; private set;}
        public EventCallBack CallBack { get; private set;}

        // 设置:该监听者收到事件发生时去干什么
        public EventListener(object listener, EventCallBack callBack)
        {
            Listener = listener;
            CallBack = callBack;
        }
    }
}

5. 应用例子

最后,有了上述内容,一个应用的例子如下:

using System;
using UnityEngine;

namespace UnityLearn
{
    public class A: MonoBehaviour
    {
        private void Start()
        {
        	// 将本实例,在EventManager中注册消息类型为MouseInput,回调函数为WhatToDo
            EventManager.Instance.Add(EventType.MouseInput, this, WhatToDo);
        }

        void WhatToDo(EventDataBase data)
        {
            // 回调函数内容
        }
    }
}

上述例子中,在一个继承MonoBehavior的实例A的Start()函数中定义,在事件管理者EventManager中注册自己,订阅的消息为MouseInput,收到消息后执行的回调函数时WhatToDo。
回调函数的具体内容视实际情况而定。文章来源地址https://www.toymoban.com/news/detail-482960.html

到了这里,关于[Unity] No.3 EventManager事件管理 与 观察者模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 观察者模式(实例详解)

    在Unity中实现观察者模式,我们可以创建一个Subject(目标/主题)类,它负责维护订阅者列表,并且当其状态改变时通知所有观察者。下面通过5个代码示例来详细展示如何在Unity C#脚本中应用观察者模式: 示例1 - 简单的文本更新通知 示例2 - 多观察者监听游戏分数变化 示例

    2024年02月21日
    浏览(27)
  • Unity设计模式之观察者模式

      在平常玩游戏的时候会遇到这种情况,以简单的Rpg举例。 勇者击杀了怪物,怪物死了,勇者摆出胜利姿势,系统提示怪物死亡 。如果按照一般逻辑可能会在怪物死亡的方法中去获取Player、Dialog,这样看上去其实也不太难。但如果需要去关联的事件很多,就需要在类中去获

    2024年02月06日
    浏览(30)
  • 【Unity实战100例】人物状态栏UI数据刷新—MVC观察者模式

    目录 一.创建Model层数据模型 二.创建View层关联UI组件 三.创建Controller层使得V和M数据关联 源码:

    2024年02月13日
    浏览(30)
  • 【C++ 观察者模式 思想理解】C++中的观察者模式:松耦合设计与动态交互的艺术,合理使用智能指针观察者

    在进入技术细节之前,理解观察者模式(Observer Pattern)的基本概念和它在现代编程中的重要性是至关重要的。 观察者模式是一种设计模式,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。在C++中,这个

    2024年01月24日
    浏览(54)
  • 观察者模式(上):详解各种应用场景下观察者模式的不同实现方式

            从今天起,我们开始学习行为型设计模式。我们知道,创建型设计模式主要解决“对象的创建”问题,结构型设计模式主要解决“类或对象的组合或组装”问题,那行为型设计模式主要解决的就是“ 类或对象之间的交互 ”问题。 原理及应用场景剖析 在对象之间

    2024年02月16日
    浏览(52)
  • 观察者模式(Observer)

    观察着模式是一种行为设计模式,可以用来定义对象间的一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。 观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者

    2024年02月14日
    浏览(36)
  • 观察者模式(java)

    目录 结构 案例  代码实现 抽象观察者 抽象主题类 具体观察者 具体主题类 测试类 优缺点 优点 缺点 在观察者模式中有如下角色: Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一

    2024年02月15日
    浏览(32)
  • 观察者模式(二十)

    相信自己,请一定要相信自己 上一章简单介绍了迭代器模式(十九), 如果没有看过, 请观看上一章 引用 菜鸟教程里面 观察者模式介绍: https://www.runoob.com/design-pattern/observer-pattern.html 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。 比如,当一个对象被修改时

    2024年02月09日
    浏览(43)
  • 委托及观察者模式

    委托( delegate )是一种特殊的类型( class ),它可以被认为是一个可以拥有函数引用的类,它的声明规定了它能够持有的函数引用的函数形式,同时它可以存储多个函数引用,并通过自己的方法调用所有注册在它身上的方法(发布者)。 理解了观察者模式就理解了委托 它的

    2024年02月10日
    浏览(34)
  • 观察者模式(C++)

    定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。 ——《设计模式》GoF 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。 运行结果: 使

    2024年02月13日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包