/// /// 网络消息处理中心 /// 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(); } }