在 Unity 中使用委托和事件创建事件管理器(消息系统)

Posted

技术标签:

【中文标题】在 Unity 中使用委托和事件创建事件管理器(消息系统)【英文标题】:Create Event Manager (Messaging System) in Unity Using delegate and event 【发布时间】:2019-04-02 02:35:34 【问题描述】:

unity官网上有个视频教程叫:

Events: Creating a simple messaging system.

他们创建了一个事件管理器或消息系统。

我看了它,它非常有帮助,所以我在我的游戏中创建了这个系统,现在决定不使用UnityEventUnityAction,而是使用delegateevent,这是更好的性能和良好的实践。所以这是我的代码 [StopListen() 功能尚未包含]:

公共类 EventManager : MonoBehaviour 公共代表无效 GameEvents(); 公共事件 GameEvents onGameEvent; 私有静态 EventManager _instance = null; 公共静态 EventManager 实例 得到 如果(_instance == null) _instance = FindObjectOfType(typeof(EventManager)) 作为 EventManager; 如果(!_实例) Debug.LogError("将带有此脚本的游戏对象附加到您的场景中。"); 别的 _instance.InitializeEventDictionary(); 返回_实例; 私人字典事件字典; 无效初始化事件字典() if (eventsDictionary == null) eventsDictionary = new Dictionary(); 公共无效听(字符串事件名称,游戏事件游戏事件) 游戏事件 thisEvent = null; if (Instance.eventsDictionary.TryGetValue(eventName, out gameEvent)) 这个事件 += 游戏事件; 别的 thisEvent = new GameEvents(); 这个事件 += 游戏事件; Instance.eventsDictionary.Add(eventName, thisEvent); 公共无效触发事件(字符串事件名称) 游戏事件 thisEvent; if(Instance.eventsDictionary.TryGetValue(eventName, out thisEvent)) thisEvent.Invoke();

在我的Listen() 函数中,这行thisEvent = new GameEvents(); 给我带来了麻烦,我不知道如何解决它! (帮助!):-)

[PS]:

    delegateevent 的性能是否比 UnityEventUnityAction 更好? 应该或必须在此代码中添加什么以使其更高效?

【问题讨论】:

【参考方案1】:

您必须定义在访问委托时应该调用什么,否则如果什么都不做,则不需要委托。

像 lamda:

thisEvent = new GameEvents(() =>  Console.WriteLine("TODO"););

或者一个方法:

thisEvent = new GameEvents(Target);
private void Target()

     throw new NotImplementedException();

可以看看https://www.codeproject.com/Articles/624575/Delegate-Tutorial-for-Beginners

对于执行时间,我认为最好是做一个测试,看看哪个性能更好。

【讨论】:

以上是关于在 Unity 中使用委托和事件创建事件管理器(消息系统)的主要内容,如果未能解决你的问题,请参考以下文章

使用 OnClick 事件更改场景

Unity游戏开发C#基础委托与事件

unity的C#学习——委托事件和匿名方法

如何在没有事件/委托回调的情况下在 Unity 中创建 MessageBox?

Unity Spine动画中Complete 委托 事件缓存 += -= 委托

Unity C# 事件监听和广播