///
/// 网络消息处理中心
///
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Concurrent;
using System;
using socket;
using BossServer;
public struct sEvent_GameLogicData
{
public eGameLogicEventType _eventType;
public object _eventData;
}
public struct sEvent_NetMessageData
{
public eProtocalCommand _eventType;
public byte[] _eventData;
public static implicit operator sEvent_NetMessageData(sSocketData src)
{
var ret = new sEvent_NetMessageData()
{
_eventType = src.ProtocallType,
_eventData = src.Data
};
return ret;
}
}
public delegate void Callback_GameLogic_Handle(object _data);
public delegate void Callback_NetMessage_Handle(byte[] _data);
public class MessageCenter : MonoSingleton
{
private Dictionary _netMessage_EventList = new Dictionary();
public ConcurrentQueue _netMessageDataQueue = new ConcurrentQueue();
private Dictionary _gameLogic_EventList = new Dictionary();
public ConcurrentQueue _gameLogicDataQueue = new ConcurrentQueue();
//添加网络事件观察者
public void addObsever(eProtocalCommand _protocalType, Callback_NetMessage_Handle _callback)
{
if (_netMessage_EventList.ContainsKey(_protocalType))
{
_netMessage_EventList[_protocalType] += _callback;
}
else
{
_netMessage_EventList.Add(_protocalType, _callback);
}
}
//删除网络事件观察者
public void removeObserver(eProtocalCommand _protocalType, Callback_NetMessage_Handle _callback)
{
if (_netMessage_EventList.ContainsKey(_protocalType))
{
_netMessage_EventList[_protocalType] -= _callback;
if (_netMessage_EventList[_protocalType] == null)
{
_netMessage_EventList.Remove(_protocalType);
}
}
}
//添加普通事件观察者
public void AddEventListener(eGameLogicEventType _eventType, Callback_GameLogic_Handle _callback)
{
if (_gameLogic_EventList.ContainsKey(_eventType))
{
_gameLogic_EventList[_eventType] += _callback;
}
else
{
_gameLogic_EventList.Add(_eventType, _callback);
}
}
//删除普通事件观察者
public void RemoveEventListener(eGameLogicEventType _eventType, Callback_GameLogic_Handle _callback)
{
if (_gameLogic_EventList.ContainsKey(_eventType))
{
_gameLogic_EventList[_eventType] -= _callback;
if (_gameLogic_EventList[_eventType] == null)
{
_gameLogic_EventList.Remove(_eventType);
}
}
}
//推送消息
public void PostEvent(eGameLogicEventType _eventType, object data = null)
{
if (_gameLogic_EventList.ContainsKey(_eventType))
{
_gameLogic_EventList[_eventType](data);
}
}
public void Init() { }
void Update()
{
while (_gameLogicDataQueue.TryDequeue(out sEvent_GameLogicData tmpGameLogicData))
{
if (_gameLogic_EventList.ContainsKey(tmpGameLogicData._eventType))
{
_gameLogic_EventList[tmpGameLogicData._eventType](tmpGameLogicData._eventData);
}
}
while (_netMessageDataQueue.TryDequeue(out sEvent_NetMessageData tmpNetMessageData))
{
if (_netMessage_EventList.ContainsKey(tmpNetMessageData._eventType))
{
_netMessage_EventList[tmpNetMessageData._eventType](tmpNetMessageData._eventData);
}
}
}
override protected void DoOnDestroy()
{
//SocketManager.Instance.Close();
base.DoOnDestroy();
}
}