当前位置:   article > 正文

Unity3D EventMgr事件订阅与发布详解_unity eventmgr

unity eventmgr

前言

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

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

一、事件订阅与发布简介

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

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

二、EventMgr的实现

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

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. public class EventMgr
  5. {
  6. private static EventMgr instance;
  7. private Dictionary<string, Action<object>> eventDict;
  8. public static EventMgr Instance
  9. {
  10. get
  11. {
  12. if (instance == null)
  13. {
  14. instance = new EventMgr();
  15. }
  16. return instance;
  17. }
  18. }
  19. private EventMgr()
  20. {
  21. eventDict = new Dictionary<string, Action<object>>();
  22. }
  23. public void Subscribe(string eventName, Action<object> callback)
  24. {
  25. if (!eventDict.ContainsKey(eventName))
  26. {
  27. eventDict[eventName] = callback;
  28. }
  29. else
  30. {
  31. eventDict[eventName] += callback;
  32. }
  33. }
  34. public void Unsubscribe(string eventName, Action<object> callback)
  35. {
  36. if (eventDict.ContainsKey(eventName))
  37. {
  38. eventDict[eventName] -= callback;
  39. if (eventDict[eventName] == null)
  40. {
  41. eventDict.Remove(eventName);
  42. }
  43. }
  44. }
  45. public void Publish(string eventName, object data)
  46. {
  47. if (eventDict.ContainsKey(eventName))
  48. {
  49. eventDict[eventName]?.Invoke(data);
  50. }
  51. }
  52. }

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

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

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

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

三、EventMgr的使用示例

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

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

  1. using UnityEngine;
  2. public class Player : MonoBehaviour
  3. {
  4. private void Update()
  5. {
  6. if (Input.GetKeyDown(KeyCode.Space))
  7. {
  8. EventMgr.Instance.Publish("PlayerJump", null);
  9. }
  10. }
  11. }

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

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

  1. using UnityEngine;
  2. public class UI : MonoBehaviour
  3. {
  4. private void Start()
  5. {
  6. EventMgr.Instance.Subscribe("PlayerJump", OnPlayerJump);
  7. }
  8. private void OnPlayerJump(object data)
  9. {
  10. Debug.Log("Player jumped!");
  11. }
  12. private void OnDestroy()
  13. {
  14. EventMgr.Instance.Unsubscribe("PlayerJump", OnPlayerJump);
  15. }
  16. }

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

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

四、总结

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

更多教学视频

Unity3D​www.bycwedu.com/promotion_channels/2146264125

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/865594
推荐阅读
相关标签
  

闽ICP备14008679号