447 lines
14 KiB
C#
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.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;
|
|
}
|
|
|
|
|
|
}
|