Unity3D EventMgr事件订阅与发布详解

前言

EventMgr事件订阅与发布机制是开发中常用的一种设计模式。本文将详细介绍Unity3D中EventMgr的使用方法,包括技术详解和代码实现。

对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!

一、事件订阅与发布简介

在游戏开发中,经常需要实现不同模块之间的通信,例如玩家行为触发了某个事件,需要通知其他模块做出相应的反应。传统的方法是直接调用其他模块的方法,但这种方式会导致模块之间的耦合度过高,不利于代码的维护和扩展。

事件订阅与发布机制可以有效解决这个问题,它将事件的发布者和订阅者解耦,让它们之间只通过事件的方式进行通信。发布者将事件发布到一个中心管理器中,订阅者通过订阅感兴趣的事件来接收通知。这种方式使得模块之间的依赖关系更加灵活,代码结构更加清晰。

二、EventMgr的实现

在Unity3D中,我们可以通过编写一个EventMgr类来实现事件订阅与发布机制。下面是一个简单的EventMgr类的实现:

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

public class EventMgr
{
    private static EventMgr instance;
    private Dictionary<string, Action<object>> eventDict;

    public static EventMgr Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new EventMgr();
            }
            return instance;
        }
    }

    private EventMgr()
    {
        eventDict = new Dictionary<string, Action<object>>();
    }

    public void Subscribe(string eventName, Action<object> callback)
    {
        if (!eventDict.ContainsKey(eventName))
        {
            eventDict[eventName] = callback;
        }
        else
        {
            eventDict[eventName] += callback;
        }
    }

    public void Unsubscribe(string eventName, Action<object> callback)
    {
        if (eventDict.ContainsKey(eventName))
        {
            eventDict[eventName] -= callback;
            if (eventDict[eventName] == null)
            {
                eventDict.Remove(eventName);
            }
        }
    }

    public void Publish(string eventName, object data)
    {
        if (eventDict.ContainsKey(eventName))
        {
            eventDict[eventName]?.Invoke(data);
        }
    }
}

在EventMgr类中,我们定义了一个静态的Instance属性,用来获取EventMgr的实例。在构造函数中初始化了一个eventDict字典,用来存储事件名和对应的回调函数。

Subscribe方法用来订阅事件,它接收两个参数:事件名和回调函数。如果事件名在eventDict中不存在,则直接将回调函数添加到eventDict中;如果事件名已经存在,则将回调函数追加到已有的回调函数链表中。

Unsubscribe方法用来取消订阅事件,它接收两个参数:事件名和回调函数。如果事件名在eventDict中存在,则从对应的回调函数链表中移除指定的回调函数,并且如果链表为空,则将事件名从eventDict中移除。

Publish方法用来发布事件,它接收两个参数:事件名和传递的数据。如果事件名在eventDict中存在,则依次调用对应的回调函数,并将数据传递给它们。

三、EventMgr的使用示例

下面我们通过一个简单的示例来演示EventMgr的使用方法。假设我们有两个模块:Player和UI,Player模块中的玩家行为会触发事件,UI模块需要根据事件做出相应的反应。

首先,我们在Player模块中定义一个Player类,用来模拟玩家的行为:

using UnityEngine;

public class Player : MonoBehaviour
{
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            EventMgr.Instance.Publish("PlayerJump", null);
        }
    }
}

在Player类中,我们监听玩家按下空格键的事件,并通过EventMgr发布"PlayerJump"事件。

然后,我们在UI模块中定义一个UI类,用来订阅"PlayerJump"事件并做出反应:

using UnityEngine;

public class UI : MonoBehaviour
{
    private void Start()
    {
        EventMgr.Instance.Subscribe("PlayerJump", OnPlayerJump);
    }

    private void OnPlayerJump(object data)
    {
        Debug.Log("Player jumped!");
    }

    private void OnDestroy()
    {
        EventMgr.Instance.Unsubscribe("PlayerJump", OnPlayerJump);
    }
}

在UI类中,我们在Start方法中订阅"PlayerJump"事件,并指定回调函数为OnPlayerJump。在OnPlayerJump方法中,我们输出一条日志表示玩家跳跃了。在OnDestroy方法中,我们取消订阅"PlayerJump"事件。

通过以上代码,我们实现了Player模块和UI模块之间的通信,它们之间的耦合度很低,代码结构更加清晰。

四、总结

EventMgr是一种常用的设计模式,它可以有效解决模块之间的通信问题,使得代码结构更加清晰和灵活。在Unity3D中,我们可以通过编写一个简单的EventMgr类来实现事件订阅与发布机制。通过本文的介绍和示例,希望读者能够更好地理解EventMgr的使用方法,并在实际项目中应用它来提高代码的可维护性和扩展性。

更多教学视频

Unity3D​www.bycwedu.com/promotion_channels/2146264125

相关推荐

  1. Unity3D EventMgr事件订阅发布详解

    2024-03-24 02:16:03       20 阅读
  2. SpringEvent事件发布&订阅Demo

    2024-03-24 02:16:03       7 阅读
  3. Redis-发布订阅

    2024-03-24 02:16:03       20 阅读
  4. Redis 订阅发布(Pub/Sub) 详解 如何使用订阅发布

    2024-03-24 02:16:03       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-24 02:16:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-24 02:16:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-24 02:16:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-24 02:16:03       20 阅读

热门阅读

  1. taro常用的一些功能

    2024-03-24 02:16:03       17 阅读
  2. 如何使用Python进行物联网应用的测试和调试工作

    2024-03-24 02:16:03       15 阅读
  3. 10 龙芯平台openstack部署搭建-dashboard部署

    2024-03-24 02:16:03       16 阅读
  4. 设置 WebView,禁止缩放网页

    2024-03-24 02:16:03       18 阅读
  5. 计算机网络简答题:复试+期末

    2024-03-24 02:16:03       23 阅读
  6. 设计模式:面向对象设计的六大原则

    2024-03-24 02:16:03       21 阅读
  7. ChatGPT写作宝典:解锁论文创作新技能

    2024-03-24 02:16:03       20 阅读
  8. 企业微信自动化营销:赋能企业,驱动增长

    2024-03-24 02:16:03       17 阅读