- LocalizationManager: 新增翻译表(SetFormatted/SetDuration/LocalizeOperateMsg) - LoginPanel: InputField placeholder本地化、字体颜色保持 - HistoryPanel: 用时数据本地化、placeholder本地化 - RecordDetailPanel: 操作详情消息本地化(LanguageChanged重建) - AppraiseWindowBase: 评价等级本地化、操作消息重建 - EditorAppraiser: 所有评估消息改用InjectOperateMsgLocalized - StudentOperateRecorder: 新增InjectOperateMsgLocalized方法 - LocalizationLanguageTestBar: 单例模式、ScreenSpaceOverlay筛选 - 字体切换时保留颜色和verticalOverflow
294 lines
12 KiB
C#
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();
|
|
}
|
|
}
|
|
|
|
}
|