NewN_UAVPlane/Assets/Zion/Scripts/ModelFunction/TerrestrialRadioInterference/TerrestrialRadioInterferenc...

440 lines
14 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using AdamThinkDevicesData;
using AdamSync;
using DG.Tweening;
using Newtonsoft.Json;
using static InterfaceManager;
using System;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using Random = UnityEngine.Random;
/// <summary>
/// 地面无线电干扰控制
/// </summary>
public class TerrestrialRadioInterferenceManger : MonoBehaviour
{
public EquipmentCommon equipmentCommon;
#region 线
/// <summary>
/// 干扰频率
/// </summary>
public string InterferingFrequency;
/// <summary>
/// 干扰模式
/// </summary>
public string InterferenceMode;
/// <summary>
/// 发射功率
/// </summary>
public string TransmittedPower;
/// <summary>
/// 干扰角度
/// </summary>
public string InterferenceAngle;
/// <summary>
/// 干扰距离
/// </summary>
public string InterferenceDistance;
#endregion
public float detectionRadius = 5f; // 检测范围半径
#region
private bool _isStartRehearsing = false;
/// <summary>
/// 是否正在预演
/// </summary>
public bool isStartRehearsing
{
get { return _isStartRehearsing; }
set
{
if (_isStartRehearsing != value)
{
_isStartRehearsing = value;
OnActivationChanged?.Invoke(_isStartRehearsing);
}
}
}
/// <summary>
/// 布尔值变化时触发的事件
/// </summary>
public event System.Action<bool> OnActivationChanged;
/// <summary>
/// 协程对象
/// </summary>
private Coroutine timerCoroutine;
/// <summary>
/// 定时器运行状态
/// </summary>
private bool isTimerRunning = false;
/// <summary>
/// 间隔时间
/// </summary>
public float interval = 5.0f;
#endregion
/// <summary>
/// 爆炸预制体
/// </summary>
public GameObject explodePrefab;
/// <summary>
/// 飞机迫降的速度
/// </summary>
public float speed = 1;
/// <summary>
/// 地面的图层
/// </summary>
public LayerMask ground;
void Start()
{
equipmentCommon = GetComponent<EquipmentCommon>();
// 订阅布尔值变化事件
OnActivationChanged += OnActivationChangedHandler;
}
// Update is called once per frame
void Update()
{
if (unmannedAerialVehicles.Count > 0 && isDo)
{
isDo = false;
UnmannedAerialVehicle unmannedAerialVehicle = unmannedAerialVehicles.Dequeue();
Vector3 _pos = unmannedAerialVehicle.transform.position - new Vector3(0, 50, 0);
unmannedAerialVehicle.transform.LookAt(_pos);
unmannedAerialVehicle.transform.DOMove(_pos, 1).OnComplete(() =>
{
AddBao(unmannedAerialVehicle);
});
}
//Interferencemode();
//Angularrange();
}
void LateUpdate()
{
Detection();
Interferencemode();
}
/// <summary>
/// 点击无线电显示UI
/// <summary>
private void Detection()
{
if (UIBootstrap.Instance.GetRoleByIDPracticeId(GlobalFlag.practiceSeatId) != "0" && Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
if (EventSystem.current.IsPointerOverGameObject())
{
return;
}
if (hit.transform.tag == "AttackTarget" && hit.transform.GetComponent<TerrestrialRadioInterferenceManger>())
{
Conversionfrequency.Instance.terrestrialRadioInterferenceManger = hit.transform.GetComponent<TerrestrialRadioInterferenceManger>();
Conversionfrequency.Instance.transform.position = Camera.main.WorldToScreenPoint(hit.point);
Conversionfrequency.Instance.gameObject.SetActive(true);
}
}
}
}
#region
/// <summary>
/// 导条变化调用
/// </summary>
/// <param name="newValue"></param>
void OnActivationChangedHandler(bool newValue)
{
if (newValue)
{
StartTimer();
}
else
{
StopTimer();
}
}
IEnumerator Timer()
{
while (true)
{
//Debug.Log("Timer fired at: " + Time.time);
yield return new WaitForSeconds(0.5f); // 等待一段时间后继续执行
RadioDisturbance();
//Interferencemode();
}
}
/// <summary>
/// 开启
/// </summary>
public void StartTimer()
{
if (equipmentCommon.isPlayer && timerCoroutine == null)
{
timerCoroutine = StartCoroutine(Timer());
isTimerRunning = true;
}
}
/// <summary>
/// 停止
/// </summary>
public void StopTimer()
{
if (equipmentCommon.isPlayer && timerCoroutine != null)
{
StopCoroutine(timerCoroutine);
timerCoroutine = null;
isTimerRunning = false;
}
}
#endregion
/// <summary>
/// 数据写入
/// </summary>
/// <param name="weaponitemone"></param>
public void FillInTheData(List<List_paraItem> weaponitemone)
{
//if (equipmentCommon)
//{
//string msg = $"send2room {equipmentCommon.equipmentType}+{transform.position.ToString().Replace(" ", "").Replace("(", "").Replace(")", "")}+{transform.eulerAngles.ToString().Replace(" ", "").Replace("(", "").Replace(")", "")}";
//Debug.Log(msg);
//_ = SyncCreateRoom.SendMessageAsync(msg);
//}
for (int i = 0; i < weaponitemone.Count; i++)
{
switch (weaponitemone[i].para_name)
{
case "干扰频率:":
switch (weaponitemone[i].para_value)
{
case "0":
InterferingFrequency = "1227.60MHz";
break;
case "1":
InterferingFrequency = "1381.05MHz";
break;
case "2":
InterferingFrequency = "1575.42MHz";
break;
case "3":
InterferingFrequency = "2GHz";
break;
case "4":
InterferingFrequency = "4GHz";
break;
case "5":
InterferingFrequency = "5GHz";
break;
default:
break;
}
//interval= float.Parse(InterferingFrequency);
break;
case "干扰模式:":
Debug.LogError(weaponitemone[i].para_value);
switch (weaponitemone[i].para_value)
{
case "0":
InterferenceMode = "驱离";
break;
case "1":
InterferenceMode = "迫降";
break;
default:
break;
}
//InterferenceMode = weaponitemone[i].para_value;
break;
case "发射功率:":
//TransmittedPower = weaponitemone[i].para_value;
Debug.LogError(weaponitemone[i].para_value);
switch (weaponitemone[i].para_value)
{
case "0":
TransmittedPower = "10~30W";
break;
case "1":
TransmittedPower = "30~50W";
break;
case "2":
TransmittedPower = "50~100W";
break;
default:
break;
}
break;
case "干扰角度:":
Debug.LogError(weaponitemone[i].para_value);
InterferenceAngle = weaponitemone[i].para_value;
break;
case "干扰距离:":
InterferenceDistance = weaponitemone[i].para_value;
detectionRadius = float.Parse(InterferenceDistance);
break;
default:
break;
}
}
}
/// <summary>
/// 干扰模式
/// </summary>
public void Interferencemode()
{
Collider[] colliders = Physics.OverlapSphere(transform.position, detectionRadius * 100);//检索范围
for (int i = 0; i < colliders.Length; i++)
{
if (colliders[i].transform.tag == "WRJ")
{
UnmannedAerialVehicle unmannedAerialVehicle = null;
if (colliders[i].GetComponent<UnmannedAerialVehicle>())
{
unmannedAerialVehicle = colliders[i].GetComponent<UnmannedAerialVehicle>();
}
UnmannedAerialVehicleManage unmannedAerialVehicleManage = null;
if (colliders[i].GetComponent<UnmannedAerialVehicleManage>())
{
unmannedAerialVehicleManage = colliders[i].GetComponent<UnmannedAerialVehicleManage>();
unmannedAerialVehicleManage.CheckSatellitePositioningFrequency(this.transform, InterferenceMode, TransmittedPower, InterferingFrequency, InterferenceAngle, ground);
}
}
}
}
/// <summary>
/// 干扰无人机角度范围
/// </summary>
/// <exception cref="NotImplementedException"></exception>
private void Angularrange()
{
Collider[] collider = Physics.OverlapSphere(transform.position, 300);
for (int i = 0; i < collider.Length; i++)
{
if (collider[i].transform.tag == "WRJ")
{
UnmannedAerialVehicle unmannedAerialVehicle = collider[i].GetComponent<UnmannedAerialVehicle>();
Vector3 one = unmannedAerialVehicle.transform.position - transform.position;
float angue = Vector3.Angle(transform.forward, one);
if (float.Parse(InterferenceAngle) >= angue)
{
Debug.LogError("目标出现在范围内");
}
else
{
Debug.LogError("目标没有出现在范围里面");
}
}
}
}
/// <summary>
/// 开启无线电干扰
/// </summary>
public void RadioDisturbance()
{
Collider[] colliders = Physics.OverlapSphere(transform.position, detectionRadius); // 检索范围内的所有碰撞体
for (int i = 0; i < colliders.Length; i++)
{
if (colliders[i].transform.tag == "WRJ")
{
//Debug.Log("检测到无人机: " + col.name);
UnmannedAerialVehicle unmannedAerialVehicle = colliders[i].GetComponent<UnmannedAerialVehicle>();
if (unmannedAerialVehicle)
{
//Debug.Log(col.name+"数据链通信频点...:" + unmannedAerialVehicle.dataLinkCommunicationFrequency);
if (unmannedAerialVehicle.dataLinkCommunicationFrequency == "" || InterferingFrequency == "") continue;//无数据不执行
if (unmannedAerialVehicle.dataLinkCommunicationFrequency == InterferingFrequency)
{
Debug.Log("干扰...:" + colliders[i].name + "成功。");
//unmannedAerialVehicle.BeAssaulted("无线电干扰");
unmannedAerialVehicles.Enqueue(unmannedAerialVehicle);
}
}
}
}
}
Queue<UnmannedAerialVehicle> unmannedAerialVehicles = new Queue<UnmannedAerialVehicle>();
private bool isDo = true;
/// <summary>
/// 销毁单体无人机
/// </summary>
public void AddBao(UnmannedAerialVehicle unmannedAerialVehicle)
{
string nowData = GetSyncDis(unmannedAerialVehicle);
Debug.Log(nowData);
DeviceManager.Instance.send2roomStr.Enqueue(nowData);
string currentTime = System.DateTime.Now.ToString();
string _log = currentTime + " " + equipmentCommon.equipmentType + "(" + equipmentCommon.deviceID + ")" +
"攻击了销毁了" + unmannedAerialVehicle.unmannedAerialVehicleManage.equipmentCommon.equipmentType + "(" + unmannedAerialVehicle.unmannedAerialVehicleManage.equipmentCommon.deviceID + ")"
+ "编号" + unmannedAerialVehicle.serialNumber + "子无人机";
UploadLog(_log);
GameObject Bao = Instantiate(explodePrefab, unmannedAerialVehicle.transform);
Bao.transform.localPosition = Vector3.zero;
Bao.transform.SetParent(null);
Bao.SetActive(true);
Destroy(unmannedAerialVehicle.gameObject);
isDo = true;
}
/// <summary>
///上传日志
/// </summary>
/// <param name="deviceID"></param>
public void UploadLog(string _log)
{
List<UploadLogMain> uploadLogMains = new List<UploadLogMain>();
UploadLogMain uploadLogMain = new UploadLogMain();
uploadLogMain.PracticeId = GlobalFlag.practiceSubjectID;
uploadLogMain.ThinkId = GlobalFlag.currentThinkId;
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);
}));
}
/// <summary>
/// 单个无人机被销毁
/// </summary>
/// <returns></returns>
protected string GetSyncDis(UnmannedAerialVehicle unmannedAerialVehicle)
{
return string.Format("{0},{1},{2}", "DroneWasDestroyed", unmannedAerialVehicle.unmannedAerialVehicleManage.equipmentCommon.deviceID, unmannedAerialVehicle.serialNumber);
}
private void OnDestroy()
{
OnActivationChanged -= OnActivationChangedHandler;
}
}