- LocalizationManager: 新增翻译表(SetFormatted/SetDuration/LocalizeOperateMsg) - LoginPanel: InputField placeholder本地化、字体颜色保持 - HistoryPanel: 用时数据本地化、placeholder本地化 - RecordDetailPanel: 操作详情消息本地化(LanguageChanged重建) - AppraiseWindowBase: 评价等级本地化、操作消息重建 - EditorAppraiser: 所有评估消息改用InjectOperateMsgLocalized - StudentOperateRecorder: 新增InjectOperateMsgLocalized方法 - LocalizationLanguageTestBar: 单例模式、ScreenSpaceOverlay筛选 - 字体切换时保留颜色和verticalOverflow
120 lines
3.6 KiB
C#
120 lines
3.6 KiB
C#
using DevelopEngine;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
using XFramework;
|
|
|
|
//同步管理器 每帧发送状态数据 并处理同步数据
|
|
//事件同步数据 只处理 由Sender自身发送
|
|
public class SyncGOManager : MonoSingleton<SyncGOManager>
|
|
{
|
|
List<IStateSyncSend> senders = new List<IStateSyncSend>();
|
|
UnityAction<List<IStateSyncSend>> sendAction;
|
|
Dictionary<string,ISyncHand> handlersDic = new Dictionary<string,ISyncHand>();
|
|
public float sendInterval;//发送事件间隔 不设置时默认为最小间隔FixedTime 0.02f 设置小于0.02f的时间无效 无效时每帧发送
|
|
|
|
float sendTimer;//数据发送计时器
|
|
// Start is called before the first frame update
|
|
void Start()
|
|
{
|
|
sendTimer = sendInterval;
|
|
}
|
|
/// <summary>
|
|
/// 注册状态同步消息发送方法
|
|
/// </summary>
|
|
/// <param name="sendAction"></param>
|
|
public void RegisterSendFun(UnityAction<List<IStateSyncSend>> sendAction)
|
|
{
|
|
this.sendAction += sendAction;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 注销状态同步消息发送方法
|
|
/// </summary>
|
|
/// <param name="sendAction"></param>
|
|
public void RemoveSendFun(UnityAction<List<IStateSyncSend>> 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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 注入同步数据
|
|
/// </summary>
|
|
/// <param name="goName">分辨物体的名称</param>
|
|
/// <param name="value">数据</param>
|
|
/// <param name="msgType">数据类型</param>
|
|
public void InjectSyncData(string goName,object value,string msgType=null)
|
|
{
|
|
if (handlersDic.ContainsKey(goName))
|
|
handlersDic[goName].HandleSyncData(value, msgType);
|
|
}
|
|
|
|
//添加消息发生器
|
|
public void AddSender(IStateSyncSend syncSender)
|
|
{
|
|
if (!senders.Contains(syncSender))
|
|
senders.Add(syncSender);
|
|
}
|
|
|
|
//移除消息发生器
|
|
public void RemoveSender(IStateSyncSend syncSender)
|
|
{
|
|
if (senders.Contains(syncSender))
|
|
senders.Remove(syncSender);
|
|
}
|
|
|
|
//添加同步消息处理器
|
|
public void AddHandler(ISyncHand 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(ISyncHand syncHandler)
|
|
{
|
|
string handlerName = syncHandler.GetSoleName();
|
|
if (handlersDic.ContainsKey(handlerName))//存在的移除
|
|
{
|
|
handlersDic.Remove(handlerName);//添加到字典中
|
|
}
|
|
}
|
|
|
|
}
|