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

120 lines
4.6 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using VRTK;
using XFramework;
using XFramework.NetOuter;
//内置场景 适用于维修科目
public class StudentBuildInScene : SceneState
{
NetSub3Msg sceneInitData;
VRManager VRManager;
bool enterVR;
SyncBuildInScene syncScene;//场景同步逻辑管理类
public StudentBuildInScene(NetSub3Msg netSub3Msg)
{
sceneName = "fieldRepairScene";
loadPanel = true;
async = true;
sceneInitData = netSub3Msg;
}
Transform equipPos;
protected override void SceneLoaded(Scene scene, LoadSceneMode mode)
{
base.SceneLoaded(scene, mode);
ResourcesCreater.InstantiatePrefab("Camera");
EventCenter.Instance.AddEventListener("ShutDownVR", ShutDownVR);
StudentOperateRecorder.Instance.StartTiming();//场景加载完成 记录开始时间
equipPos = GameObject.Find("EquipPosAnchor").transform;
GameObject equip= ResourcesCreater.InstantiatePrefab($"ToRepaired_{sceneInitData.caseName}",false);//加载与案例对应的待修装备模型
equip.transform.position = equipPos.position;
equip.transform.rotation = equipPos.rotation;
panelManager.Push(new StudentSub3Panel());
panelManager.ChangePanel(sceneInitData.fixLinks);
VRManager = new VRManager("VRTKSDKManager_Sub3", GameObject.Find("VRCameraPos").transform.position);
VRManager.OpenVR(OpenVRResult);//场景加载完成后默认启用VR设备
if (GroupLearnHelper.isGroup)//分组训练时 初始化UDP相关逻辑
{
CreatSyncEnvironment();//
syncScene = new SyncBuildInScene();//绑定场景同步物体发送/处理逻辑
if (!GroupLearnHelper.isMaster)
{
EventCenter.Instance.AddEventListener("StopLearning", CloseVRGOLoginScene);
}
}
}
//设备启用结果回调函数 成功启用给VR相机绑定天气系统 启用失败时 使用第三人称相机 并且给与提示
private void OpenVRResult(bool result, VRTK_SDKManager.LoadedSetupChangeEventArgs e)
{
enterVR = result;
if (enterVR)
{
CameraCtrl.Instance.gameObject.SetActive(false);
MyEnviroManager.Instance.ChangeFocus(e.currentSetup.gameObject, e.currentSetup.actualHeadset.GetComponentInChildren<Camera>());
}
else
{
MyEnviroManager.Instance.ChangeFocus(CameraCtrl.Instance.gameObject, CameraCtrl.Instance.Camera);
CameraCtrl.Instance.UpdateNearZoonMoveClamp();
CameraCtrl.Instance.LookAtTarget(equipPos);
CameraCtrl.Instance.MoveWithRect = false;
panelManager.Push(new PromptWindows());
PromptWindowInitData windowInitData = new PromptWindowInitData(LocalizationManager.Get("VR设备启动失败,无法进行虚拟维修,请检查设备后重试!"), null);
panelManager.ChangePanel(windowInitData);
}
MyEnviroManager.Instance.SetWeather(sceneInitData.weather);
}
public override void OnExit()
{
base.OnExit();
MyEnviroManager.Instance.Stop();//科目结束时关闭天气系统
EventCenter.Instance.RemoveEnvetListener("ShutDownVR", ShutDownVR);
ProcessManager.Instance.ClearProcess();
syncScene?.StopSync();//同步模式结束同步
if (GroupLearnHelper.isGroup && !GroupLearnHelper.isMaster)
{
EventCenter.Instance.RemoveEnvetListener("StopLearning", CloseVRGOLoginScene);
}
}
//创建UDP同步环境 和VR人物姿态展示模型
private void CreatSyncEnvironment()
{
SyncGOManager.CreateInstance();//创建场景同步管理器
NetUDPManager.Instance.InitUdp($"239.0.0.{GroupLearnHelper.groupNumber}", 8989, 8989, UDPType.Group);//创建UDP网络消息管理器并加入组播 组播端口默认为8989
GameObjectCreater.CreatSyncVRPerson(GroupLearnHelper.otherUser);//创建展示其他VR操作人员的物体
}
//主动结束科目时断开连接
private void ShutDownVR()
{
if (enterVR)
{
VRManager.ShoutDwonVR(null);
}
CameraCtrl.Instance.gameObject.SetActive(true);
}
//同步时调用
private void CloseVRGOLoginScene()
{
if (enterVR)
{
VRManager.ShoutDwonVR((p) => SceneSystem.Instance.SetScene(new StudentLoginScene(LoadSceneType.Login)));
}
else
{
SceneSystem.Instance.SetScene(new StudentLoginScene(LoadSceneType.Login));
}
}
}