unityzgy/Assets/Scripts/UIScripts/Teacher/Subject2EditorCtrl.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

208 lines
8.0 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using XFramework;
public class Subject2EditorCtrl : SubjectEditorBase
{
const string panelName = "Panel_subjects2Editor";
public EditorContentCtrl equipContent;
//public EditorContentCtrl childEquipContent;
//public EditorContentCtrl personContent;
public CarDetailCtrl CarDetail;
public GameObject carInstacnePrefab;
public GameObject onboardInstancePrefab;
public List<CarIconInstanceCtrl> onMapCars = new List<CarIconInstanceCtrl>();//放置在地图上的图标 不包括生成未完成放置的
List<string> allCarNames = new List<string>();//记录已经放置在地图上的车辆名称 避免重名
string personPath = Application.streamingAssetsPath + "/Config/人员库.txt";
private IconBase currentDragIcon;
Sub2RecordClass recordClass ;
public Subject2EditorCtrl():base(panelName)
{
}
// Start is called before the first frame update
protected override void InitEvent()
{
base.InitEvent();
//EventCenter.Instance.AddEventListener<IconBase>("CreatOnboard", CreatOnboardInstance); //无需摆放人员 暂时注释
carInstacnePrefab = Resources.Load<GameObject>(ResourcesManager.GetPath("Image_carInstance"));
onboardInstancePrefab = Resources.Load<GameObject>(ResourcesManager.GetPath("Image_onboardInstance"));
equipContent = ActivePanel.FindChildTrans("Content_equip").GetComponent<EditorContentCtrl>();
//personContent = ActivePanel.FindChildTrans("Content_person").GetComponent<EditorContentCtrl>();
CarDetail = ActivePanel.transform.Find("Image_装备详情").GetComponent<CarDetailCtrl>();
recordClass = null;
InitContentIcon();
}
//弹出本窗口时 隐藏详情界面 注册界面监听事件
public override void OnStart()
{
base.OnStart();
CarDetail.Hide();
EventCenter.Instance.AddEventListener<CarIconInstanceCtrl, bool>("SelectCarEditor", AddOrRemoveCarOnMap);
EventCenter.Instance.AddEventListener<IconBase>("CreatCar", CreatCarInstanceForDrag);
}
//本界面销毁时清空已经创建的物体 注销监听事件
public override void OnDestroy(bool isDestroy = false)
{
base.OnDestroy(isDestroy);
for (int i = 0; i < onMapCars.Count; i++)
{
GameObject.Destroy(onMapCars[i].gameObject);
}
onMapCars.Clear();
allCarNames.Clear();
EventCenter.Instance.RemoveEnvetListener<CarIconInstanceCtrl, bool>("SelectCarEditor", AddOrRemoveCarOnMap);
EventCenter.Instance.RemoveEnvetListener<IconBase>("CreatCar", CreatCarInstanceForDrag);
}
//放置/删除一辆车 并生成唯一名称
private void AddOrRemoveCarOnMap(CarIconInstanceCtrl arg0, bool arg1)
{
string carTypeName = arg0.text_IconName.text;
if (arg1)
{
onMapCars.Add(arg0);
int number = 1;
string tempName = carTypeName;
while (allCarNames.Contains(tempName))
{
tempName = $"{carTypeName}({number})";
number++;
}
carTypeName = tempName;
arg0.SetName(carTypeName);
allCarNames.Add(carTypeName);
}
else
{
onMapCars.Remove(arg0);
allCarNames.Remove(carTypeName);
}
if (arg0 == currentDragIcon)
currentDragIcon = null;
}
////创建一个待放置的 车载物体示例图标
//private void CreatOnboardInstance(IconBase arg1)
//{
// if (tempIcon != null) return;
// IconCreaterCtrl iconCreater = arg1 as IconCreaterCtrl;
// tempIcon = GameObject.Instantiate(onboardInstancePrefab, image_Map.transform).GetComponent<OnboardInstanceCtrl>();
// tempIcon.SetName(arg1.text_IconName.text);
// tempIcon.SetSprite(arg1.image_Icon.sprite);
// tempIcon.SetUpdateIconMsg(iconCreater.createrType);
//}
//创建一个待放置的汽车图标实例
private void CreatCarInstanceForDrag(IconBase arg1)
{
if (currentDragIcon != null) return;//当前有拖拽的物体
currentDragIcon= CreatCarInstance(arg1.text_IconName.text, arg1.image_Icon.sprite);
}
/// <summary>
/// 创建一个设为地图子物体的车辆图标
/// </summary>
/// <param name="name">车辆名称</param>
/// <param name="sprite">图标</param>
private IconBase CreatCarInstance(string name, Sprite sprite)
{
IconBase newIcon = GameObject.Instantiate(carInstacnePrefab, image_Map.transform).GetComponent<CarIconInstanceCtrl>();
newIcon.SetName(name);
newIcon.SetSprite(sprite);
CarIconIntacneInitData initData = new CarIconIntacneInitData();
if (OnboardManager.Instance.onboardDic.ContainsKey(name))
initData.onboardEquipDic[OnboardManager.Instance.onboardDic[name]] = 1;
newIcon.SetUpdateIconMsg(initData, "Init");
return newIcon;
}
//教员编辑时 无需分配人员 只关注车辆位置
void InitContentIcon()
{
string[] carsName = DBManager.Instance.GetABNames(ABType.);//File.ReadAllLines(equipPath);
equipContent.CreatChildren(carsName, IconLoadedOver);
//string[] personNames = File.ReadAllLines(personPath);
//personContent.CreatChildren(personNames);
//string[] childEquipNames = DBManager.Instance.GetABNames(ABType.工具);
//childEquipContent.CreatChildren(childEquipNames);
}
public override void SaveFile()
{
recordClass = new Sub2RecordClass();
recordClass.TerrainName = dropdown_Terrain.options[ dropdown_Terrain.value].text;
recordClass.taskIntr = input_TaskIntr.text;
recordClass.fileIntr = input_FileIntr.text;
recordClass.onMapCars.Clear();
for (int i = 0; i < onMapCars.Count; i++)
{
//recordClass.onMapCars.Add(new OnMapCarData(onMapCars[i].text_IconName.text, onMapCars[i].GetComponent<RectTransform>().anchoredPosition,
// onMapCars[i].transform.localEulerAngles.z, onMapCars[i].personNames, onMapCars[i].chidlEquipNames));
recordClass.onMapCars.Add(onMapCars[i].GetCarIconData());
}
string path = $"{Application.streamingAssetsPath}/XML/修理所展开/修理所展开科目{DateTime.Now.ToString().Replace('/', '_').Replace(':', ' ')}.xml";
bool result= XmlHelper.SerializeObjectXML(recordClass, typeof(Sub2RecordClass), path);
if (result)
{
Push(new PromptWindows()).Change(new PromptWindowInitData(LocalizationManager.Format("想定文件生成成功!文件路径为:{0}", path), null));
}
}
bool loadedOver = false;
/// <summary>
/// 图标资源加载完成 后创建想定文件中记录的车辆 仅首次加载本界面时触发
/// </summary>
void IconLoadedOver()
{
loadedOver = true;
if (recordClass != null)
{
CreatOnMapCar(recordClass.onMapCars);
}
}
//根据想定文件初始化界面
public override void Change(object value)
{
recordClass = value as Sub2RecordClass;
if(loadedOver)//首次无法触发
CreatOnMapCar(recordClass.onMapCars);
}
//直接在地图上创建车辆信息
private async void CreatOnMapCar( List<OnMapCarData> onMapCars)
{
for (int i = 0; i < recordClass.onMapCars.Count; i++)//创建车辆图标 并放置在地图上
{
string equipTypeName = onMapCars[i].name.Split('(')[0];
string path = StreamingAssetsManager.GetPath($"{equipTypeName}_Tex");
Sprite sprite = await OutSpriteLoader.LoadSprite(path);
IconBase iconBase= CreatCarInstance(onMapCars[i].name, sprite);
iconBase.GetComponent<DragIcon>()?.SetFixedAnchoredPos(new Vector2(onMapCars[i].aPX, onMapCars[i].aPY));
AddOrRemoveCarOnMap(iconBase as CarIconInstanceCtrl,true);
}
}
}