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