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

294 lines
12 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using XFramework;
using XFramework.Objects;
/// <summary>
/// 教员端 导调界面
/// </summary>
public class AdjustingPanel : BasePanel
{
const string panelName = "Panel_Adjusting";
RawImage image_Map;
Button button_stop;//结束导调
EditorContentCtrl contentCtrl;//突发事件列表
GameObject tufaInstancePrefab;
GameObject carInstacnePrefab;
List<TuFaInstanceIconCtrl> onMapTuFa = new List<TuFaInstanceIconCtrl>();
Dictionary<string, CarIconInstanceCtrl> carTransDic = new Dictionary<string, CarIconInstanceCtrl>();
int maxID;//突发事件最大ID值
string tufaInstancePrefabName = "Image_tufaInstance";
IconBase tempIcon;
PlanningPlaneCtrl planeCtrl;
Text text_tufaHandleMsg;
Text text_stuMsg;//学员信息
GameObject waitingPanel;//初始化完成前遮挡地图 并提示
OnlineStudent stuData;//记录待导调的学员信息
public AdjustingPanel():base(new UIType(panelName))
{
}
protected override void InitEvent()
{
image_Map = ActivePanel.FindChildTrans("Image_map").GetComponent<RawImage>();
button_stop = ActivePanel.FindChildTrans("Button_finish").GetComponent<Button>();
contentCtrl = ActivePanel.FindChildTrans("Content_tufa").GetComponent<EditorContentCtrl>();
text_tufaHandleMsg = ActivePanel.FindChildTrans("Text_tufaMsg").GetComponent<Text>();
text_stuMsg = ActivePanel.FindChildTrans("Text_stuMsg").GetComponent<Text>();
waitingPanel = ActivePanel.FindChildTrans("Image_waiting").gameObject;
button_stop.onClick.AddListener(StopAdjusting);
planeCtrl = image_Map.GetComponent<PlanningPlaneCtrl>();
tufaInstancePrefab = Resources.Load<GameObject>(ResourcesManager.GetPath(tufaInstancePrefabName));
carInstacnePrefab = Resources.Load<GameObject>(ResourcesManager.GetPath("Image_carInstance"));
CreatTuFaList();
}
public override void OnStart()
{
base.OnStart();
waitingPanel.gameObject.SetActive(true);
EventCenter.Instance.AddEventListener<IconBase>("CreatTuFa", CreatTuFaInstance);
EventCenter.Instance.AddEventListener<TuFaInstanceIconCtrl, bool>("SelectTuFaEditor", SelectTuFa);
EventCenter.Instance.AddEventListener<AdjustingCarIconData[]>("SynCarPos", SynCarIconPos);
EventCenter.Instance.AddEventListener<NetTuFaHandleMsg>("SynTuFa", BroadTuFaEvent);
EventCenter.Instance.AddEventListener<string, NetAdjustingInitData>("NetAdjustingInitData", InitPanel);
EventCenter.Instance.AddEventListener<string, NetSubStage>("ChangeStudentStage", StudentChangeStage);
}
public override void OnDestroy(bool isDestroy = false)
{
base.OnDestroy(isDestroy);
EventCenter.Instance.RemoveEnvetListener<TuFaInstanceIconCtrl, bool>("SelectTuFaEditor", SelectTuFa);
EventCenter.Instance.RemoveEnvetListener<IconBase>("CreatTuFa", CreatTuFaInstance);
EventCenter.Instance.RemoveEnvetListener<AdjustingCarIconData[]>("SynCarPos", SynCarIconPos);
EventCenter.Instance.RemoveEnvetListener<NetTuFaHandleMsg>("SynTuFa", BroadTuFaEvent);
EventCenter.Instance.RemoveEnvetListener<string, NetAdjustingInitData>("NetAdjustingInitData", InitPanel);
EventCenter.Instance.RemoveEnvetListener<string, NetSubStage>("ChangeStudentStage", StudentChangeStage);//本界面弹出后 不监听转阶段事件
planeCtrl.Clear();
for (int i = 0; i < onMapTuFa.Count; i++)
{
ObjectPool.Instance.Destroy(onMapTuFa[i].gameObject);
}
onMapTuFa.Clear();
foreach (var item in carTransDic)
{
ObjectPool.Instance.Destroy(item.Value.gameObject);
}
carTransDic.Clear();
text_tufaHandleMsg.text = "";
}
//根据学员信息初始化界面 并等待学员数据
public override void Change(object newData)
{
stuData = (OnlineStudent)newData;
text_stuMsg.text = $"{stuData.user}({stuData.ip})";
}
//根据内存信息创建包含所有类型的 突发信息列表
private void CreatTuFaList()
{
List<string> tufaNames = new List<string>();
foreach (string name in Enum.GetNames(typeof(TuFaEnum)))
{
tufaNames.Add(name);
}
//string[] tufaNames = new string[] { "敌机侦察", "敌机打击", "化学沾染地带", "越过染毒地带", "小股敌人袭扰", "道路阻断", "友邻装备轻度损伤" , "友邻装备重度损伤" };
contentCtrl.CreatChildren(tufaNames.ToArray());
}
//教员端主动结束导调
private void StopAdjusting()
{
TCPManager.Instance.SendAdjusting(stuData.ip,false);
Pop();
}
//先根据信息初始化地图信息 之后在地图上加载对应的装备
async void InitPanel(string ip, NetAdjustingInitData initData)
{
if (ip != this.stuData.ip)
{
Debug.Log("传回的导调界面数据非指定用户!");
return;
}
//先加载地图 并等待地图加载完毕
Texture2D texture = await OutSpriteLoader.LoadTexture(StreamingAssetsManager.GetPath($"{initData.mapName}_Map") );
image_Map.texture = texture;
image_Map.SetNativeSize();
image_Map.GetComponent<MyDragMap>()?.InitSize();
//根据传回的锚点位置在地图上创建对应的图标
//在地图上创建已有的突发事件
for (int i = 0; i < initData.tufaList.Count; i++)
{
CreatTuFaInstanceOnMap(initData.tufaList[i]);
if (i == initData.tufaList.Count - 1)
{
if (i == initData.tufaList[i].ID)
{
maxID = i;
}
else
{
maxID = initData.tufaList[i].ID;
Debug.LogError("突发事件ID与索引数量不匹配");
}
}
}
//在地图上绘制线路
planeCtrl.DrawLine(initData.linesDic);
//在地图上创建行军装备图标
for (int i = 0; i < initData.carIconInitDatas.Count; i++)
{
string equipTypeName = initData.carIconInitDatas[i].carName.Split('(')[0];
//string path = $"{Application.streamingAssetsPath}/OutAssets/Sprite/{equipTypeName}.png";
string path = StreamingAssetsManager.GetPath($"{equipTypeName}_Tex");
Sprite sprite = await OutSpriteLoader.LoadSprite(path);
CarIconInstanceCtrl carIcon = CreatCarInstance(initData.carIconInitDatas[i].carName, sprite);
carIcon.SetFixedAnchoredPos(initData.carIconInitDatas[i].anchorPos.GetVector2());
carIcon.EnterTeacherSynMode();
carTransDic.Add(initData.carIconInitDatas[i].carName, carIcon);
carIcon.SetUpdateIconMsg(initData.carIconInitDatas[i].groupingEnum,"PlanningGroup");
}
waitingPanel.gameObject.SetActive(false);//初始化完成后隐藏遮挡界面
}
//初始化时 直接在地图上创建确定位置的突发事件
void CreatTuFaInstanceOnMap(TuFaData tuFaData)
{
TuFaInstanceIconCtrl tuFaInstance = CreatTuFaIcon(tuFaData.name.ToString());
Sprite sprite = Resources.Load<Sprite>(ResourcesManager.GetPath(tuFaData.name.ToString()));
tuFaInstance.SetFixedAnchoredPos(new Vector2(tuFaData.posX, tuFaData.posY));
tuFaInstance.id = tuFaData.ID;
tuFaInstance.SetSprite(sprite);
onMapTuFa.Add(tuFaInstance);
}
//教员端操作创建一个待放置的突发事件图标
void CreatTuFaInstance(IconBase iconSp)
{
if (tempIcon != null) return;
tempIcon = CreatTuFaIcon(iconSp.text_IconName.text);
tempIcon.SetSprite(iconSp.image_Icon.sprite);
}
//创建一个突发事件图标
TuFaInstanceIconCtrl CreatTuFaIcon(string iconName)
{
TuFaInstanceIconCtrl icon = ObjectPool.Instance.Instantiate(tufaInstancePrefab, image_Map.transform).GetComponent<TuFaInstanceIconCtrl>();
icon.SetName(iconName);
return icon;
}
//教员端主动添加/删除已有突发事件 增加时分配ID
void SelectTuFa(TuFaInstanceIconCtrl iconCtrl, bool value)
{
if (value)
{
onMapTuFa.Add(iconCtrl);
maxID += 1;//避免重复 只加不减
iconCtrl.id = maxID;
}
else
{
onMapTuFa.Remove(iconCtrl);
}
SendTufaToStu(iconCtrl, value);
if (iconCtrl == tempIcon)//当前未放置的icon 完成放置后可再次生成新的拖拽Icon
tempIcon = null;
}
//发送增加/减少突发事件到学员端
private void SendTufaToStu(TuFaInstanceIconCtrl iconCtrl, bool value)
{
TuFaData tuFaData = new TuFaData();
tuFaData.name = (TuFaEnum)Enum.Parse(typeof(TuFaEnum), iconCtrl.text_IconName.text);
tuFaData.ID = iconCtrl.id;
tuFaData.posX = iconCtrl.GetComponent<RectTransform>().anchoredPosition.x;
tuFaData.posY = iconCtrl.GetComponent<RectTransform>().anchoredPosition.y;
TCPManager.Instance.SendChangeTuFa(stuData.ip, value, tuFaData);//发送新增或删除信息到学员端
}
/// <summary>
/// 创建一个设为地图子物体的车辆图标
/// </summary>
/// <param name="name">车辆名称</param>
/// <param name="sprite">图标</param>
private CarIconInstanceCtrl CreatCarInstance(string name, Sprite sprite)
{
CarIconInstanceCtrl newIcon = ObjectPool.Instance.Instantiate(carInstacnePrefab, image_Map.transform).GetComponent<CarIconInstanceCtrl>();
newIcon.SetName(name);
newIcon.SetSprite(sprite);
return newIcon;
}
//同步车辆位置
private void SynCarIconPos(AdjustingCarIconData [] synCarData)
{
for (int i = 0; i < synCarData.Length; i++)
{
if (carTransDic.ContainsKey(synCarData[i].carName))
{
//carTransDic[synCarData[i].carName].anchoredPosition = synCarData[i].anchorPos.GetVector2();
//carTransDic[synCarData[i].carName].localEulerAngles = new Vector3(0,0, );
Vector2 anchoredPos= synCarData[i].anchorPos.GetVector2();
carTransDic[synCarData[i].carName].SetUpdateIconMsg( new Vector3(anchoredPos.x, anchoredPos.y, synCarData[i].angle),"SyncPos");
}
}
}
//对话框播报突发事件信息
private void BroadTuFaEvent(NetTuFaHandleMsg netTuFa)
{
string msgStr = "";
switch (netTuFa.msgType)//不同 的消息类型使用不同颜色的文字区分
{
case TuFaMsgType.trigger:
msgStr = $"<color=#ff0000>{LocalizationManager.Format(":{0}", netTuFa.msg)}</color> \r\n";
break;
case TuFaMsgType.handleRight:
msgStr = $"<color=#7fff00>{LocalizationManager.Format(":{0}", netTuFa.msg)}</color> \r\n";
break;
case TuFaMsgType.handleWrong:
msgStr = $"<color=#eec900>{LocalizationManager.Format(":{0}", netTuFa.msg)}</color> \r\n";
break;
default:
break;
}
text_tufaHandleMsg.text += msgStr;
}
//学员转阶段结束导调
private void StudentChangeStage( string ip, NetSubStage subStage )
{
if (ip == stuData.ip&& subStage== NetSubStage.)
{
Pop();
}
}
}