事件派发

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()

以上代码仅提供思路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值