Unity3d 简单的消息系统

游戏开发过程中,消息系统是整个框架中比较重要的一部分,用得好可以使客户端框架“干净整洁”(私以为这个很重要),不然各种交叉访问,耦合度实在是不要太高啊!

分析:

  • 需要一个全局的消息管理器,用于管理消息,可以添加,移除,清空,分发消息,这样一来,字典Dictionary< EventType, EventListenerDelegate>最合适不过了,当然也可以使用哈希表来做容器;
  • EventType是事件类型,EventListenerDelegate是委托;
  • EventListenerDelegate的参数是EventData;
/// <summary>
/// 消息类型定义
/// </summary>
public enum EventType{
    GAME_START,      
    GAME_OVER,       
    PAUSE,          
    CLICK_CUBE,
}
using System.Collections;

/// <summary>
/// 基本事件封装
/// </summary>
public class EventData
{
    protected Hashtable arguments;
    private EventType type;
    protected object sender;

    public EventType Type
    {
        get { return type; }

        set { type = value; }
    }

    public IDictionary Params
    {
        get { return arguments; }
        set { arguments = (Hashtable) value; }
    }

    public object Sender
    {
        get { return sender; }
        set { sender = value; }
    }

    public override string ToString()
    {
        return this.type + "[" + ((this.sender == null) ? "null" : this.sender.ToString() + "]");
    }

    public EventData Clone()
    {
        return new EventData(type,arguments,Sender);
    }

    public EventData(EventType type, object sender)
    {
        this.Type = type;
        Sender = sender;
        if (this.arguments == null)
        {
            this.arguments = new Hashtable();
        } 
    }

    public EventData(EventType type, Hashtable args, object sender)
    {
        this.Type = type;
        this.arguments = args;
        Sender = sender;
        if (this.arguments == null)
        {
            this.arguments=new Hashtable();
        }
    }
}
using System;
using System.Collections.Generic;

public delegate void EventListenerDelegate(EventData evt);

public class MessageManager
{
    static MessageManager instance;

    public static MessageManager GetInstance()
    {
        if (instance == null)
        {
            instance = new MessageManager();
        }
        return instance;
    }

    //private Hashtable listeners = new Hashtable();
    private Dictionary<EventType, EventListenerDelegate> listeners = new Dictionary<EventType, EventListenerDelegate>();

    /// <summary>
    /// 增加监听
    /// </summary>
    /// <param name="eventType"></param>
    /// <param name="listener"></param>
    public void AddEventListener(EventType eventType, EventListenerDelegate listener)
    {
        EventListenerDelegate eventListenerDelegate = null;

        if (!listeners.TryGetValue(eventType, out eventListenerDelegate))
        {
            listeners.Add(eventType, listener);
        }
    }

    /// <summary>
    /// 移除事件
    /// </summary>
    /// <param name="eventType"></param>
    /// <param name="listener"></param>
    public void RemoveEventListener(EventType eventType, EventListenerDelegate listener)
    {
        EventListenerDelegate eventListenerDelegate = null;

        if (listeners.TryGetValue(eventType, out eventListenerDelegate))
        {
            listeners.Remove(eventType);
        }
    }

    /// <summary>
    /// 分发消息
    /// </summary>
    /// <param name="evt"></param>
    public void Dispatcher(EventData evt)
    {
        EventListenerDelegate eventListenerDelegate = null;

        if (listeners.TryGetValue(evt.Type, out eventListenerDelegate))
        {
            try
            {
                eventListenerDelegate(evt);
            }
            catch (Exception e)
            {
                throw new Exception(string.Concat(new string[]
                {
                            "Error dispatcher event",
                            evt.Type.ToString(),
                            ":",
                            e.Message,
                            " ",
                            e.StackTrace
                }), e);
            }
        }
    }

    public void RemoveAll()
    {
        listeners.Clear();
    }
}

源代码:
https://gitee.com/xianglinlove/EventManager
点击白色小球,正方体开始运动;

这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值