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

318 lines
10 KiB
C#

using AdamSync;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
[Serializable]
public class FormationInfo
{
public int groupIndex;
public List<UnmannedAerialVehicleManage> uavms = new List<UnmannedAerialVehicleManage>();
}
/// <summary>
/// 编队控制脚本
/// </summary>
public class FormationManager : MonoSingleton<FormationManager>
{
public Button startFormationBtn;
public Button submitFormationBtn;
public Button cancelFormationBtn;
public bool isStartFormation;
public List<FormationInfo> formationInfos = new List<FormationInfo>();
public FormationInfo formationInfo;
public List<UnmannedAerialVehicleManage> allUavms = new List<UnmannedAerialVehicleManage>();
public List<string> formationIDs = new List<string>();
void Awake()
{
SyncCreateRoom.send2roomRequset += OnReciveMsg;
}
// Start is called before the first frame update
void Start()
{
startFormationBtn.onClick.AddListener(OnStartFormation);
submitFormationBtn.onClick.AddListener(OnSubmit);
cancelFormationBtn.onClick.AddListener(OnCancel);
CheckBtns(0);
}
private void CheckBtns(int index)
{
startFormationBtn.gameObject.SetActive(index == 0);
submitFormationBtn.gameObject.SetActive(index == 1);
cancelFormationBtn.gameObject.SetActive(index == 1);
}
// Update is called once per frame
void Update()
{
if (isStartFormation)
{
if (Input.GetKey(KeyCode.LeftControl) && Input.GetMouseButtonDown(0))
{
if (EventSystem.current.IsPointerOverGameObject()) return;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo, 1000))
{
if (hitInfo.collider.gameObject.tag == "WRJ")
{
UnmannedAerialVehicleManage uavmTemp = hitInfo.collider.gameObject.GetComponent<UnmannedAerialVehicleManage>();
if (uavmTemp != null && !uavmTemp.isGroup)
{
if (!formationIDs.Contains(uavmTemp.equipmentCommon.deviceID))
{
formationIDs.Add(uavmTemp.equipmentCommon.deviceID);
}
}
Debug.Log("拾取");
}
}
}
}
}
/// <summary>
/// 设置组中得无人机所有航线
/// </summary>
public void SetUAVMGroupAirRoute(int uavmGroupID, Vector3 pos, DistanceMeasurement _airRoute)
{
List<UnmannedAerialVehicleManage> uavms = GroupUAVM(uavmGroupID);
if (uavms.Count == 0) return;
for (int j = 0; j < uavms.Count; j++)
{
if (!uavms[j].airRoute)
{
uavms[j].airRoute = _airRoute.gameObject;
uavms[j].SetStartPos(_airRoute.PosPrefab);
}
uavms[j].positions.Enqueue(pos);
}
}
/// <summary>
/// 清除组内所有无人机得航线
/// </summary>
/// <param name="uavmGroupID"></param>
public void RemoveUAMGroupAirRoute(int uavmGroupID)
{
List<UnmannedAerialVehicleManage> uavms = GroupUAVM(uavmGroupID);
if (uavms.Count == 0) return;
for (int j = 0; j < uavms.Count; j++)
{
uavms[j].positions.Clear();
}
}
/// <summary>
/// 设置组 航线设置
/// </summary>
public void SetGroupAttackByGroupID(int uavmGroupID, bool isOpen)
{
List<UnmannedAerialVehicleManage> uavms = GroupUAVM(uavmGroupID);
if (uavms.Count == 0) return;
for (int j = 0; j < uavms.Count; j++)
{
int index = j;
if (isOpen)
{
uavms[index].RouteSettings();
if (uavms[index].airRoute)
uavms[index].airRoute.transform.localScale = Vector3.one;
}
else
{
uavms[index].TurnOffCourseSettings();
if (uavms[index].airRoute)
uavms[index].airRoute.transform.localScale = Vector3.zero;
}
}
}
/// <summary>
/// 切换无人机状态
/// </summary>
/// <param name="uavmGroupID"></param>
/// <param name="patternCut"></param>
public void SetGroupUAVMState(int uavmGroupID, int patternCut)
{
List<UnmannedAerialVehicleManage> uavms = GroupUAVM(uavmGroupID);
if (uavms.Count == 0) return;
for (int j = 0; j < uavms.Count; j++)
{
uavms[j].modeSwitch(patternCut);
}
}
/// <summary>
/// 移除指定无人机
/// </summary>
/// <param name="uavm"></param>
public void RemoveAppointWRJ(UnmannedAerialVehicleManage uavm)
{
List<UnmannedAerialVehicleManage> uavms = GroupUAVM(uavm.groupId);
if (uavms.Count == 0) return;
if (uavms.Contains(uavm))
uavms.Remove(uavm);
if (allUavms.Contains(uavm))
allUavms.Remove(uavm);
for (int j = 0; j < formationInfos.Count; j++)
{
if (formationInfos[j].uavms.Count == 0)
formationInfos.Remove(formationInfos[j]);
}
}
private List<UnmannedAerialVehicleManage> GroupUAVM(int uavmGroupID)
{
if (formationInfos.Count == 0) return null;
List<UnmannedAerialVehicleManage> uavms = new List<UnmannedAerialVehicleManage>();
for (int i = 0; i < formationInfos.Count; i++)
{
int indexI = i;
if (formationInfos[indexI].groupIndex == uavmGroupID)
{
uavms = formationInfos[indexI].uavms;
}
}
return uavms;
}
public void OnStartFormation()
{
isStartFormation = true;
CheckBtns(1);
}
public void OnSubmit()
{
isStartFormation = false;
string infoTemp = "";
for (int i = 0; i < formationIDs.Count; i++)
{
infoTemp += formationIDs[i] + ",";
}
SendGroupToOther(formationInfos.Count.ToString(), infoTemp);
formationIDs.Clear();
CheckBtns(0);
}
private char[] separators = { ',' }; // 设置分隔符为逗号
public void OnReciveMsg(string reciveInfo)
{
Debug.Log($"<color=blue>{reciveInfo}</color>");
List<UnmannedAerialVehicleManage> uavms = GetAllWRJ();
var result = reciveInfo.Split(separators) // 对字符串进行切割操作
.Where(s => !String.IsNullOrWhiteSpace(s) && s != "") // 移除空白或者只包含空格的元素
.ToList();
if (result.Count > 3)
{
if (result[0] == "group")
{
formationInfo = new FormationInfo();
formationInfo.groupIndex = int.Parse(result[1]);
for (int i = 2; i < result.Count; i++)
{
for (int j = 0; j < uavms.Count; j++)
{
if (uavms[j].equipmentCommon.deviceID == result[i])
{
uavms[j].groupId = int.Parse(result[1]);
uavms[j].isGroup = true;
uavms[j].SetGroupTipsAndDatabaseInfo(int.Parse(result[1]));
formationInfo.uavms.Add(uavms[j]);
}
}
}
if (!formationInfos.Contains(formationInfo))
formationInfos.Add(formationInfo);
}
}
}
private void SetGroupInfo()
{
}
/// <summary>
/// 打组发送给别人
/// </summary>
private void SendGroupToOther(string groupIndex, string info)
{
string msg = $"send2room group,{groupIndex},{info}";
_ = SyncCreateRoom.SendMessageAsync(msg);
string localMsg = $"group,{groupIndex},{info}";
OnReciveMsg(localMsg);
}
public void OnCancel()
{
formationInfo = null;
CheckBtns(0);
}
public int wrjCount = 0;
public List<UnmannedAerialVehicleManage> GetAllWRJ()
{
List<EquipmentCommon> equipList = DeviceManager.Instance.devices;
List<UnmannedAerialVehicleManage> allUavmsTemp = new List<UnmannedAerialVehicleManage>();
for (int i = 0; i < equipList.Count; i++)
{
int index = i;
if (equipList[index] != null && equipList[index].gameObject.layer == 11 && equipList[index].GetComponent<UnmannedAerialVehicleManage>())
{
if (!allUavmsTemp.Contains(equipList[index].GetComponent<UnmannedAerialVehicleManage>()))
{
allUavmsTemp.Add(equipList[index].GetComponent<UnmannedAerialVehicleManage>());
}
}
}
return allUavmsTemp;
}
/// <summary>
/// 动态添加已经生成得数据
/// </summary>
public void WhenSpawn()
{
allUavms = GetAllWRJ();
foreach (var uam in allUavms)
{
if (uam.groupId != -1)
{
FormationInfo existingCategory = formationInfos.Find(tt => tt.groupIndex == uam.groupId);
if (existingCategory != null)
{
if (!existingCategory.uavms.Contains(uam))
existingCategory.uavms.Add(uam);
}
else
{
FormationInfo newCategory = new FormationInfo { groupIndex = uam.groupId };
if (!newCategory.uavms.Contains(uam))
newCategory.uavms.Add(uam);
if (!formationInfos.Contains(newCategory))
formationInfos.Add(newCategory);
}
}
}
}
private void OnDisable()
{
Debug.Log("OnDisable FormationManager");
SyncCreateRoom.send2roomRequset -= OnReciveMsg;
}
}