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 uavms = new List(); } /// /// 编队控制脚本 /// public class FormationManager : MonoSingleton { public Button startFormationBtn; public Button submitFormationBtn; public Button cancelFormationBtn; public Dropdown ungroup; public bool isStartFormation; public List formationInfos = new List(); public FormationInfo formationInfo; public List allUavms = new List(); public List formationIDs = new List(); 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(); if (uavmTemp != null && !uavmTemp.isGroup) { if (!formationIDs.Contains(uavmTemp.equipmentCommon.deviceID)) { formationIDs.Add(uavmTemp.equipmentCommon.deviceID); } } } } } } } /// /// 解组 /// private void OnUngroupDropdown() { ungroup.ClearOptions(); List listTemp = new List(); 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); } /// /// 通过 dropdown 按钮 解组 /// /// private void UngroupByGroupID(int groupID) { List 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); } /// /// 设置组中得无人机所有航线 /// public void SetUAVMGroupAirRoute(int uavmGroupID, Vector3 pos, DistanceMeasurement _airRoute) { List 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); } } /// /// 清除组内所有无人机得航线 /// /// public void RemoveUAMGroupAirRoute(int uavmGroupID) { List uavms = GroupUAVM(uavmGroupID); if (uavms.Count == 0) return; for (int j = 0; j < uavms.Count; j++) { uavms[j].positions.Clear(); } } /// /// 设置组 航线设置 /// public void SetGroupAttackByGroupID(int uavmGroupID, bool isOpen) { List 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; } } } /// /// 切换无人机状态 /// /// /// public void SetGroupUAVMState(int uavmGroupID, int patternCut) { List uavms = GroupUAVM(uavmGroupID); if (uavms.Count == 0) return; for (int j = 0; j < uavms.Count; j++) { uavms[j].modeSwitch(patternCut); } } /// /// 移除指定无人机 /// /// public void RemoveAppointWRJ(UnmannedAerialVehicleManage uavm) { List 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]); } } /// /// 通过ID 移除 无人机组 /// /// 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 GroupUAVM(int uavmGroupID) { if (formationInfos.Count == 0) return null; List uavms = new List(); 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(); } /// /// 检测ID数组中少哪些数组 /// private int CheckMissingNum() { List groupIDs = new List(); List missingNum = new List(); 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; } /// /// 计算int数组中缺少的数字 /// /// /// private List FindMissingNumbers(List numbers) { List missingNumbers = new List(); 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($"{reciveInfo}"); List 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() { } /// /// 打组发送给别人 /// 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 GetAllWRJ() { List equipList = DeviceManager.Instance.devices; List allUavmsTemp = new List(); for (int i = 0; i < equipList.Count; i++) { int index = i; if (equipList[index] != null && equipList[index].gameObject.layer == 11 && equipList[index].GetComponent()) { if (!allUavmsTemp.Contains(equipList[index].GetComponent())) { allUavmsTemp.Add(equipList[index].GetComponent()); } } } return allUavmsTemp; } /// /// 退出或者 掉线之后重新进入场景中, 动态添加已经生成得数据 /// 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; } }