您的位置:首页 > 移动开发 > Unity3D

Unity3d 简单的消息系统

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

分析:

需要一个全局的消息管理器,用于管理消息,可以添加,移除,清空,分发消息,这样一来,字典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

点击白色小球,正方体开始运动;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: