NewN_UAVPlane/Assets/Zion/Scripts/Adam/GameManager.cs

612 lines
23 KiB
C#

using AdamSync;
using AdamThinkDevicesData;
using PData;
using RDate;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Tenkoku.Core;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using static InterfaceManager;
public class GameManager : MonoSingleton<GameManager>
{
public SyncPlayerTransform playerTransformPrefab;
public SyncPlayerTransform currentSpt;
public Transform redSpawnPos;
public Transform blueSpawnPos;
public List<ulong> userIds = new List<ulong>();
public TenkokuModule tenkokuModule;
public List<ModelInfo> modelsInfo = new List<ModelInfo>();
public Transform dviceContent;
public DragController wrjDrag;
public DragController ldDrag;
public DragController hpDrag;
public DragController wxdDrag;
public DragController ppDrag;
public DragController wbDrag;
public GameObject Teacher;
public GameObject student;
public GameObject posture;
public int wrjCount;
public List<SyncPlayerTransform> players = new List<SyncPlayerTransform>();
public LayerMask RedLayer;
public LayerMask BlueLayer;
public LayerMask TeacherLayer;
public DragController[] wrjDrags;
public Mastermanagement mastermanagement;
/// <summary>
/// 无人机打组操作页面
/// </summary>
public GameObject wrjGroupView;
public EventSystem eventsystem;
/// <summary>
/// 进入导调
/// </summary>
public Button postureBtn;
/// <summary>
/// 进入态势
/// </summary>
public Button teacherBtn;
/// <summary>
/// 卫星影像
/// </summary>
public GameObject satelliteImagery;
// Start is called before the first frame update
private void Awake()
{
if (satelliteImagery != null)
satelliteImagery.SetActive(false);
postureBtn.onClick.AddListener(() =>
{
satelliteImagery.SetActive(false);
ChangeView(0);
});
teacherBtn.onClick.AddListener(() =>
{
satelliteImagery.SetActive(true);
ChangeView(2);
});
wrjGroupView.SetActive(false);
HighPriorityTarget.HighPriorityTargets.Clear();
SyncCreateRoom.getroomusersRequset += OnGetRoomUsers;
SyncCreateRoom.send2roomRequset += OnRoomInfo;
SyncPlayerTransform spt = Instantiate(playerTransformPrefab);
spt.SetPlayerInfo(ulong.Parse(GlobalFlag.currentUser.user_id), GlobalFlag.currentUser.login_name, ulong.Parse(GlobalFlag.roomID), true);
currentSpt = spt;
GameObject saveVideoToPersistentData = GameObject.Find("SaveVideoToPersistentData");
if (saveVideoToPersistentData)
{
saveVideoToPersistentData.GetComponent<SaveVideoToPersistentData>().StartCapture();
saveVideoToPersistentData.transform.SetParent(spt.transform);
saveVideoToPersistentData.transform.localPosition = Vector3.zero;
saveVideoToPersistentData.transform.localEulerAngles = Vector3.zero;
}
ToolsBootstrap.Instance.SetCameraInfo(spt);
//0 red layer ==11 , 1 blue layer ==12
if (UIBootstrap.Instance.GetRoleByIDPracticeId(GlobalFlag.practiceSeatId) == "0")
{
GlobalFlag.blueOrRed = 0;
spt.transform.position = redSpawnPos.position;
spt.transform.eulerAngles = redSpawnPos.eulerAngles;
spt.gameObject.SetActive(true);
//spt.GetComponent<Camera>().cullingMask = ~(1 << 12) + ~(1 << 16) + ~(1 << 17) + ~(1 << 18) + ~(1 << 19) + ~(1 << 20) + ~(1 << 21) + ~(1 << 22);
spt.GetComponent<Camera>().cullingMask = RedLayer;
//spt.GetComponent<Camera>().cullingMask = ~(1 << 15);
AdamThinkDevicesData.DataItem diTemp = UIBootstrap.Instance.GetDeviceByName("蜂群无人机");
if (diTemp.device_count > 0)
{
wrjCount = diTemp.device_count;
for (int i = 0; i < wrjDrags.Length; i++)
{
wrjDrags[i].isPlayer = true;
wrjDrags[i].deviceID = UIBootstrap.Instance.GetDeviceByName("蜂群无人机").id;
}
}
for (int i = 0; i < diTemp.list_para.Count; i++)
{
if (diTemp.list_para[i].para_name.Contains("光学侦察能力") && diTemp.list_para[i].para_value == "1")
{
wrjDrags[0].gameObject.SetActive(false);
}
}
wrjGroupView.SetActive(true);
}
else
{
GlobalFlag.blueOrRed = 1;
for (int i = 0; i < dviceContent.childCount; i++)
{
Destroy(dviceContent.GetChild(i).gameObject);
}
spt.transform.position = blueSpawnPos.position;
spt.transform.eulerAngles = blueSpawnPos.eulerAngles;
spt.gameObject.SetActive(true);
//spt.GetComponent<Camera>().cullingMask = ~(1 << 11) + ~(1 << 16) + ~(1 << 17) + ~(1 << 18) + ~(1 << 19) + ~(1 << 20) + ~(1 << 21) + ~(1 << 22);
spt.GetComponent<Camera>().cullingMask = BlueLayer;
if (UIBootstrap.Instance.GetDeviceByName("探测雷达").device_count > 0)
{
for (int i = 0; i < UIBootstrap.Instance.GetDeviceByName("探测雷达").device_count; i++)
{
DragController ld = Instantiate(ldDrag, dviceContent);
ld.deviceID = UIBootstrap.Instance.GetDeviceByName("探测雷达").id;
mastermanagement.dragControllers.Add(ld);
}
}
if (UIBootstrap.Instance.GetDeviceByName("激光火控平台").device_count > 0)
{
for (int i = 0; i < UIBootstrap.Instance.GetDeviceByName("激光火控平台").device_count; i++)
{
DragController hp = Instantiate(hpDrag, dviceContent);
hp.deviceID = UIBootstrap.Instance.GetDeviceByName("激光火控平台").id;
mastermanagement.dragControllers.Add(hp);
}
}
if (UIBootstrap.Instance.GetDeviceByName("地面无线电干扰").device_count > 0)
{
for (int i = 0; i < UIBootstrap.Instance.GetDeviceByName("地面无线电干扰").device_count; i++)
{
DragController wxd = Instantiate(wxdDrag, dviceContent);
wxd.deviceID = UIBootstrap.Instance.GetDeviceByName("地面无线电干扰").id;
mastermanagement.dragControllers.Add(wxd);
}
}
if (UIBootstrap.Instance.GetDeviceByName("微波武器").device_count > 0)
{
for (int i = 0; i < UIBootstrap.Instance.GetDeviceByName("微波武器").device_count; i++)
{
DragController wxd = Instantiate(wbDrag, dviceContent);
wxd.deviceID = UIBootstrap.Instance.GetDeviceByName("微波武器").id;
mastermanagement.dragControllers.Add(wxd);
}
}
if (UIBootstrap.Instance.GetDeviceByName("频谱探测").device_count > 0)
{
for (int i = 0; i < UIBootstrap.Instance.GetDeviceByName("频谱探测").device_count; i++)
{
DragController wxd = Instantiate(ppDrag, dviceContent);
wxd.deviceID = UIBootstrap.Instance.GetDeviceByName("频谱探测").id;
mastermanagement.dragControllers.Add(wxd);
}
}
}
///04 student 03 teacher
if (GlobalFlag.currentUser.role_code == "04")
{
Teacher.gameObject.SetActive(false);
student.gameObject.SetActive(true);
GlobalFlag.isStartRehearsing = (UIBootstrap.Instance.GetRoomStateById(GlobalFlag.roomID) == 1);
Debug.Log($"<color=red>isStartRehearsing={ GlobalFlag.isStartRehearsing}</color>");
if (GlobalFlag.isStartRehearsing)
{
spt.GetComponent<Camera>().cullingMask = TeacherLayer;
}
}
if (GlobalFlag.currentUser.role_code == "03")
{
GlobalFlag.blueOrRed = 3;
Teacher.gameObject.SetActive(true);
student.gameObject.SetActive(false);
spt.GetComponent<Camera>().cullingMask = TeacherLayer;
}
if (GlobalFlag.currentUser.role_code == "02")
{
Teacher.gameObject.SetActive(false);
student.gameObject.SetActive(false);
posture.gameObject.SetActive(true);
spt.GetComponent<Camera>().cullingMask = TeacherLayer;
}
//spt.GetComponent<Camera>().cullingMask &= ~(1 << 15);
AdamSync.SyncCreateRoom.send2worldRequset += OnGetWorldInfo;
tenkokuModule.mainCamera = spt.transform;
AddPlayers(spt);
DeviceManager.Instance.OnInit();
DeviceManager.Instance.isStartRehearsing = GlobalFlag.isStartRehearsing;
Debug.Log(" GlobalFlag.blueOrRed----" + GlobalFlag.blueOrRed);
}
public void Start()
{
SetWeatherValue();
SetModelValue();
string msg = "getroomusers ";
_ = SyncCreateRoom.SendMessageAsync(msg);
}
public void OnGetWorldInfo(string msg)
{
Debug.Log("OnGetWorldInfo====" + msg);
RemovePlayer(ulong.Parse(msg));
}
private void Update()
{
if (UIBootstrap.Instance.GetRoleByIDPracticeId(GlobalFlag.practiceSeatId) == "0" && Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo, 1000))
{
if (hitInfo.collider.tag == "WRJ")
{
if (hitInfo.collider.GetComponent<UnmannedAerialVehicleManage>() != null)
{
UnmannedAerialVehicleManage unmannedAerialVehicleManage = hitInfo.collider.GetComponent<UnmannedAerialVehicleManage>();
UnmannedAerialVehicleUI.Instance.unmannedAerialVehicleManage = unmannedAerialVehicleManage;
UnmannedAerialVehicleUI.Instance.ShowButton();
DroneViewDisplay.Instance.CreateUI(unmannedAerialVehicleManage, true);
}
}
}
}
}
/// <summary>
/// 切换视图
/// </summary>
/// <param name="index"></param>
public void ChangeView(int index)
{
Teacher.gameObject.SetActive(index == 0);
student.gameObject.SetActive(index == 1);
posture.gameObject.SetActive(index == 2);
}
public void AddPlayers(SyncPlayerTransform s)
{
if (!players.Contains(s))
{
players.Add(s);
}
if (!userIds.Contains(s.userID))
userIds.Add(s.userID);
}
public void RemovePlayer(ulong playerID)
{
for (int i = 0; i < players.Count; i++)
{
if (players[i].userID == playerID)
{
Destroy(players[i].gameObject);
players.RemoveAt(i);
userIds.Remove(playerID);
}
}
}
public void OnRoomInfo(string msg)
{
StopCoroutine(WaitSpawn(msg));
StartCoroutine(WaitSpawn(msg));
}
private IEnumerator WaitSpawn(string msg)
{
yield return new WaitForSeconds(0.5f);
string[] data = msg.Split(',');
switch (data[0])
{
case "online":
ulong userId = ulong.Parse(data[1]);
if (!userIds.Contains(userId))
{
SyncPlayerTransform spt = Instantiate(playerTransformPrefab);
//0 red 1 blue
if (UIBootstrap.Instance.GetRoleByIDPracticeId(GlobalFlag.practiceSeatId) == "0")
{
spt.gameObject.transform.position = redSpawnPos.position;
spt.gameObject.transform.eulerAngles = redSpawnPos.eulerAngles;
}
else
{
spt.gameObject.transform.position = blueSpawnPos.position;
spt.gameObject.transform.eulerAngles = blueSpawnPos.eulerAngles;
}
spt.gameObject.SetActive(true);
spt.SetPlayerInfo(userId, data[2], ulong.Parse(data[3]), false);
//spt.GetComponent<Camera>().cullingMask &= ~(1 << 15);
AddPlayers(spt);
}
break;
case "StartDeduction":
CheckRoomState();
break;
case "蜂群无人机":
SpawnDevice(wrjDrag.prefabItem, data);
break;
case "地面无线电干扰":
SpawnDevice(wxdDrag.prefabItem, data);
break;
case "探测雷达":
SpawnDevice(ldDrag.prefabItem, data);
break;
case "激光火控平台":
SpawnDevice(hpDrag.prefabItem, data);
break;
case "频谱探测":
SpawnDevice(ppDrag.prefabItem, data);
break;
case "微波武器":
SpawnDevice(wbDrag.prefabItem, data);
break;
case "Stop":
GlobalFlag.isStartRehearsing = false;
for (int i = 0; i < DeviceManager.Instance.devices.Count; i++)
{
DeviceManager.Instance.devices[i].isStartRehearsing = false;
}
break;
case "EndDeduction":
GlobalFlag.isStartRehearsing = false;
for (int i = 0; i < DeviceManager.Instance.devices.Count; i++)
{
DeviceManager.Instance.devices[i].isStartRehearsing = false;
}
break;
case "offline":
break;
default:
break;
}
}
public async void CheckRoomState()
{
RoomState roomState = await AsyncWebReq.Post<RoomState>(Url_UpdateRoomState + GlobalFlag.roomID + "&state=1", null);
if (roomState.message == "success")
{
GlobalFlag.isStartRehearsing = true;
for (int i = 0; i < DeviceManager.Instance.devices.Count; i++)
{
DeviceManager.Instance.devices[i].isStartRehearsing = true;
}
if (GlobalFlag.currentUser.role_code == "04")
{
currentSpt.GetComponent<Camera>().cullingMask = TeacherLayer;
//currentSpt.GetComponent<Camera>().cullingMask &= ~(1 << 15);
}
}
}
/// <summary>
/// 获取别的客户端生成得设备
/// </summary>
/// <param name="devicePrefab"></param>
/// <param name="data"></param>
/// <param name="deviceID"></param>
public async void SpawnDevice(GameObject devicePrefab = null, string[] deviceInfo = null)
{
string url = Url_QueryPracticeDevice + GlobalFlag.roomID + "&PracticeSubjectId=" + GlobalFlag.practiceSubjectID;
Debug.Log("获取房间设备:" + url);
DeviceData deviceData = await AsyncWebReq.Get<DeviceData>(url);
if (devicePrefab != null && deviceInfo != null)
{
for (int i = 0; i < deviceData.data.Count; i++)
{
if (deviceData.data[i].id == deviceInfo[7])
{
SpawnDevice(devicePrefab, deviceData.data[i], deviceInfo);
}
}
}
else
{
for (int i = 0; i < deviceData.data.Count; i++)
{
switch (deviceData.data[i].device_name)
{
case "蜂群无人机":
SpawnDevice(wrjDrag.prefabItem, deviceData.data[i]);
break;
case "地面无线电干扰":
SpawnDevice(wxdDrag.prefabItem, deviceData.data[i]);
break;
case "探测雷达":
SpawnDevice(ldDrag.prefabItem, deviceData.data[i]);
break;
case "激光火控平台":
SpawnDevice(hpDrag.prefabItem, deviceData.data[i]);
break;
case "频谱探测":
SpawnDevice(ppDrag.prefabItem, deviceData.data[i]);
break;
case "微波武器":
SpawnDevice(wbDrag.prefabItem, deviceData.data[i]);
break;
}
}
}
}
/// <summary>
///
/// </summary>
/// <param name="obj"></param>
/// <param name="data"></param>
/// <param name="tran"></param>
public void SpawnDevice(GameObject obj, AdamThinkDevicesData.DataItem data, string[] tran = null)
{
GameObject device = Instantiate(obj);
if (tran != null)
{
device.transform.position = new Vector3(float.Parse(tran[1]), float.Parse(tran[2]), float.Parse(tran[3]));
device.transform.eulerAngles = new Vector3(float.Parse(tran[4]), float.Parse(tran[5]), float.Parse(tran[6]));
}
else
{
string[] deviceTran = data.r1.Split(',');
device.transform.position = new Vector3(float.Parse(deviceTran[0]), float.Parse(deviceTran[1]), float.Parse(deviceTran[2]));
device.transform.eulerAngles = new Vector3(float.Parse(deviceTran[3]), float.Parse(deviceTran[4]), float.Parse(deviceTran[5]));
}
UnmannedAerialVehicleManage uavm = device.GetComponent<UnmannedAerialVehicleManage>();
if (!string.IsNullOrEmpty(data.r2) || data.r2 != "")
{
int wrjModelCount = int.Parse(data.r2);
if (uavm)
{
uavm.wrjModel = (WRJModel)wrjModelCount;
device.name = uavm.wrjModel.ToString();
int bdxx = int.Parse(data.bdxx);
uavm.groupId = bdxx;
}
}
Debug.Log($"<color=yellow>是否是player{data.r3 == GlobalFlag.currentUser.user_id}</color>");
device.GetComponent<EquipmentCommon>().FillInTheData(data.list_para, data);
device.GetComponent<EquipmentCommon>().deviceID = data.id;
if (data.r3 == GlobalFlag.currentUser.user_id)
{
device.GetComponent<EquipmentCommon>().isPlayer = true;
}
if (uavm)
{
uavm.SetTipsColor();
DroneViewDisplay.Instance.CreateUI(uavm, false);
}
FormationManager.Instance.WhenSpawn();
}
private void OnGetRoomUsers(string obj)
{
if (!string.IsNullOrWhiteSpace(obj))
{
string[] data = obj.Split(';');
for (int i = 0; i < data.Length; i++)
{
int index = i;
string[] userInfo = data[index].Split(',');
if (!userIds.Contains(ulong.Parse(userInfo[0])))
{
SyncPlayerTransform spt = Instantiate(playerTransformPrefab);
//0 red 1 blue
if (UIBootstrap.Instance.GetRoleByIDPracticeId(GlobalFlag.practiceSeatId) == "0")
{
spt.gameObject.transform.position = redSpawnPos.position;
spt.gameObject.transform.eulerAngles = redSpawnPos.eulerAngles;
}
else
{
spt.gameObject.transform.position = blueSpawnPos.position;
spt.gameObject.transform.eulerAngles = blueSpawnPos.eulerAngles;
}
spt.SetPlayerInfo(ulong.Parse(userInfo[0]), userInfo[1], ulong.Parse(userInfo[2]), false);
spt.gameObject.SetActive(true);
AddPlayers(spt);
}
}
}
//Debug.Log($"<color=yellow>OnGetRoomUsers={obj}</color>");
SpawnDevice();
string msg = $"send2room online,{ulong.Parse(GlobalFlag.currentUser.user_id)},{GlobalFlag.currentUser.login_name},{ulong.Parse(GlobalFlag.roomID)}";
_ = SyncCreateRoom.SendMessageAsync(msg);
}
public void SetWeatherValue()
{
SenceInfo currentSceneInfo = new SenceInfo();
currentSceneInfo = UIBootstrap.Instance.currentSceneInfo.data;
tenkokuModule.weather_RainAmt = Mathf.Lerp(0f, 1f, float.Parse(currentSceneInfo.EnvRain));
tenkokuModule.weather_SnowAmt = Mathf.Lerp(0f, 1f, float.Parse(currentSceneInfo.EnvSnow));
tenkokuModule.weather_WindAmt = Mathf.Lerp(0f, 1f, float.Parse(currentSceneInfo.EnvWindSpeed));
tenkokuModule.weather_WindDir = Mathf.Lerp(0f, 360f, float.Parse(currentSceneInfo.EnvWindDir));
tenkokuModule.weather_OvercastAmt = Mathf.Lerp(0f, 1f, 1 - (float.Parse(currentSceneInfo.EnvLight) / 10));
tenkokuModule.weather_humidity = Mathf.Lerp(0f, 1f, 1 - (float.Parse(currentSceneInfo.EnvWu) / 100));
}
public void SetModelValue()
{
string info = UIBootstrap.Instance.currentSceneInfo.data.DeviceContent;
//Debug.Log(info);
if (info.Length > 0 && !string.IsNullOrWhiteSpace(info))
{
modelsInfo = Jsonanalyze.FromJson<List<ModelInfo>>(info);
for (int i = 0; i < modelsInfo.Count; i++)
{
GameObject obj = Resources.Load<GameObject>(modelsInfo[i].str);
GameObject go = Instantiate(obj);
go.transform.position = new Vector3(float.Parse(modelsInfo[i].x.ToString()), float.Parse(modelsInfo[i].y.ToString()), float.Parse(modelsInfo[i].z.ToString()));
}
}
}
/// <summary>
/// 获取 所有 参数 修改 面板
/// </summary>
/// <returns></returns>
public void GetAllImportance()
{
GameObject[] radar = GameObject.FindGameObjectsWithTag("Radar");
GameObject[] objs = GameObject.FindGameObjectsWithTag("Importance");
for (int i = 0; i < objs.Length; i++)
{
objs[i].SetActive(false);
}
for (int i = 0; i < radar.Length; i++)
{
radar[i].SetActive(false);
}
}
/// <summary>
/// 获取无人机参数面板
/// </summary>
public void GetWRJParameter()
{
GameObject[] wrjParameter = GameObject.FindGameObjectsWithTag("WRJParameter");
for (int i = 0; i < wrjParameter.Length; i++)
{
wrjParameter[i].SetActive(false);
}
}
private void OnDisable()
{
Debug.Log("OnDisable GameManager");
Leaverroom();
}
private void Leaverroom()
{
SyncCreateRoom.getroomusersRequset -= OnGetRoomUsers;
SyncCreateRoom.send2roomRequset -= OnRoomInfo;
SyncCreateRoom.send2worldRequset -= OnGetWorldInfo;
//string _msg = "leaveroom ";
//_ = AdamSync.SyncCreateRoom.SendMessageAsync(_msg);
}
}
[Serializable]
public class ModelInfo
{
public string str;
public double x;
public double y;
public double z;
}