unityzgy/.svn/pristine/d7/d72abe41b08aa8875af5049bf09efec2cf62a570.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

528 lines
14 KiB
Plaintext

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum RunState
{
/// <summary>
/// 教员端
/// </summary>
teacher,
/// <summary>
/// 客户端
/// </summary>
student,
}
/// <summary>
/// 用户数据类
/// </summary>
[Serializable]
public class User
{
public UserType userType;
public string user;
public string password;
}
//学员记录
public class RecordClassDemo
{
public string user;
public string msg;
}
//记录学员的操作和教员的评价信息 user+time可组成唯一标识
public class OperaterRecording
{
//学员信息
public string user;
//学员训练的开始日期和时间
public string date;
//训练的科目
public string subName;
//训练的模式 训练/考核
public string learnType;
//训练耗时
public string useTime;
//教师评价等级
public string appraiseLevel;
//指定的录屏视频路径
public string videoPath;
//操作记录 用于查看详情时使用
public List<string> operaterMsg;
}
public enum TurnPageType
{
Up,
Down,
}
public enum MessType
{
result,
user,
}
//用户类型
public enum UserType
{
student,
Teacher,
manager,
}
//用户类型
public enum OperateType
{
revise,//修改
add,//新增
}
//学员学习状态
public enum LearnState
{
//等待状态
waiting=0,
//学习状态
learning=1,
//考核状态
examing=2,
}
//学员学习状态显示文本
public enum LearnStateText
{
//等待状态
未下发科目 = 0,
//学习状态
训练中 = 1,
//考核状态
考核中 = 2,
}
//在线学员
public class OnlineStudent
{
public string ip;
public string user;
public LearnState state;
public string subName;//当前科目
public NetSubStage subStage;
public int groupNumber=-1;
public bool isMaster=false;
}
//图标类型
public enum IconType
{
//装备编辑图标
equipEditor,
//人员编辑图标
personnelEditor,
//突发事件编辑图标
accidentEditor,
//突发事件地图实例图标
accidentInstance,
//厂区标记图标
areaFlage,
}
//教员端选择装备库图标数据
public class EquipIconData
{
public string name;
public float speed;
public int count;
public bool isOn;
public EquipIconData()
{
}
public EquipIconData(string Name,float Speed,int Count, bool IsOn)
{
name = Name;
speed = Speed;
count = Count;
isOn = IsOn;
}
}
//放置在地图上的行军车辆数据 显示车载物体时使用
public class OnMapCarData
{
public string name;
//public Vector2 anchorPos;
public float aPX;
public float aPY;
public float angleZ;
public XDictionary<string, int> onboardPersonDic = new XDictionary<string, int>();//车载人员和对应数量
public XDictionary<string, int> onboardEquipDic = new XDictionary<string, int>();//车载装备和对应数量
public OnMapCarData()
{
}
public OnMapCarData(string nameStr, Vector2 anchor, float angle, XDictionary<string, int> personDic, XDictionary<string, int> equipDic)
{
name = nameStr;
aPX = anchor.x;
aPY = anchor.y;
angleZ = angle;
onboardPersonDic = personDic ;
onboardEquipDic = equipDic;
}
}
//设置的突发事件数据
public class TuFaData
{
public TuFaEnum name;
public float posX;//
public float posY;//anchoredPos
public int ID;//突发事件ID 用于区分突发事件
public TuFaData()
{
}
public TuFaData(TuFaEnum nameStr, Vector2 anchorPos)
{
name = nameStr;
posX = anchorPos.x;
posY = anchorPos.y;
}
}
public enum TuFaEnum
{
敌机侦察,
敌机打击,
化学沾染地带,
越过染毒地带,
小股敌人袭扰,
道路阻断,
友邻装备轻度损伤,
友邻装备重度损伤,
}
/// <summary>
/// 编队分组
/// </summary>
public enum FormationGroupingEnum
{
//不连贯训练时默认为该分组
前进保障队,
指挥组,
前出保障组,
抢救抢修队,
主体编队,
殿后保障组,
}
//科目想定基类
[Serializable]
public class RecordBase
{
public NetSubNameEnum subName;
public RecordBase()
{
}
//选用地形
public string TerrainName;
//想定介绍
public string fileIntr;
//任务介绍
public string taskIntr;
}
//科目1想定记录数据类
[Serializable]
public class SubRecordClass:RecordBase
{
public SubRecordClass()
{
subName = NetSubNameEnum.编队行军;
}
//可选用设备
public List<EquipIconData> usedEquips = new List<EquipIconData>();
//可选用人员
public List<string> usedPersons=new List<string>();
//设置的突发事件
public List<TuFaData> tuFaDatas= new List<TuFaData>();
}
[Serializable]
public class Sub2RecordClass : RecordBase
{
public Sub2RecordClass()
{
subName = NetSubNameEnum.修理所展开;
}
[System.Xml.Serialization.XmlElementAttribute("OnMapCarData")]
public List<OnMapCarData> onMapCars = new List<OnMapCarData>();
}
//教员编辑界面初始化数据
public class EditorPanelInitData
{
public string filePath;//文件路径 用于存储时覆盖原有文件
public RecordBase recordBase; //
}
//创建的类型
public enum CreaterType
{
car,
childEquip,
person,
}
public enum ABType
{
装备=1,
工具=2,
地形=3,
天候=4,
}
public class AssetBundleMsg
{
public string assetsName;
public ABType type;
public string filePath;
//搭载装备
public string parentName;
}
/// <summary>
/// 允许摆放区域的相关参数
/// </summary>
public struct PermissibleArea
{
public Vector3 areaWorldPostion;
public Vector2 areaSize;
public float angle;
}
//想定文件存储和再次加载初始化车辆图标信息
public class CarIconIntacneInitData
{
public string setInTargetImage;//应当放置在其他物体名称
public int angle;
public XDictionary<string, int> onboardPersonDic = new XDictionary<string, int>();//车载人员和对应数量
public XDictionary<string, int> onboardEquipDic = new XDictionary<string, int>();//车载装备和对应数量
}
//待创建的车辆信息
public class CarData
{
public IconBase icon;// 对应的UI图标 可用于更新图标
public CarPosType carType;
public string carName;
public Vector3 postion;
public Vector3 rotation;
public float Speed;
public float stopDistance = 100f;//行军时与前车默认间距
public string onboardEquip;//车载装备名称
}
//突发问题相关
public static class TuFaAnswers
{
public static Dictionary<TuFaEnum, TuFaAnswerClass> tufaEvents = new Dictionary<TuFaEnum, TuFaAnswerClass>() {
{TuFaEnum.敌机侦察, new TuFaAnswerClass( new Dictionary<string, int>(){ { "继续行军", -15 },{ "直接停车", -10},{ "利用地物隐蔽",-1 },{ "下车攻击", -20 }},"利用地物隐蔽") } ,
{TuFaEnum.友邻装备轻度损伤, new TuFaAnswerClass(new Dictionary<string, int>(){ { "继续行军", -10 },{ "排除应急抢修组支援修理", 0} ,{ "组织后送", -15} },"排除应急抢修组支援修理") } ,
{TuFaEnum.友邻装备重度损伤, new TuFaAnswerClass(new Dictionary<string, int>(){{ "继续行军", -10 },{ "排除应急抢修组支援修理", -15} ,{ "组织后送", 0} },"组织后送") } ,
{TuFaEnum.小股敌人袭扰, new TuFaAnswerClass(new Dictionary<string, int>(){ { "直接后下车隐蔽",-10 },{ "加速通过,报告上级", -15} ,{ "停车侦察后追击歼灭", 0} },"停车侦察后追击歼灭") } ,
{TuFaEnum.化学沾染地带, new TuFaAnswerClass(new Dictionary<string, int>(){ { "提高车速通过", -10 },{ "匀速通过,收三口", 5} ,{ "提高车速同时收三口(袖口 领口 裤口)", 0} ,{ "匀速通过", -20} },"提高车速同时收三口(袖口 领口 裤口)") } ,
{TuFaEnum.敌机打击, new TuFaAnswerClass( new Dictionary<string, int>(){ { "继续行军", -10 },{ "停车后集中还击", -20} ,{ "停车后分散还击", -5},{ "拉大车距行军", -4}},"拉大车距行军") } ,
{TuFaEnum.越过染毒地带, new TuFaAnswerClass( new Dictionary<string, int>(){ { "匀速行军", -10 },{ "停车进行人员洗消", -5},{ "停车进行人装洗消", 12} },"停车进行人装洗消") } ,
{TuFaEnum.道路阻断, new TuFaAnswerClass(new Dictionary<string, int>(){ { "报告后停车待命", -10 },{ "冒险前进", -15},{ "组织抢救车土工作业后继续前进", 0} },"组织抢救车土工作业后继续前进") } ,
};
}
public class TuFaAnswerClass
{
public Dictionary<string,int> options = new Dictionary<string, int>(); //选项即选项对应的耗时
public string rightOption;//最佳选项
public TuFaAnswerClass(Dictionary<string,int> options,string rightOption)
{
this.options = options;
this.rightOption = rightOption;
}
}
////记录所有的厂区名称 用于UI初始化
//public static class AreaName
//{
// public static List<string> areaNames = new List<string>() { "指控区","油料场", "器材存放场", "弹药场", "修竣装备停放场", "修理场", "待修装备停放场", "洗消场", "待后送装备停放场", "接收场" };
//}
//确定厂区唯一名称
public enum AreaNameEnum
{
指控区,
油料场,
器材存放场,
弹药场,
修竣装备停放场,
修理场,
待修装备停放场,
洗消场,
待后送装备停放场,
接收场,
}
//成绩更新面板数据类
public class ResultMsgToUI
{
public string ip;
public NetAnswerSheet resultMsg;
public ResultMsgToUI()
{
}
public ResultMsgToUI(string ip, NetAnswerSheet netResult)
{
this.ip = ip;
this.resultMsg = netResult;
}
}
public static class OnboardPerson
{
public static Dictionary<string, XDictionary<string, int>> personDic = new Dictionary<string, XDictionary<string, int>>()
{
{ "NY033H型轮式轻型防化分队指挥车",new XDictionary<string, int>(){ { "连长",1},{ "指导员",1},{ "副连长",1 }, { "装甲技师", 1 } } },
{ "ZJQ84Q式中型坦克抢救车",new XDictionary<string, int>(){ { "抢救工", 2},{ "起重工", 1},{ "装甲底盘修理工", 1 }, { "电气修理工", 1 } } },
{ "96A坦克抢救车",new XDictionary<string, int>(){ { "抢救工", 2},{ "装甲底盘修理工", 1},{ "电气修理工", 1 } } },
{ "VME104履带装甲抢修车",new XDictionary<string, int>(){ { "抢救工", 2},{ "火炮修理工", 1},{ "装甲底盘修理工", 1 }, { "火控修理工", 1 }, { "通信修理工", 1 } } },
{ "VMG101履带装甲补给车",new XDictionary<string, int>(){ { "抢救工", 2},{ "装甲底盘修理工", 1 } } },
{ "CXZ411型装甲能源工程车",new XDictionary<string, int>(){ { "电气修理工", 2},{ "车辆综合电子系统修理工", 3} } },
{ "CXZ511型装甲保养工程车",new XDictionary<string, int>(){ { "液压修理工", 1},{ "装甲底盘修理工", 3} } },
{ "徐工QY25K型汽车起重机",new XDictionary<string, int>(){ { "起重工", 1} } },
{ "VME301-5型轮式装备抢救车",new XDictionary<string, int>(){ { "抢救工", 1},{ "汽车修理工", 2} } },
{ "CXC022汽车保养车",new XDictionary<string, int>(){ { "汽车修理工", 3} } },
{ "VME105履带装甲抢修车",new XDictionary<string, int>(){ { "抢救工", 2} } },
{ "徐工QY16K型汽车起重机",new XDictionary<string, int>(){ { "起重工", 2} } },
{ "CXZ311型装甲拆装工程车",new XDictionary<string, int>(){ { "液压修理工", 1},{ "装甲底盘修理工", 3} } },
{ "CXZ511型装甲保养工程车",new XDictionary<string, int>(){ { "液压修理工", 1},{ "装甲底盘修理工", 3 } } },
{ "CXC012汽车修理工程车",new XDictionary<string, int>(){ { "汽车修理工", 3},{ "电气修理工", 1} } },
};//车辆应该具备的标注车载人员
}
/// <summary>
/// 导调界面初始化类
/// </summary>
public class AdjustingPanelInitData
{
public string user;
public string ip;
public NetAdjustingInitData initData;
}
/// <summary>
/// 分组协同训练 全局数据记录类
/// </summary>
public static class GroupLearnHelper
{
public static int groupNumber;
/// <summary>
/// 是否分组训练
/// </summary>
public static bool isGroup;
/// <summary>
/// 是否组长
/// </summary>
public static bool isMaster;
/// <summary>
/// 其他组员
/// </summary>
public static List<SyncUser> otherUser;
static NetLearnGroup netLearn;
/// <summary>
/// 接到科目信息时 注入并分析分组状态
/// </summary>
public static NetLearnGroup GroupLearn
{
set
{
netLearn = value;
if (netLearn != null && netLearn.allStudents.Count > 1)
{
isGroup = true;
isMaster = ThisIP == netLearn.masterIP;
groupNumber = netLearn.groupNumber;
netLearn.allStudents.Remove(ArrayHelper.Find<SyncUser>(netLearn.allStudents.ToArray(), (p) => p.ip == thisIP));//移除代表自己的user
otherUser = netLearn.allStudents;
}
else
{
isGroup = false;
isMaster = false;
}
}
}
static string thisIP;
/// <summary>
/// 获取本机IP
/// </summary>
public static string ThisIP {
get
{
if (string.IsNullOrEmpty(thisIP))
thisIP = ETModel.NetHelper.GetAddressIPV4();
return thisIP;
}
}
}