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

相关推荐
哈哈不让取名字11 小时前
基于C++的爬虫框架
开发语言·c++·算法
花间相见11 小时前
【JAVA开发】—— Nginx服务器
java·开发语言·nginx
扶苏-su11 小时前
Java---Properties 类
java·开发语言
Longyugxq13 小时前
Untiy的Webgl端网页端视频播放,又不想直接mp4格式等格式的。
unity·音视频·webgl
一条咸鱼_SaltyFish13 小时前
远程鉴权中心设计:HTTP 与 gRPC 的技术决策与实践
开发语言·网络·网络协议·程序人生·http·开源软件·个人开发
我即将远走丶或许也能高飞13 小时前
vuex 和 pinia 的学习使用
开发语言·前端·javascript
沐知全栈开发13 小时前
SQL LEN() 函数详解
开发语言
钟离墨笺13 小时前
Go语言--2go基础-->基本数据类型
开发语言·前端·后端·golang
小郭团队14 小时前
1_7_五段式SVPWM (传统算法反正切+DPWM3)算法理论与 MATLAB 实现详解
开发语言·嵌入式硬件·算法·matlab·dsp开发
C+-C资深大佬14 小时前
C++风格的命名转换
开发语言·c++