unityzgy/Assets/Scripts/Scene/StudentABScene.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

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);
}
}