- LocalizationManager: 新增翻译表(SetFormatted/SetDuration/LocalizeOperateMsg) - LoginPanel: InputField placeholder本地化、字体颜色保持 - HistoryPanel: 用时数据本地化、placeholder本地化 - RecordDetailPanel: 操作详情消息本地化(LanguageChanged重建) - AppraiseWindowBase: 评价等级本地化、操作消息重建 - EditorAppraiser: 所有评估消息改用InjectOperateMsgLocalized - StudentOperateRecorder: 新增InjectOperateMsgLocalized方法 - LocalizationLanguageTestBar: 单例模式、ScreenSpaceOverlay筛选 - 字体切换时保留颜色和verticalOverflow
196 lines
8.5 KiB
C#
196 lines
8.5 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.SceneManagement;
|
|
using XFramework;
|
|
using XFramework.NetOuter;
|
|
using EnviroSamples;
|
|
using UnityEngine.Events;
|
|
//AB包场景 用于编队行军和修理所展开科目
|
|
public class StudentABScene : SceneState
|
|
{
|
|
NetSubNameEnum subName;
|
|
GameObject areaPrefab;//一区九厂预制件
|
|
GameObjectPiaker objectPiaker;//物体拾取器
|
|
string TerrainName;
|
|
object subParameter;//科目数据类
|
|
string weatherName;
|
|
|
|
SyncSceneAB syncSceneAB;
|
|
/// <summary>
|
|
/// AB包场景
|
|
/// </summary>
|
|
/// <param name="sceneName">AB包中的场景名称</param>
|
|
/// <param name="subName">科目名称</param>
|
|
/// <param name="sceneParameter">场景初始化相关参数</param>
|
|
public StudentABScene(string sceneName, NetSubNameEnum subName,object sceneParameter,string weather)
|
|
{
|
|
this.sceneName = sceneName;
|
|
TerrainName = sceneName;//地形名称=场景名称
|
|
this.subName = subName;
|
|
this.subParameter = sceneParameter;
|
|
async = true;
|
|
loadPanel = true;
|
|
weatherName = weather;
|
|
}
|
|
|
|
protected override void SceneLoaded(Scene scene, LoadSceneMode mode)
|
|
{
|
|
base.SceneLoaded(scene, mode);
|
|
panelManager.InitCanvasScaler(UnityEngine.UI.CanvasScaler.ScaleMode.ScaleWithScreenSize, new Vector2(1920, 1080), 1);
|
|
StudentOperateRecorder.Instance.StartTiming();//场景加载完成 记录开始时间
|
|
EventCenter.Instance.AddEventListener<StudentButtonIcon>(IconType.areaFlage.ToString(), CreatAreaFlage);
|
|
EventCenter.Instance.AddEventListener<string, TransGesture>("SyncCreatArea", SyncCreatAreaFlage);
|
|
EventCenter.Instance.AddEventListener<List<TuFaData>>("CreatTuFaTrigger", CreatTuFa);
|
|
GameObject.Instantiate(Resources.Load<GameObject>(ResourcesManager.GetPath("Camera")));
|
|
switch (subName)
|
|
{
|
|
case NetSubNameEnum.编队行军:
|
|
panelManager.Push(new StudentSub1EditorPanel());
|
|
PermissibleArea permissibleArea = GetPermissibleArea();
|
|
if (permissibleArea.areaWorldPostion != Vector3.zero)
|
|
panelManager.ChangePanel("PermissibleArea", permissibleArea);
|
|
EventCenter.Instance.AddEventListener("ArriveDestination", ArriveDestination);//到达目的地
|
|
break;
|
|
case NetSubNameEnum.修理所展开: //启用VR 启用相机交互逻辑
|
|
|
|
panelManager.Push(new StudentSub2EditorPanel());
|
|
if (GroupLearnHelper.isGroup)//分组训练时 初始化UDP相关逻辑
|
|
{
|
|
CreatSyncEnvironment();//
|
|
syncSceneAB = new SyncSceneAB();//绑定场景同步物体发送/处理逻辑
|
|
}
|
|
//GameObjectCreater.CreateCar()
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
panelManager.ChangePanel(subParameter);
|
|
areaPrefab = Resources.Load<GameObject>(ResourcesManager.GetPath("AreaFlag"));
|
|
GameObject[] waters = GameObject.FindGameObjectsWithTag("Water");//查找水源标记 创建水面效果
|
|
if (waters != null)
|
|
{
|
|
for (int i = 0; i < waters.Length; i++)
|
|
{
|
|
WaterManager waterManager = waters[i].AddComponent<WaterManager>();
|
|
float scale = float.Parse(waters[i].gameObject.name.Split('_')[1]);
|
|
if (scale > 0 && scale < 5)
|
|
{
|
|
waterManager.SetScale(scale);
|
|
}
|
|
}
|
|
}
|
|
MyEnviroManager.Instance.ChangeFocus(Camera.main.gameObject, Camera.main);
|
|
MyEnviroManager.Instance.SetWeather(weatherName);
|
|
//InitWeather();
|
|
}
|
|
|
|
//创建UDP同步环境 和VR人物姿态展示模型
|
|
private static void CreatSyncEnvironment()
|
|
{
|
|
SyncGOManager.CreateInstance();//创建场景同步管理器
|
|
NetUDPManager.Instance.InitUdp($"239.0.0.{GroupLearnHelper.groupNumber}", 8989, 8989, UDPType.Group);//创建UDP网络消息管理器并加入组播 组播端口默认为8989
|
|
GameObjectCreater.CreatSyncVRPerson(GroupLearnHelper.otherUser);//创建展示其他VR操作人员人形物体
|
|
}
|
|
|
|
public override void OnExit()
|
|
{
|
|
base.OnExit();
|
|
EventCenter.Instance.RemoveEnvetListener<StudentButtonIcon>(IconType.areaFlage.ToString(), CreatAreaFlage);
|
|
EventCenter.Instance.RemoveEnvetListener<List<TuFaData>>("CreatTuFaTrigger", CreatTuFa);
|
|
EventCenter.Instance.RemoveEnvetListener<string, TransGesture>("SyncCreatArea", SyncCreatAreaFlage);
|
|
MyEnviroManager.Instance.Stop();//场景结束时关闭天气系统
|
|
if (GroupLearnHelper.isGroup)//退出场景时 注销UDP函数事件
|
|
{
|
|
syncSceneAB.StopSync();//注销场景同步物体发送/处理逻辑
|
|
}
|
|
}
|
|
|
|
//获取允许摆放区域的相关参数 用于UI初始化 未重新打包ab 使用测试数据
|
|
private PermissibleArea GetPermissibleArea()
|
|
{
|
|
GameObject PermissibleBox = GameObject.Find("PermissibleArea");
|
|
CameraCtrl.Instance.LookAtTarget(PermissibleBox.transform);//初始化相机位置 到出发点
|
|
if (PermissibleBox == null)
|
|
return default(PermissibleArea);
|
|
PermissibleArea permissibleArea;
|
|
permissibleArea.areaWorldPostion = PermissibleBox.transform.position;
|
|
permissibleArea.angle = PermissibleBox.transform.eulerAngles.y;
|
|
permissibleArea.areaSize = new Vector2(PermissibleBox.transform.localScale.x, PermissibleBox.transform.localScale.z);
|
|
//PermissibleArea permissibleArea; //测试数据
|
|
//permissibleArea.areaWorldPostion = new Vector3(659.5f, 245.4f, 6637.1f);
|
|
//permissibleArea.areaSize = new Vector2(90, 250);
|
|
//permissibleArea.angle = 118.38f;
|
|
return permissibleArea;
|
|
}
|
|
|
|
//编队行军到达目的地后执行 编队行军只发生在连续训练科目中
|
|
private void ArriveDestination()
|
|
{
|
|
//SubRecordClass subRecordClass = Game.sceneParameter as SubRecordClass;
|
|
//if (subRecordClass.isContinuity)//连续训练
|
|
//{
|
|
panelManager.Pop();
|
|
panelManager.Push(new StudentSub2EditorPanel());
|
|
panelManager.ChangePanel("continuity", TerrainName);
|
|
//}
|
|
//else
|
|
//{
|
|
// SceneSystem.Instance.SetScene(new StudentLoginScene( LoadSceneType.Login));
|
|
// // Game.SendMessage("Result", "");//成绩梳理 后续实现
|
|
//}
|
|
TCPManager.Instance.SendSubStage(NetSubStage.其他阶段);//抵达目的地时 发送状态到教员端 关闭可导调的状态
|
|
AdjustingManager.Destory();//销毁导调数据管理类
|
|
|
|
GameObjectManager.Instance.SetAdjustingState(false);
|
|
EventCenter.Instance.RemoveEnvetListener("ArriveDestination", ArriveDestination);//到达目的地后 移除该事件
|
|
}
|
|
|
|
GameObject flagParent;
|
|
//触发UI图标创建一区九厂定位棋
|
|
private void CreatAreaFlage(StudentButtonIcon areaButton)
|
|
{
|
|
if (flagParent == null)
|
|
{
|
|
flagParent = new GameObject("Areaflage");
|
|
}
|
|
if (objectPiaker == null)
|
|
{
|
|
objectPiaker = CameraCtrl.Instance.transform.GetOrAddComponent<GameObjectPiaker>();
|
|
}
|
|
GameObject areaGO = objectPiaker.GetCurrentPickGO();
|
|
if (areaGO == null)//当前没有未完成放置的厂区标记
|
|
{
|
|
areaGO = GameObject.Instantiate<GameObject>(areaPrefab,flagParent.transform);
|
|
}
|
|
areaGO.GetComponent<AreaFlageCtrl>().InitFlage(areaButton);
|
|
objectPiaker.InjectGO(areaGO.GetComponent<IPicked>());
|
|
}
|
|
|
|
private void SyncCreatAreaFlage( string areaName,TransGesture trans)
|
|
{
|
|
if (flagParent == null)
|
|
{
|
|
flagParent = new GameObject("Areaflage");
|
|
}
|
|
GameObject areaGO = GameObject.Instantiate<GameObject>(areaPrefab, flagParent.transform);
|
|
areaGO.GetComponent<AreaFlageCtrl>().SyncInitFlage(areaName, trans);
|
|
}
|
|
|
|
GameObject tufaRoot;//突发事件触发器父物体
|
|
/// <summary>
|
|
/// 创建突发事件触发器
|
|
/// </summary>
|
|
/// <param name="tuFaDatas"></param>
|
|
private void CreatTuFa(List<TuFaData> tuFaDatas)
|
|
{
|
|
if (tufaRoot == null)
|
|
{
|
|
tufaRoot = new GameObject("TuFaRoot");
|
|
tufaRoot.transform.SetParent(GameObjectManager.Instance.transform);
|
|
}
|
|
GameObjectCreater.CreateTufaTrigger(tuFaDatas, tufaRoot.transform);
|
|
}
|
|
|
|
}
|