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; /// /// AB包场景 /// /// AB包中的场景名称 /// 科目名称 /// 场景初始化相关参数 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(IconType.areaFlage.ToString(), CreatAreaFlage); EventCenter.Instance.AddEventListener("SyncCreatArea", SyncCreatAreaFlage); EventCenter.Instance.AddEventListener>("CreatTuFaTrigger", CreatTuFa); GameObject.Instantiate(Resources.Load(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(ResourcesManager.GetPath("AreaFlag")); GameObject[] waters = GameObject.FindGameObjectsWithTag("Water");//查找水源标记 创建水面效果 if (waters != null) { for (int i = 0; i < waters.Length; i++) { WaterManager waterManager = waters[i].AddComponent(); 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(IconType.areaFlage.ToString(), CreatAreaFlage); EventCenter.Instance.RemoveEnvetListener>("CreatTuFaTrigger", CreatTuFa); EventCenter.Instance.RemoveEnvetListener("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(); } GameObject areaGO = objectPiaker.GetCurrentPickGO(); if (areaGO == null)//当前没有未完成放置的厂区标记 { areaGO = GameObject.Instantiate(areaPrefab,flagParent.transform); } areaGO.GetComponent().InitFlage(areaButton); objectPiaker.InjectGO(areaGO.GetComponent()); } private void SyncCreatAreaFlage( string areaName,TransGesture trans) { if (flagParent == null) { flagParent = new GameObject("Areaflage"); } GameObject areaGO = GameObject.Instantiate(areaPrefab, flagParent.transform); areaGO.GetComponent().SyncInitFlage(areaName, trans); } GameObject tufaRoot;//突发事件触发器父物体 /// /// 创建突发事件触发器 /// /// private void CreatTuFa(List tuFaDatas) { if (tufaRoot == null) { tufaRoot = new GameObject("TuFaRoot"); tufaRoot.transform.SetParent(GameObjectManager.Instance.transform); } GameObjectCreater.CreateTufaTrigger(tuFaDatas, tufaRoot.transform); } }