[Unity] 事件分发系统

本文介绍了Unity中MessageDispatcher的设计与实现,包括IMessage接口、Message对象池、MessageListenerDefinition以及MessageDispatcher的使用。通过c#委托和字典结构实现消息队列,支持字符串绑定事件和过滤操作,同时利用Timer工具实现延迟触发。为了优化性能,采用了对象池,但未使用泛型以简化使用,避免值类型拆装箱。
摘要由CSDN通过智能技术生成

[Unity] Utilities 之 MessageDispatcher

参考资料:

1.设计

Message

IMessage接口定义了消息的基本属性。
Message实现接口,并构建对象池,提供New、Free方法生成实例、释放实例。

public interface IMessage {
   
    string Type {
    get; set; }
    string Recipient {
    get; set; }
    object Data {
    get; set; }
    float Delay {
    get; set; }
    object Sender {
    get; set; }
    bool IsSent {
    get; set; }
    bool IsHandled {
    get; set; }

    void Clear();
}

public class Message : IMessage {
   
    public string Type {
    get; set; }
    public string Recipient {
    get; set; }
    public object Data {
    get; set; }
    public float Delay {
    get; set; }
    public object Sender {
    get; set; }
    public bool IsSent {
    get; set; }
    public bool IsHandled {
    get; set; }

    public void Clear () {
   
        Type = "";
        Recipient = null;
        Data = null;
        Delay = 0;
        Sender = null;
        IsSent = false;
        IsHandled = false;
    }
    // msg pool
    private static ObjectPool<Message> m_MsgPool = new ObjectPool<Message> (10, false);

    public static Message New () {
   
        Message instance = m_MsgPool.New ();
        if (instance == null) {
    Debug.LogError ("Can't create Msg Instance!"); }

        instance.IsSent = false;
        instance.IsHandled = false;

        return instance;
    }

    public static void Free (Message instance) {
   
        if (instance == null) return;
        instance.IsSent = true;
        instance.IsHandled = true;

        m_MsgPool.Free(instance);
    }

    public static void Free(IMessage instance){
   
        if(instance == null) return;

        instance.Clear();

        instance.IsSent = true;
        instance.IsHandled = true;

        if(instance is Message)
            m_MsgPool.Free((Message)instance);
    }
}

Listener

MessageListenerDefinition用于创建监听者实例。设计方式与Message相似。

public class MessageListenerDefinition {
   
    /// <summary>
    /// Msg Type
    /// </summary>
    /// <va
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值