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