unityzgy/.svn/pristine/65/65274639aefe344fdb9a57fc41a383b6dbb4e227.svn-base
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

110 lines
3.3 KiB
Plaintext

using DevelopEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using XFramework;
//同步管理器 每帧发送状态数据 并处理同步数据
//事件同步数据 只处理 由Sender自身发送
public class SyncGOManager : MonoSingleton<SyncGOManager>
{
List<ISyncSender> senders = new List<ISyncSender>();
UnityAction<List<ISyncSender>> sendAction;
Dictionary<string,ISyncHandler> handlersDic = new Dictionary<string,ISyncHandler>();
public float sendInterval;//发送事件间隔 不设置时默认为最小间隔FixedTime 0.02f 设置小于0.02f的时间无效 无效时每帧发送
// Start is called before the first frame update
void Start()
{
timer = sendInterval;
}
/// <summary>
/// 注册状态同步消息发送方法
/// </summary>
/// <param name="sendAction"></param>
public void RegisterSendFun(UnityAction<List<ISyncSender>> sendAction)
{
this.sendAction = sendAction;
}
float timer;
private void FixedUpdate()
{
if (senders.Count == 0) return;//不需要发送数据时不执行
if (sendInterval > Time.fixedUnscaledDeltaTime)//跳帧计时发送
{
timer -= Time.fixedUnscaledDeltaTime;
if (timer <= 0)
{
timer = 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(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);//添加到字典中
}
}
}