using DevelopEngine; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using XFramework; //同步管理器 每帧发送状态数据 并处理同步数据 //事件同步数据 只处理 由Sender自身发送 public class SyncGOManager : MonoSingleton { List senders = new List(); UnityAction> sendAction; Dictionary handlersDic = new Dictionary(); public float sendInterval;//发送事件间隔 不设置时默认为最小间隔FixedTime 0.02f 设置小于0.02f的时间无效 无效时每帧发送 float sendTimer;//数据发送计时器 // Start is called before the first frame update void Start() { sendTimer = sendInterval; } /// /// 注册状态同步消息发送方法 /// /// public void RegisterSendFun(UnityAction> sendAction) { this.sendAction += sendAction; } /// /// 注销状态同步消息发送方法 /// /// public void RemoveSendFun(UnityAction> sendAction) { this.sendAction -= sendAction; } private void FixedUpdate() { if (senders.Count == 0) return;//不需要发送数据时不执行 if (sendInterval > Time.fixedUnscaledDeltaTime)//跳帧计时发送 { sendTimer -= Time.fixedUnscaledDeltaTime; if (sendTimer <= 0) { sendTimer = sendInterval; SendSyncName(); } } else//每帧直接发送 { SendSyncName(); } } private void SendSyncName() { sendAction?.Invoke(senders); } /// /// 注入同步数据 /// /// 分辨物体的名称 /// 数据 /// 数据类型 public void InjectSyncData(string goName,object value,string msgType=null) { if (handlersDic.ContainsKey(goName)) handlersDic[goName].HandleSyncData(value, msgType); } //添加消息发生器 public void AddSender(ISyncSender syncSender) { if (!senders.Contains(syncSender)) senders.Add(syncSender); } //移除消息发生器 public void RemoveSender(ISyncSender syncSender) { if (senders.Contains(syncSender)) senders.Remove(syncSender); } //添加同步消息处理器 public void AddHandler(ISyncHandler syncHandler) { string handlerName = syncHandler.GetSoleName(); if (handlersDic.ContainsKey(handlerName))//添加时已经存在该名称的处理器 { if (handlersDic[handlerName] == syncHandler)//重复添加同一个处理器不做处理 return; else { Debug.LogWarning($"{handlerName}覆盖原有的同步处理器,可能引发异常!"); } } handlersDic[handlerName] = syncHandler;//添加到字典中 syncHandler.InitInterval(sendInterval); } //移除同步消息处理物体 public void RemoHandler(ISyncHandler syncHandler) { string handlerName = syncHandler.GetSoleName(); if (handlersDic.ContainsKey(handlerName))//存在的移除 { handlersDic.Remove(handlerName);//添加到字典中 } } }