using DG.Tweening;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using AdamThinkDevicesData;
using System.Linq;
using static InterfaceManager;
using Newtonsoft.Json;
using PData;
using UnityEngine.UI;
public enum WRJModel
{
无人机,
光学无人机,
电子侦察无人机,
自杀式无人机
}
///
/// 单个无人机蜂群控制
///
public class UnmannedAerialVehicleManage : MonoBehaviour
{
public WRJModel wrjModel = WRJModel.无人机;
///
/// 无人机状态
///
public Pattern pattern = Pattern.待机;
public static List unmannedAerialVehicleManages = new List();
#region 启动暂停
private bool _isStartRehearsing = false;
///
/// 是否正在预演
///
public bool isStartRehearsing
{
get { return _isStartRehearsing; }
set
{
if (_isStartRehearsing != value)
{
_isStartRehearsing = value;
OnActivationChanged?.Invoke(_isStartRehearsing);
}
}
}
///
/// 布尔值变化时触发的事件
///
public event System.Action OnActivationChanged;
///
/// 间隔时间
///
public float interval = 5.0f;
#endregion
public EquipmentCommon equipmentCommon;
///
/// 打组ID
///
public int groupId = -1;
public bool isGroup = false;
///
/// 无人机预制体
///
public GameObject UAVPrefab;
///
/// 编队无人机数量
///
public int totalObjects = 30; // 总共的物体数量
///
/// 所有子物体无人机
///
public List unmannedAerialVehicles = new List();
///
/// 频段设置
///
public List togFrequencyBands = new List();
///
/// 探测频段设置
///
public List togSurveillanceFrequencyBands = new List();
///
/// 线预制体
///
public GameObject LinePrefab;
///
/// 航线
///
public GameObject airRoute;
///
/// 已有路径
///
public Queue positions = new Queue();
public Vector3 endPosition = new Vector3();
///
/// 飞行速度
///
public float FireSpeed = 20.0f;
///
/// 检测范围半径
///
public float detectionRadius = 500; //
///
/// 是否正在攻击目标
///
public bool isEngagedTarget = false;
///
/// 光学无人机
///
public Camera gxWRJCamera;
///
/// 电子侦察无人机
///
public Camera dzWRJCamera;
#region 无人机数据
///
/// 续航时间
///
public string batteryLife;
///
/// 抗风等级
///
public string classificationWindResistance;
///
/// 最大飞行速度
///
public string maximumFlyingSpeed;
///
/// RCS
///
public string RCS;
///
/// 卫星定位频点
///
public string satellitePositioningFrequency;
///
/// 数据链通信频点
///
public string dataLinkCommunicationFrequency;
///
/// 电子侦察能力
///
public string electronicReconnaissanceCapability;
///
/// 光学侦察能力
///
public string opticalReconnaissanceCapability;
#endregion
///
/// 频段设置面板
///
public GameObject FrequencyBand;
///
/// 侦察频段设置面板
///
public GameObject SurveillanceFrequencyBand;
///
/// 显示频谱地图上的位置
///
public GameObject gamePos;
///
/// 显示在雷达上的位置
///
public GameObject gamemap;
///
/// 频谱显示无人机大小
///
public float reveal;
///
/// 地面层数
///
public LayerMask Ground;
///
/// 改变频谱探测地图上显示点的大小
///
public bool boisp = true;
void Start()
{
gamePos.gameObject.SetActive(false);
MatrixFormation(30, 1);
for (int i = 0; i < unmannedAerialVehicles.Count; i++)
{
unmannedAerialVehicles[i].serialNumber = (i + 1).ToString();
}
unmannedAerialVehicleManages.Add(this);
equipmentCommon = GetComponent();
//Formation(1);//默认阵型
// 订阅布尔值变化事件
OnActivationChanged += OnActivationChangedHandler;
//频段设置
foreach (Toggle toggle in togFrequencyBands)
{
toggle.onValueChanged.AddListener(delegate { FrequencyBandsValueChanged(toggle); });
}
//探测频段设置
foreach (Toggle toggle in togSurveillanceFrequencyBands)
{
toggle.onValueChanged.AddListener(delegate { SurveillanceFrequencyBandsValueChanged(toggle); });
}
}
private void Mapdisplay()
{
if (reveal > 1)
{
gamePos.transform.localScale = new Vector3(reveal, 1, reveal);
boisp = false;
}
}
///
/// 设置组得标志
///
public void SetGroupTips(int index)
{
UnmannedAerialVehicle uav = unmannedAerialVehicles[0];
if (uav != null)
{
uav.tips.text = uav.tips.text + "\n" + "组" + index.ToString();
}
}
///
/// 设置标志和单个信息
///
public void SetGroupTipsAndDatabaseInfo(int index)
{
SetGroupTips(index);
equipmentCommon.SetDatabaseInfo("bdxx", index.ToString());
}
///
/// 频段设置
///
///
void FrequencyBandsValueChanged(Toggle change)
{
if (change.isOn)
{
dataLinkCommunicationFrequency = change.transform.name;
int layerValue = LayerMask.NameToLayer(dataLinkCommunicationFrequency);
gamePos.layer = layerValue;
string nowData = GetSyncDataTwo();
MyNetMQClient.instance.Send(nowData);
equipmentCommon.SetDatabaseInfo("my_rate", dataLinkCommunicationFrequency);
//DeviceManager.Instance.send2roomStr.Enqueue(nowData);
//MQTTManager.instance.SendData(MQTTManager.instance.BandSetting, nowData);
}
}
///
/// 接受同步消息
///
///
public void FrequencyGamepos(string _frequency)
{
int layerValue = LayerMask.NameToLayer(_frequency);
dataLinkCommunicationFrequency = _frequency;
gamePos.layer = layerValue;
}
///
/// 探测频段设置
///
///
void SurveillanceFrequencyBandsValueChanged(Toggle change)
{
if (change.isOn)
{
electronicReconnaissanceCapability = change.transform.name;
int layerValue = LayerMask.NameToLayer(electronicReconnaissanceCapability);
dzWRJCamera.cullingMask = 1 << layerValue;
string nowData = GetSyncDataThree();
MyNetMQClient.instance.Send(nowData);
equipmentCommon.SetDatabaseInfo("scan_rate", electronicReconnaissanceCapability);
//DeviceManager.Instance.send2roomStr.Enqueue(nowData);
//MQTTManager.instance.SendData(MQTTManager.instance.SweepFrequencyBand, nowData);
}
}
///
/// 接受同步消息
///
///
public void SurveillanceFrequency(string _frequency)
{
int layerValue = LayerMask.NameToLayer(_frequency);
electronicReconnaissanceCapability = _frequency;
dzWRJCamera.cullingMask = 1 << layerValue;
}
[ContextMenu("Test")]
public void Test()
{
MatrixFormation(30, 1);//根据想定数据去设置无人机数量
}
// Update is called once per frame
void Update()
{
if (isStartRehearsing)
{
gamePos.gameObject.SetActive(true);
}
if (isStartRehearsing && equipmentCommon.isPlayer)
{
switch (pattern)
{
case Pattern.待机:
break;
case Pattern.警戒:
SelectiveAttackDrone();
break;
case Pattern.攻击:
SelectiveAttackDrone();
if (airRoute)
{
StartMoveObjectAlongPath();
}
break;
}
}
var _unmannedAerialVehicle = unmannedAerialVehicles.FindAll(x => x != null && x.gameObject.activeSelf);
if (_unmannedAerialVehicle.Count == 0)
{
string nowData = string.Format("{0},{1}", "SetToBeDestroyed", equipmentCommon.deviceID);
MyNetMQClient.instance.Send(nowData);
//DeviceManager.Instance.send2roomStr.Enqueue(nowData);
//MQTTManager.instance.SendData(MQTTManager.instance.SetToBeDestroyed, nowData);
UploadLog(equipmentCommon.deviceID);
WWWForm headers = new WWWForm();
headers.AddField("id", equipmentCommon.deviceID);
StartCoroutine(PostString(Url_Deletepracticedevicedetail, headers, data =>
{
equipmentCommon.onDeviceDelete?.Invoke(equipmentCommon.deviceID);
//Debug.Log(data);
DroneViewDisplay.Instance.DistroyUI(equipmentCommon.deviceID);
Destroy(gameObject);
}));
}
if (Spectrumdetection.Radius > 0 && boisp)
{
//if (gxWRJCamera && dzWRJCamera)
//{
// //gxWRJCamera.orthographicSize = Spectrumdetection.Radius * 1000;
switch (Spectrumdetection.Radius)
{
case 1:
reveal = 30;
Mapdisplay();
break;
case 2:
reveal = 60;
Mapdisplay();
break;
case 3:
reveal = 90;
Mapdisplay();
break;
case 4:
reveal = 120;
Mapdisplay();
break;
case 5:
reveal = 150;
Mapdisplay();
break;
default:
break;
}
//}
}
//Judgingdistance();
}
//private void Judgingdistance()
//{
// RaycastHit hit;
// //Debug.LogError("调用了");
// if (Physics.Raycast(transform.position, Vector3.down, out hit))
// {
// Debug.Log(hit.distance);
// if (hit.distance <= 1f)
// {
// if (gamemap && gamePos)
// {
// gamePos.gameObject.SetActive(false);
// gamemap.gameObject.SetActive(false);
// }
// }
// else
// {
// if (gamemap && gamePos)
// {
// gamePos.gameObject.SetActive(true);
// gamemap.gameObject.SetActive(true);
// }
// }
// }
//}
///
///上传日志
///
///
public void UploadLog(string deviceID)
{
string currentTime = System.DateTime.Now.ToString();
List uploadLogMains = new List();
UploadLogMain uploadLogMain = new UploadLogMain();
uploadLogMain.PracticeId = GlobalFlag.practiceSubjectID;
uploadLogMain.ThinkId = GlobalFlag.currentThinkId;
string log = currentTime + " " + equipmentCommon.equipmentType + "(" + deviceID + ")" + "被销毁了 ";
uploadLogMain.log = log;
uploadLogMains.Add(uploadLogMain);
string uploadLogMainJson = JsonConvert.SerializeObject(uploadLogMains);
WWWForm wWWForm = new WWWForm();
wWWForm.AddField("data", uploadLogMainJson);
//Debug.Log(uploadLogMainJson);
StartCoroutine(PostString(Url_Addpracticelog, wWWForm, data =>
{
Debug.Log(data);
}));
}
///
/// 模式切换
///
public void modeSwitch(int patternCut)
{
switch (patternCut)
{
case 0://待机
pattern = Pattern.待机;
break;
case 1:
pattern = Pattern.警戒;
break;
case 2:
pattern = Pattern.攻击;
break;
default:
break;
}
}
public Action> WRJAttach;
public void SwitchWRJModel()
{
gxWRJCamera.gameObject.SetActive(false);
switch (wrjModel)
{
case WRJModel.光学无人机:
gxWRJCamera.gameObject.SetActive(true);
break;
case WRJModel.电子侦察无人机:
WRJAttach += SetCollider4WRJ;
break;
case WRJModel.自杀式无人机:
break;
}
}
public List attackColliders1 = new List();
///
/// 攻击打击
///
private void SelectiveAttackDrone()
{
//if (isEngagedTarget) return;
//if (wrjModel == WRJModel.电子侦察无人机 || wrjModel == WRJModel.光学无人机)
if (wrjModel == WRJModel.电子侦察无人机)
{
List allColliders = Physics.OverlapSphere(transform.position, Spectrumdetection.Radius * 1000).ToList(); // 检索范围内的所有碰撞体
for (int i = 0; i < allColliders.Count; i++)
{
if (allColliders[i].gameObject.tag == "AttackTarget"
&& !allColliders[i].isTrigger
&& !attackColliders1.Contains(allColliders[i])
&& allColliders[i].transform.GetComponent()
&& allColliders[i].transform.GetComponent().frequency == electronicReconnaissanceCapability)
{
attackColliders1.Add(allColliders[i]);
}
}
}
else if (wrjModel == WRJModel.光学无人机)
{
List allColliders = Physics.OverlapSphere(transform.position, Spectrumdetection.Radius * 1000).ToList(); // 检索范围内的所有碰撞体
for (int i = 0; i < allColliders.Count; i++)
{
if (allColliders[i].gameObject.tag == "AttackTarget" && !allColliders[i].isTrigger && !attackColliders1.Contains(allColliders[i]))
{
Vector3 pos = gxWRJCamera.WorldToViewportPoint(allColliders[i].transform.position);
bool ispcamera = (pos.x > 0 && pos.x < 1 && pos.y > 0 && pos.y < 1 && pos.z > 0);
if (ispcamera)
{
attackColliders1.Add(allColliders[i]);
}
}
}
}
if (wrjModel == WRJModel.电子侦察无人机)
{
WRJAttach.Invoke(attackColliders1);
}
if (wrjModel == WRJModel.光学无人机)
{
for (int i = 0; i < attackColliders1.Count; i++)
{
if (attackColliders1[i] == null)
attackColliders1.RemoveAt(i);
}
if (attackColliders1.Count > 0)
{
var highPriorityTargets = attackColliders1.FindAll(x => x.transform.GetComponent());
if (highPriorityTargets.Count > 0)
{
unmannedAerialVehicles[0].AttAck(highPriorityTargets[0].transform);
}
else
{
unmannedAerialVehicles[0].AttAck(attackColliders1[0].transform);
}
}
}
}
public Collider currentCollider;
public void SetCollider4WRJ(List attackColliders)
{
DeviceManager.Instance.SetCollider4WRJ(attackColliders, ref currentCollider);
if (currentCollider != null)
SendMsg(currentCollider.transform);
}
public void SendMsg(Transform attackTarget)
{
string nowData = GetSyncData(attackTarget);
//MQTTManager.instance.SendData(MQTTManager.instance.SingleDronePosition, nowData);
MyNetMQClient.instance.Send(nowData);
//DeviceManager.Instance.send2roomStr.Enqueue(nowData);
}
///
/// 无人机攻击目标传递
///
///
protected string GetSyncData(Transform attackTarget)
{
return string.Format("{0},{1},{2},{3},{4}", "SingleDronePosition", equipmentCommon.deviceID,
attackTarget.position.x, attackTarget.position.y, attackTarget.position.z);
}
///
/// 设置频段同步
///
///
protected string GetSyncDataTwo()
{
UploadLog("频段设置为:", dataLinkCommunicationFrequency);
return string.Format("{0},{1},{2},{3}", "BandSetting", "WRJ", equipmentCommon.deviceID, dataLinkCommunicationFrequency);
}
///
///上传日志
///
///
public void UploadLog(string str1, string str2)
{
string currentTime = System.DateTime.Now.ToString();
List uploadLogMains = new List();
UploadLogMain uploadLogMain = new UploadLogMain();
uploadLogMain.PracticeId = GlobalFlag.practiceSubjectID;
uploadLogMain.ThinkId = GlobalFlag.currentThinkId;
string log = currentTime + " " + transform.name + "(" + equipmentCommon.deviceID + ")" + str1 + str2;
uploadLogMain.log = log;
uploadLogMains.Add(uploadLogMain);
string uploadLogMainJson = JsonConvert.SerializeObject(uploadLogMains);
WWWForm wWWForm = new WWWForm();
wWWForm.AddField("data", uploadLogMainJson);
StartCoroutine(PostString(Url_Addpracticelog, wWWForm, data =>
{
//Debug.Log(data);
}));
}
///
/// 设置扫描频段同步
///
///
protected string GetSyncDataThree()
{
UploadLog("扫描频段设置为:", electronicReconnaissanceCapability);
return string.Format("{0},{1},{2},{3}", "SweepFrequencyBand", "WRJ", equipmentCommon.deviceID, electronicReconnaissanceCapability);
}
#region 启动暂停
///
/// 导条变化调用
///
///
void OnActivationChangedHandler(bool newValue)
{
if (newValue)
{
}
else
{
}
}
#endregion
#region 数据写入
///
/// 数据写入
///
///
public void FillInTheData(List weaponitemone, string _deviceId)
{
SenceInfo currentSceneInfo = new SenceInfo();
currentSceneInfo = UIBootstrap.Instance.currentSceneInfo.data;
for (int i = 0; i < weaponitemone.Count; i++)
{
switch (weaponitemone[i].para_name)
{
case "续航时间:":
batteryLife = weaponitemone[i].para_value;
break;
case "抗风等级:":
classificationWindResistance = weaponitemone[i].para_value;
break;
case "最大飞行速度:":
maximumFlyingSpeed = weaponitemone[i].para_value;
break;
case "RCS:":
RCS = weaponitemone[i].para_value;
break;
case "卫星定位频点:":
//satellitePositioningFrequency = weaponitemone[i].para_value;
switch (weaponitemone[i].para_value)
{
case "0":
satellitePositioningFrequency = "1227.60MHz";
break;
case "1":
satellitePositioningFrequency = "1381.05MHz";
break;
case "2":
satellitePositioningFrequency = "1575.42MHz";
break;
default:
break;
}
break;
case "数据链通信频点:":
string date1 = GetFrequencyBand(weaponitemone[i].para_value);
string[] dates1 = date1.Split(',');
if (dates1.Length > 0)
{
for (int k = 0; k < togFrequencyBands.Count; k++)
{
togFrequencyBands[k].gameObject.SetActive(date1.Contains(togFrequencyBands[k].transform.name));
}
dataLinkCommunicationFrequency = dates1[0];
int layerValue = LayerMask.NameToLayer(dataLinkCommunicationFrequency);
gamePos.layer = layerValue;
foreach (Toggle toggle in togFrequencyBands)
{
if (toggle.transform.name == dataLinkCommunicationFrequency)
toggle.isOn = true;
}
}
break;
case "电子侦察能力:":
string date2 = GetFrequencyBand(weaponitemone[i].para_value);
string[] dates2 = date2.Split(',');
if (dates2.Length > 0)
{
for (int k = 0; k < togSurveillanceFrequencyBands.Count; k++)
{
togSurveillanceFrequencyBands[k].gameObject.SetActive(date2.Contains(togSurveillanceFrequencyBands[k].transform.name));
}
electronicReconnaissanceCapability = dates2[0];
int layerValue = LayerMask.NameToLayer(electronicReconnaissanceCapability);
dzWRJCamera.cullingMask = 1 << layerValue;
//探测频段设置
foreach (Toggle toggle in togSurveillanceFrequencyBands)
{
if (toggle.transform.name == electronicReconnaissanceCapability)
toggle.isOn = true;
}
}
break;
case "光学侦察能力:":
//opticalReconnaissanceCapability = weaponitemone[i].para_value;
switch (weaponitemone[i].para_value)
{
case "0":
opticalReconnaissanceCapability = "有";
break;
case "1":
opticalReconnaissanceCapability = "无";
break;
default:
break;
}
break;
default:
break;
}
if (string.IsNullOrEmpty(currentSceneInfo.EnvWindSpeed))
{
///根据风得速度改变无人机得速度
FireSpeed = float.Parse(maximumFlyingSpeed) / float.Parse(currentSceneInfo.EnvWindSpeed);
/////如果风速大于6级,无人机停止飞行
if (float.Parse(currentSceneInfo.EnvWindSpeed) * 10 > 6)
{
FireSpeed = 0;
}
}
CheckRSC();
if (i == (weaponitemone.Count - 1))
{
StartCoroutine(WeaponitemoneDataAddition());
}
SwitchWRJModel();
}
}
///
/// 获取频段
///
///
///
string GetFrequencyBand(string para_value)
{
string _data = "";
string[] str = para_value.Split(',');
if (str.Length > 0)
{
for (int j = 0; j < str.Length; j++)
{
switch (str[j])
{
case "0":
_data += "UHF" + ",";
break;
case "1":
_data += "L" + ",";
break;
case "2":
_data += "S" + ",";
break;
case "3":
_data += "C" + ",";
break;
case "4":
_data += "X" + ",";
break;
case "5":
_data += "Ku" + ",";
break;
case "6":
_data += "Ka" + ",";
break;
default:
break;
}
}
}
return _data;
}
///
/// 设置tips颜色
///
public void SetTipsColor()
{
if (equipmentCommon.isPlayer)
unmannedAerialVehicles[0].tips.color = Color.green;
else
unmannedAerialVehicles[0].tips.color = Color.red;
}
///
/// 雷达检测无人机身上得RSC
///
public void CheckRSC()
{
if (string.IsNullOrEmpty(RCS))
{
float rcs = float.Parse(RCS);
if (rcs <= 0.5 && rcs >= 0.1)
{
StartCoroutine(ShowRadarTips(0.8f, 2));
}
else if (rcs >= 0.5f && rcs <= 1)
{
StartCoroutine(ShowRadarTips(0.4f, 1));
}
}
}
///
/// 多少时间在对方雷达界面上显示红色标记
///
///
///
///
private IEnumerator ShowRadarTips(float minTime, float maxTime)
{
GameObject tips = transform.Find("Minimapwrj").gameObject;
while (true)
{
tips.gameObject.SetActive(false);
float time = UnityEngine.Random.Range(minTime, maxTime);
yield return new WaitForSeconds(time);
tips.gameObject.SetActive(true);
}
}
public LayerMask layerMask = new LayerMask();
///
/// 检测无线电频率
///
/// 无线电
/// 干扰模式
/// 发射功率
/// 干扰频率
/// 干扰角度
/// 地面的图层
public void CheckSatellitePositioningFrequency(
string interferenceMode)
{
if (interferenceMode == "驱离")
{
transform.DOKill();
transform.LookAt(new Vector3(-500, 160, 1600));
transform.DOMove(new Vector3(-500, 160, 1600), 60);
}
else if (interferenceMode == "迫降")
{
transform.DOKill();
RaycastHit hit;
if (Physics.Raycast(transform.position, Vector3.down, out hit, Mathf.Infinity, layerMask))
{
if (hit.distance > 1f)
{
hit.point = new Vector3(hit.point.x, hit.point.y + 3, hit.point.z);
transform.DOMove(hit.point, 6);
}
}
}
}
public string WRJName;
///
/// 单个无人机数据写入
///
///
IEnumerator WeaponitemoneDataAddition()
{
yield return new WaitForSeconds(0.01f);
UnmannedAerialVehicle uav = unmannedAerialVehicles[0];
if (uav != null)
{
uav.unmannedAerialVehicleManage = this;
uav.batteryLife = batteryLife;
uav.classificationWindResistance = classificationWindResistance;
uav.maximumFlyingSpeed = maximumFlyingSpeed;
uav.RCS = RCS;
uav.satellitePositioningFrequency = satellitePositioningFrequency;
uav.dataLinkCommunicationFrequency = dataLinkCommunicationFrequency;
uav.electronicReconnaissanceCapability = electronicReconnaissanceCapability;
uav.opticalReconnaissanceCapability = opticalReconnaissanceCapability;
uav.wrjModel = wrjModel;
if (uav.tips != null)
uav.tips.text = wrjModel.ToString();
if (groupId > -1)
{
isGroup = true;
SetGroupTips(groupId);
}
WRJName = wrjModel.ToString();
}
}
#endregion
#region 阵型编队
///
/// 阵型选择
///
///
public void Formation(int number)
{
switch (number)
{
case 1:
GenerateFormation();
break;
case 2:
MatrixFormation(5);
break;
case 3:
MatrixFormation(30);
break;
case 4:
MatrixFormation(1);
break;
default:
break;
}
}
///
/// 无人机雁式阵型
///
private void GenerateFormation()
{
int count = 1; // 每一排的物体数量
int currentCount = 0;
Vector3 startPos = new Vector3();
for (int i = 0; i < Mathf.Ceil(Mathf.Sqrt(totalObjects)); i++)
{
//Debug.Log("剩余。。。:" + (totalObjects - currentCount));
startPos = new Vector3(-i * 2, 0, -i * 2);
for (int j = 0; j < count; j++)//每排物体个数
{
if (currentCount < totalObjects)
{
Vector3 _vector3 = startPos + new Vector3(j * 2, 0, 0);
if (unmannedAerialVehicles[currentCount])
unmannedAerialVehicles[currentCount].transform.localPosition = _vector3;
currentCount++;
}
else
{
BoxCollider box = transform.GetComponent();
if (box)
{
box.center = new Vector3(0, 0, -i);
box.size = new Vector3(2 * count, 1, 2 * (i + 1));
}
}
}
count += 2; // 下一排增加两个物体
}
}
///
/// 矩阵阵型
///
private void MatrixFormation(int rows)
{
float offsetX = 2.0f; // 子物体之间的水平间距
float offsetY = 2.0f; // 子物体之间的垂直间距
float offsetZ = 2.0f; // 子物体之间的垂直间距
int currentCount = 0;
int cols = CanDivideEvenly(totalObjects, rows) ? totalObjects / rows : totalObjects / rows + 1;
for (int row = 0; row < rows; row++)
{
for (int col = 0; col < cols; col++)
{
if (currentCount < totalObjects)
{
Vector3 position = new Vector3(col * offsetX, 0, -row * offsetZ);
if (unmannedAerialVehicles[currentCount])
unmannedAerialVehicles[currentCount].transform.localPosition = position;
currentCount++;
}
}
}
BoxCollider box = transform.GetComponent();
if (box)
{
Debug.Log("cols..:" + cols);
Debug.Log("rows..:" + rows);
box.center = new Vector3(cols - 1, 0, -(rows - 1));
box.size = new Vector3(cols * 2, 1, 2 * rows);
}
}
///
/// 根据想定数据去设置无人机数量
///
public void MatrixFormation(int rows, int wrjCount)
{
//for (int i = 0; i < unmannedAerialVehicles.Count; i++)
//{
// unmannedAerialVehicles[i].gameObject.SetActive(false);
//}
//for (int i = 0; i < wrjCount; i++)
//{
// unmannedAerialVehicles[i].gameObject.SetActive(true);
//}
//float offsetX = 2.0f; // 子物体之间的水平间距
//float offsetY = 2.0f; // 子物体之间的垂直间距
//float offsetZ = 2.0f; // 子物体之间的垂直间距
//int currentCount = 0;
//int cols = CanDivideEvenly(totalObjects, rows) ? totalObjects / rows : totalObjects / rows + 1;
//for (int row = 0; row < rows; row++)
//{
// for (int col = 0; col < cols; col++)
// {
// if (currentCount < totalObjects)
// {
// Vector3 position = new Vector3(col * offsetX, 0, -row * offsetZ);
// if (unmannedAerialVehicles[currentCount])
// unmannedAerialVehicles[currentCount].transform.localPosition = position;
// currentCount++;
// }
// }
//}
//BoxCollider box = transform.GetComponent();
//if (box)
//{
// //Debug.Log("cols..:" + cols);
// //Debug.Log("rows..:" + rows);
// box.center = new Vector3(cols - 1, 0, -(wrjCount - 1));
// box.size = new Vector3(cols * 2, 1, 2 * wrjCount);
//}
}
bool CanDivideEvenly(int dividend, int divisor)
{
return dividend % divisor == 0;
}
#endregion
///
/// 关闭航线设置
///
public void TurnOffCourseSettings()
{
if (airRoute)
{
DistanceMeasurement distanceMeasurement = airRoute.GetComponent();
if (distanceMeasurement)
{
distanceMeasurement.isPathCanBePlanned = false;
}
}
}
public GameObject startPos;
public float hight = 200f;
///
/// 开启航线设置
///
public void RouteSettings()
{
if (airRoute)
{
DistanceMeasurement distanceMeasurement = airRoute.GetComponent();
if (distanceMeasurement)
{
distanceMeasurement.isPathCanBePlanned = true;
positions.Clear();
positions.Enqueue(startPos.transform.position);
}
}
else
{
GameObject _object = Instantiate(LinePrefab);
airRoute = _object;
airRoute.transform.position = Vector3.zero;
DistanceMeasurement distanceMeasurement = airRoute.GetComponent();
if (distanceMeasurement)
{
if (startPos)
{
startPos.transform.position = new Vector3(transform.position.x, hight, transform.position.z);
distanceMeasurement.isPathCanBePlanned = true;
distanceMeasurement.markers[0] = startPos.transform;
positions.Enqueue(startPos.transform.position);
distanceMeasurement.unmannedAerialVehicleManage = this;
}
else
{
SetStartPos(distanceMeasurement.PosPrefab);
distanceMeasurement.isPathCanBePlanned = true;
distanceMeasurement.markers[0] = startPos.transform;
positions.Enqueue(startPos.transform.position);
distanceMeasurement.unmannedAerialVehicleManage = this;
}
}
}
}
public void SetStartPos(GameObject _distanceMeasurement)
{
startPos = Instantiate(_distanceMeasurement, transform);
startPos.transform.localScale = Vector3.zero;
startPos.transform.position = new Vector3(transform.position.x, hight, transform.position.z);
}
private bool isMove = true;
///
/// 按规划路径开始移动
///
public void StartMoveObjectAlongPath()
{
if (isMove && positions.Count > 0)
{
isMove = false;
gamePos.gameObject.SetActive(true);
gamemap.gameObject.SetActive(true);
Vector3 _positions = positions.Dequeue();
var nowData = GetSyncData(_positions);
MyNetMQClient.instance.Send(nowData);
//DeviceManager.Instance.send2roomStr.Enqueue(nowData);
//MQTTManager.instance.SendData(MQTTManager.instance.DronePosition, nowData);
StartCoroutine(MoveObjectAlongPath(_positions)); // 启动协程,按规划的路线移动物体
}
}
///
///
///
///
///
public IEnumerator MoveObjectAlongPath(Vector3 _positions) // 协程:按路线移动物体
{
gamePos.gameObject.SetActive(true);
gamemap.gameObject.SetActive(true);
Vector3 targetPosition = new Vector3(_positions.x, hight, _positions.z);// 目标位置为当前顶点坐标
float _distance = Vector3.Distance(transform.position, targetPosition);
float _time = _distance / FireSpeed;
if (_positions.x != transform.position.x && _positions.z != transform.position.z)
transform.LookAt(targetPosition);
transform.DOMove(targetPosition, _time).SetEase(Ease.Linear);
yield return new WaitForSeconds(_time); // 等待一帧时间
isMove = true;
}
///
///
///
///
///
///
public IEnumerator MoveObjectAlongPath(Vector3 _positions, bool _isMove) // 协程:按路线移动物体
{
Vector3 targetPosition = new Vector3(_positions.x, hight, _positions.z);// 目标位置为当前顶点坐标
float _distance = Vector3.Distance(transform.position, targetPosition);
float _time = _distance / FireSpeed;
if (_positions.x != transform.position.x && _positions.z != transform.position.z)
transform.LookAt(targetPosition);
transform.DOMove(targetPosition, _time).SetEase(Ease.Linear);
yield return new WaitForSeconds(_time); // 等待一帧时间
equipmentCommon.isMove = _isMove;
}
///
/// 无人机整体位置传递
///
///
protected string GetSyncData(Vector3 _positions)
{
return string.Format("{0},{1},{2},{3},{4}", "DronePosition", equipmentCommon.deviceID, _positions.x, _positions.y, _positions.z);
}
private void OnDestroy()
{
if (airRoute)
Destroy(airRoute.gameObject);
for (int i = 0; i < unmannedAerialVehicleManages.Count; i++)
{
if (unmannedAerialVehicleManages[i] == null)
{
unmannedAerialVehicleManages.RemoveAt(i);
}
}
StopCoroutine(ShowRadarTips(0, 0));
OnActivationChanged -= OnActivationChangedHandler;
}
}
public enum Pattern
{
待机,
警戒,
攻击
}