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

447 lines
14 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 Dropdown ungroup;
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);
ungroup.onValueChanged.AddListener((a) =>
{
string info = ungroup.options[a].text;
int groupId = int.Parse(info.Replace("组", string.Empty));
UngroupByGroupID(groupId);
ungroup.options.Remove(ungroup.options[a]);
});
CheckBtns(0);
}
private void CheckBtns(int index)
{
startFormationBtn.gameObject.SetActive(index == 0);
submitFormationBtn.gameObject.SetActive(index == 1);
cancelFormationBtn.gameObject.SetActive(index == 1);
if (formationInfos.Count > 0)
{
if (index == 1)
ungroup.gameObject.SetActive(false);
else
ungroup.gameObject.SetActive(true);
}
else
{
ungroup.gameObject.SetActive(index == 2);
}
}
// 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);
}
}
}
}
}
}
}
/// <summary>
/// 解组
/// </summary>
private void OnUngroupDropdown()
{
ungroup.ClearOptions();
List<Dropdown.OptionData> listTemp = new List<Dropdown.OptionData>();
if (formationInfos.Count > 0)
{
for (int i = 0; i < formationInfos.Count; i++)
{
int index = i;
Dropdown.OptionData optionData = new Dropdown.OptionData();
optionData.text = $"组{formationInfos[index].groupIndex}";
listTemp.Add(optionData);
}
}
ungroup.AddOptions(listTemp);
}
/// <summary>
/// 通过 dropdown 按钮 解组
/// </summary>
/// <param name="groupID"></param>
private void UngroupByGroupID(int groupID)
{
List<UnmannedAerialVehicleManage> uavms = GroupUAVM(groupID);
if (uavms.Count == 0) return;
for (int i = 0; i < uavms.Count; i++)
{
int index = i;
uavms[index].groupId = -1;
uavms[index].isGroup = false;
uavms[index].SetGroupTipsAndDatabaseInfo(-1);
uavms[index].positions.Clear();
}
RemoveGroupWRJByID(groupID);
}
/// <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==null||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]);
}
}
/// <summary>
/// 通过ID 移除 无人机组
/// </summary>
/// <param name="groupID"></param>
public void RemoveGroupWRJByID(int groupID)
{
for (int j = 0; j < formationInfos.Count; j++)
{
int index = j;
if (formationInfos[index].groupIndex == groupID)
formationInfos.Remove(formationInfos[index]);
}
}
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] + ",";
}
string id = CheckMissingNum().ToString();
SendGroupToOther(id, infoTemp);
formationIDs.Clear();
CheckBtns(0);
OnUngroupDropdown();
}
/// <summary>
/// 检测ID数组中少哪些数组
/// </summary>
private int CheckMissingNum()
{
List<int> groupIDs = new List<int>();
List<int> missingNum = new List<int>();
for (int i = 0; i < formationInfos.Count; i++)
{
if (!groupIDs.Contains(formationInfos[i].groupIndex))
groupIDs.Add(formationInfos[i].groupIndex);
}
if (groupIDs.Count > 0)
{
missingNum = FindMissingNumbers(groupIDs);
if (missingNum.Count > 0)
return missingNum[0];
else
return formationInfos.Count;
}
else
return formationInfos.Count;
}
/// <summary>
/// 计算int数组中缺少的数字
/// </summary>
/// <param name="numbers"></param>
/// <returns></returns>
private List<int> FindMissingNumbers(List<int> numbers)
{
List<int> missingNumbers = new List<int>();
int[] temp = numbers.ToArray();
Array.Sort(temp); // 对数组进行排序
if (temp[0] != 0)
{
for (int i = 0; i < temp[0]; i++)
{
missingNumbers.Add(i);
}
}
for (int i = 0; i < temp.Length - 1; i++)
{
if (temp[i + 1] - temp[i] > 1)
{
for (int j = temp[i] + 1; j < temp[i + 1]; j++)
{
missingNumbers.Add(j);
}
}
}
return missingNumbers;
}
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);
}
}
}
OnUngroupDropdown();
CheckBtns(0);
}
private void OnDisable()
{
Debug.Log("OnDisable FormationManager");
SyncCreateRoom.send2roomRequset -= OnReciveMsg;
}
}