Unity的模块通信与事件派发
模块类型
public Enum EModuleType : byte
{
None = 0,
Login = 1,
...
}
各模块的子类型
public Enum EventType
{
None = 0,
Refresh = 1,
...
}
数据传输类
public class EventBase
{
public object param {get;set}
public EventBase(object _param)
{
param = _param;
}
}
事件管理类
public class Event
{
private static Event _instance = null;
public delegate void Func(EventBase eventBase);
private Dictionary <int,List<Func>> listeners = new Dictionary <int,List<Func>>();
public static Event Instance()
{
if(_instance == null)
{
_instance = new Event();
}
return _instance;
}
public void RigisterEvent(int moduleType,int eventType,Func func)
{
int type = (moduleType >> 16) + eventType;
AddEventListener(type,func);
}
public void UnRegisterEvent(int moduleType,int eventType,Func func)
{
int type = (moduleType >> 16) + eventType;
RemoveEventListener(type,func);
}
public void DispatchEvent(int moduleType,int eventType,object param)
{
int type = (moduleType >> 16) + eventType;
_DispatchEvent(type,param);
}
private void AddEventListener(int type,Func func)
{
if(!listeners.ContainsKey(type))
{
List events = new List<Func>();
listeners.Add(type,events);
}
if(!listeners[type].Contains(func))
{
listeners.Add(type,func)
}
}
private void RemoveEventListener(int type,Func func)
{
if(listeners.ContainsKey(type))
{
listeners[type].Remove(func);
}
}
private void _DispatchEvent(int type,object param)
{
if(listeners.ContainsKey(type))
{
List<Func> events = listeners[type];
foreach(var event in events)
{
event(new EventBase(param));
}
}
}
}
示例
LoginUI login = new LoginUI();
private void OnCreate()
{
//view层注册
Event.Instance().RigisterEvent(EModuleType.Login,EventType.Refresh,login.Refresh);
}
private void Refresh(EventBase eventBase)
{
//参数
LoginData param = eventBase.param as LoginData;
RefreshData(param);
}
private void RefreshData(LoginData data)
{
//刷新数据
}
private void OnDestroy()
{
//销毁
Event.Instance().UnRigisterEvent(EModuleType.Login,EventType.Refresh,login.Refresh);
}
//
public class LoginData
{
private string name;
private number server_id;
public LoginData(string _name,number _server_id)
{
name = _name;
server_id = _server_id;
}
}
//Control层派发
LoginData data = new LoginData("ares",123);
Event.Instance().DispatchEvent(EModuleType.Login,EventType.Refresh,data);
lua
--Lplus为类似C#的封装
local Lplus = require "Lplus"
local Event = Lplus.Class("Event.Event")
local bit = require "bit"
local def = Event.define
local instance = nil
_G.Event = Event
def.field("table").listeners = nil
def.static("=>", Event).Instance = function ()
if(instance == nil) then
instance = Event()
instance.listeners = {}
end
return instance
end
def.final("number", "number", "function").RegisterEvent = function (moduleId, eventId, func)
local k = bit.lshift(moduleId, 16) + eventId
instance:_AddEventListener(k, func, nil)
end
def.final("number", "number", "function").UnregisterEvent = function (moduleId, eventId, func)
local k = bit.lshift(moduleId, 16) + eventId
instance:_RemoveEventListener(k, func)
end
def.final("number", "number", "function").UnRegisterEvent = function (moduleId, eventId, func)
instance:UnregisterEvent(moduleId, eventId, func)
end
def.final("number", "number", "table").DispatchEvent = function (moduleId, eventId, param)
local k = bit.lshift(moduleId, 16) + eventId
instance:_DispatchEvent(k, param)
end
def.final("number", "function", "table").AddEventListener = function (eventId, func, param)
instance:_AddEventListener(eventId, func, param)
end
def.final("number", "function").RemoveEventListener = function (eventId, func)
instance:_RemoveEventListener(eventId, func)
end
def.method("number", "function", "table")._AddEventListener = function (self, eventId, func, param)
local listeners = self.listeners[eventId]
if listeners == nil then
listeners = {}
self.listeners[eventId] = listeners
end
for _, v in pairs(listeners) do
if(v.f == func) then
return
end
end
table.insert(listeners, {f=func, p=param})
end
def.method("number", "function")._RemoveEventListener = function (self, eventId, func)
local listeners = self.listeners[eventId]
if listeners == nil then return end
for k, v in pairs(listeners) do
if(v.f == func) then
table.remove(listeners, k)
return
end
end
end
def.method("number", "table")._DispatchEvent = function (self, eventId, param)
local listeners = instance.listeners[eventId]
if listeners == nil then return end
for _, v in ipairs(listeners) do
if v.p then
v.f(v.p, param)
else
v.f(param, nil) --should be: v.f(param)
end
end
end
return Event.Commit()
以上代码仅提供思路。