QFramework 除了支持了 TypeEventSystem、EasyEvent 還支持了 EnumEventSystem、StringEventSystem。
EnumEventSystem
EnumEventSystem 前身是 老版本 QFramework 的 QEventSystem
using UnityEngine;
namespace QFramework
{
public class EnumEventExample : MonoBehaviour
{
#region 事件定義
public enum TestEvent
{
Start,
TestOne,
End,
}
public enum TestEventB
{
Start = TestEvent.End, // 為了保證每個(gè)消息 Id 唯一,需要頭尾相接
TestB,
End,
}
#endregion 事件定義
void Start()
{
EnumEventSystem.Global.Register(TestEvent.TestOne, OnEvent);
}
void OnEvent(int key, params object[] obj)
{
switch (key)
{
case (int) TestEvent.TestOne:
Debug.Log(obj[0]);
break;
}
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
EnumEventSystem.Global.Send(TestEvent.TestOne, "Hello World!");
}
}
private void OnDestroy()
{
EnumEventSystem.Global.UnRegister(TestEvent.TestOne, OnEvent);
}
}
}
StringEventSystem
StringEventSystem 的前身是,老版本的 MsgDispatcher
using UnityEngine;
namespace QFramework
{
public class EnumEventExample : MonoBehaviour
{
#region 事件定義
public enum TestEvent
{
Start,
TestOne,
End,
}
public enum TestEventB
{
Start = TestEvent.End, // 為了保證每個(gè)消息 Id 唯一,需要頭尾相接
TestB,
End,
}
#endregion 事件定義
void Start()
{
EnumEventSystem.Global.Register(TestEvent.TestOne, OnEvent);
}
void OnEvent(int key, params object[] obj)
{
switch (key)
{
case (int) TestEvent.TestOne:
Debug.Log(obj[0]);
break;
}
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
EnumEventSystem.Global.Send(TestEvent.TestOne, "Hello World!");
}
}
private void OnDestroy()
{
EnumEventSystem.Global.UnRegister(TestEvent.TestOne, OnEvent);
}
}
}
// 輸出結(jié)果
// 點(diǎn)擊鼠標(biāo)左鍵
// Hello World
StringEventSystem
using UnityEngine;
namespace QFramework.Example
{
public class StringEventSystemExample : MonoBehaviour
{
void Start()
{
StringEventSystem.Global.Register("TEST_ONE", () =>
{
Debug.Log("TEST_ONE");
}).UnRegisterWhenGameObjectDestroyed(gameObject);
// 事件 + 參數(shù)
StringEventSystem.Global.Register<int>("TEST_TWO", (count) =>
{
Debug.Log("TEST_TWO:" + count);
}).UnRegisterWhenGameObjectDestroyed(gameObject);
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
StringEventSystem.Global.Send("TEST_ONE");
StringEventSystem.Global.Send("TEST_TWO",10);
}
}
}
}
// 輸出結(jié)果
// 點(diǎn)擊鼠標(biāo)左鍵
// TEST_ONE
// TEST_TWO:10
對(duì)比
-
TypeEventSystem:
- 事件體定義簡潔
- 比較適合用于設(shè)計(jì)框架
- 支持 struct 獲得較好內(nèi)存性能
- 使用反射,CPU 性能相對(duì)比較差
-
EasyEvent
- 方便、易用、開發(fā)效率高
- CPU 性能、內(nèi)存性能較好,接近委托
- 功能有限
- 比較適合設(shè)計(jì)通用解決工具,比如通用背包、全局生命周期觸發(fā)等
- StringEventSystem、TypeEventSystem 的底層由 EasyEvent 實(shí)現(xiàn)
-
EnumEventSystem
- 使用枚舉作為事件 id,比較適合和服務(wù)端的 protobuf 或帶有消息 id 的長鏈接通信
- 性能較好
- 枚舉用于定義消息體有維護(hù)成本
-
StringEventSystem
- 使用字符串作為事件 id,比較適合和其他腳本層通信,比如 Lua、ILRuntime、PlayMaker 等。
- 性能一般
目前官方推薦使用 TypeEventSystem 和 EasyEvent 這兩個(gè)工具。
如果要和網(wǎng)絡(luò)通信則選擇用 EnumEventSystem。文章來源:http://www.zghlxwxcb.cn/news/detail-416336.html
如果要和其他腳本層通信選擇用 StringEventSystem。文章來源地址http://www.zghlxwxcb.cn/news/detail-416336.html
更多內(nèi)容
- QFramework 主頁:qframework.cn
- QFramework Github 地址: https://github.com/liangxiegame/qframework
- QFramework Gitee 地址:https://gitee.com/liangxiegame/QFramework
到了這里,關(guān)于【Unity 框架】QFramework v1.0 使用指南 工具篇:13. 其他事件工具 | Unity 游戲框架 | Unity 游戲開發(fā) | Unity 獨(dú)立游戲的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!