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 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); 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(); if (uavmTemp != null && !uavmTemp.isGroup) { if (!formationIDs.Contains(uavmTemp.equipmentCommon.deviceID)) { formationIDs.Add(uavmTemp.equipmentCommon.deviceID); } } Debug.Log("拾取"); } } } } } /// /// 设置组中得无人机所有航线 /// 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]); } } 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] + ","; } SendGroupToOther(formationInfos.Count.ToString(), infoTemp); formationIDs.Clear(); CheckBtns(0); } 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); } } } } private void OnDisable() { Debug.Log("OnDisable FormationManager"); SyncCreateRoom.send2roomRequset -= OnReciveMsg; } }