unityzgy/Assets/Scripts/PublicTool/SyncGO/SyncGOManager.cs
ayuan9957 bf12e02276 feat: 多语言本地化系统 - 支持中/英/法/俄实时切换
- LocalizationManager: 新增翻译表(SetFormatted/SetDuration/LocalizeOperateMsg)
- LoginPanel: InputField placeholder本地化、字体颜色保持
- HistoryPanel: 用时数据本地化、placeholder本地化
- RecordDetailPanel: 操作详情消息本地化(LanguageChanged重建)
- AppraiseWindowBase: 评价等级本地化、操作消息重建
- EditorAppraiser: 所有评估消息改用InjectOperateMsgLocalized
- StudentOperateRecorder: 新增InjectOperateMsgLocalized方法
- LocalizationLanguageTestBar: 单例模式、ScreenSpaceOverlay筛选
- 字体切换时保留颜色和verticalOverflow
2026-07-16 10:05:59 +08:00

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);//添加到字典中
}
}
}