using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using AdamThinkDevicesData; using AdamSync; using Newtonsoft.Json; using static InterfaceManager; using DG.Tweening.Core.Easing; using UnityEngine.EventSystems; using System; using Random = UnityEngine.Random; /// /// 激光火控平台 /// public class LaserFireControlPlatformManger : MonoBehaviour { public EquipmentCommon equipmentCommon; /// /// 所有激光火控平台 /// public static List laserFireControlPlatformMangers = 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; /// /// 协程对象 /// private Coroutine coroutinetime; /// /// 定时器运行状态 /// private bool islaser = false; /// /// 协程对象 /// private Coroutine timerCoroutine; /// /// 定时器运行状态 /// private bool isTimerRunning = false; /// /// 间隔时间 /// public float interval = 5.0f; #endregion #region 激光火控平台数据 /// /// 储能间隔时间 /// public string StorageIntervalTime; /// /// 毁伤目标累积作用时间 /// public string CumulativeActionTimeOfDamageTarget; /// /// 干扰距离 /// public string InterferenceDistance; /// /// 干扰角度 /// public string InterferenceAngle; /// /// 接收干扰距离 /// public float Receivingdistance; /// /// 计时器 /// public float timepiece = 5; #endregion #region 激光 /// /// 是否这在攻击无人机 /// public bool isLasing = false;//判断看向无人机 public bool isLasings = false;//判断时候需要攻击 public GameObject LaserModer; public GameObject LaserPoint; public Transform targetPoint; // 锁定目标点的Transform组件 private Transform Receivingposin;//激光武器打击无人机位置 public GameObject InnerLaserlineRendererPrefab; // 用于绘制射线的LineRenderer组件 public GameObject OuterLaserlineRendererPrefab; // 用于绘制射线的LineRenderer组件 public LineRenderer InnerLaserlineRenderer; // 用于绘制射线的LineRenderer组件 public LineRenderer OuterLaserlineRenderer; // 用于绘制射线的LineRenderer组件 //private Vector3 laserStartPoint = Vector3.zero; //private Vector3 laserEndPoint = Vector3.zero; public float FireSpeed = 20.0f;//激光速度 #endregion /// /// 爆炸预制体 /// public GameObject explodePrefab; /// /// 十字准星架视角 /// public Camera Camera; /// /// 十字准星架视角UI显示 /// public GameObject RawImage; /// /// 接收十字准星生成的界面 /// public GameObject crosshair; /// /// 显示十字准星开关 /// public bool Front = true; /// /// 点击空白处碰撞器 /// public GameObject Detection; void Start() { equipmentCommon = GetComponent(); laserFireControlPlatformMangers.Add(this); Camera = transform.GetChild(1).GetComponent(); //weaponitemones = Newtonsoft.Json.JsonConvert.DeserializeObject(msg); //FillInTheData(weaponitemones);//测试写入 // 订阅布尔值变化事件 OnActivationChanged += OnActivationChangedHandler; //生成激光 GameObject _InnerLaserlineRenderer = Instantiate(InnerLaserlineRendererPrefab); _InnerLaserlineRenderer.transform.position = Vector3.zero; //_InnerLaserlineRenderer.transform.SetParent(transform); InnerLaserlineRenderer = _InnerLaserlineRenderer.GetComponent(); if (InnerLaserlineRenderer) { InnerLaserlineRenderer.positionCount = 2; // 设置线段的端点数量为2 InnerLaserlineRenderer.SetPosition(0, LaserPoint.transform.position); // 设置线段起点为物体位置 InnerLaserlineRenderer.SetPosition(1, LaserPoint.transform.position); // 设置线段终点为目标点 } GameObject _OuterLaserlineRenderer = Instantiate(OuterLaserlineRendererPrefab); _OuterLaserlineRenderer.transform.position = Vector3.zero; //_OuterLaserlineRenderer.transform.SetParent(transform); OuterLaserlineRenderer = _OuterLaserlineRenderer.GetComponent(); if (OuterLaserlineRenderer) { OuterLaserlineRenderer.positionCount = 2;// 设置线段的端点数量为2 OuterLaserlineRenderer.SetPosition(0, LaserPoint.transform.position);// 设置线段起点为物体位置 OuterLaserlineRenderer.SetPosition(1, LaserPoint.transform.position);// 设置线段终点为目标点 } } void Update() { if (UIBootstrap.Instance.GetRoleByIDPracticeId(GlobalFlag.practiceSeatId) != "0"&&Input.GetMouseButtonDown(0)) { if (!EventSystem.current.IsPointerOverGameObject()) { Destroy(crosshair.gameObject); Front = true; } } } /// /// 开启暂停激光发射武器 /// void OnActivationChangedHandler(bool bos) { if (bos) { Debug.LogError("开启协程"); starttimer(); } else { Debug.LogError("暂停协程"); stoptimer(); } } /// /// 开启协程 /// /// private void starttimer() { if (equipmentCommon.isPlayer && coroutinetime == null) { coroutinetime = StartCoroutine(Timer()); islaser = true; } } /// /// 关闭协程 /// private void stoptimer() { if (equipmentCommon.isPlayer && coroutinetime != null) { StopCoroutine(coroutinetime); islaser = false; } } /// /// 协程 /// IEnumerator Timer() { while (true) { yield return new WaitForSeconds(timepiece); if (timepiece!=0) { Laserattack(); } } } void LateUpdate() { } #region 创建场景激光发射 /// /// 数据写入 /// /// public void FillInTheData(List weaponitemone) { for (int i = 0; i < weaponitemone.Count; i++) { switch (weaponitemone[i].para_name) { case "储能间隔时间:": StorageIntervalTime = weaponitemone[i].para_value; timepiece = float.Parse(StorageIntervalTime); break; case "毁伤目标累积作用时间:": CumulativeActionTimeOfDamageTarget = weaponitemone[i].para_value; break; case "干扰距离:": InterferenceDistance = weaponitemone[i].para_value; Receivingdistance = float.Parse(InterferenceDistance) * 1000; break; case "干扰角度:": InterferenceAngle = weaponitemone[i].para_value; break; default: break; } } } /// /// 激光发起攻击 /// public void Laserattack() { if (Receivingdistance > 0 && targetPoint!=null) { Collider[] colliders = Physics.OverlapSphere(transform.position, Receivingdistance);//检查是否在打击的范围内 Debug.LogError("范围打击距离:" + Receivingdistance); for (int i = 0; i < colliders.Length; i++) { if (colliders[i].gameObject.tag == "WRJ") { UnmannedAerialVehicle unmannedAerialVehicle = null; if (colliders[i].GetComponent()) { unmannedAerialVehicle = colliders[i].GetComponent(); } if (unmannedAerialVehicle != null) { Vector3 Angle = unmannedAerialVehicle.transform.position - transform.position; float Angle1 = Vector3.Angle(Angle, transform.forward); Debug.LogError("角度大小:" + Angle1); if (float.Parse(InterferenceAngle) >= Angle1) { Debug.LogError("角度没有问题进来了" + InterferenceAngle); if (Receivingposin==null) { //if (Random.value>0.5f) //{ Receivingposin = unmannedAerialVehicle.transform; Debug.LogError("接收无人机的位置" + Receivingposin.position); var nowData = GetSyncData(); _ = SyncCreateRoom.SendMessageAsync(string.Format("send2room {0}", nowData)); isLasings = true; CastRayAndRender(); break; //} //else //{ // Receivingposin = unmannedAerialVehicle.transform; // var nowData1= GetSyncData1(); // _ = SyncCreateRoom.SendMessageAsync(string.Format("send2room {0}", nowData1)); // isLasings = true; // CastRayAndRender1(); // break; //} } } } } } } } private string GetSyncData1() { return string.Format("{0},{1},{2},{3}" + equipmentCommon.deviceID, Receivingposin.position.x+3,Receivingposin.position.y+3,Receivingposin.position.z); } /// /// 看向无人机 /// public void Lasing() { if (targetPoint != null) { LaserModer.transform.DOLookAt(targetPoint.position, 0.1f).OnComplete(() => { isLasing = false; //CastRayAndRender(); }); //var nowData = GetSyncData(); //_ = SyncCreateRoom.SendMessageAsync(string.Format("send2room {0}", nowData)); } else { Debug.LogError("没有目标"); } } /// /// 十字准星架视角 /// public void Crosshair() { if (targetPoint != null) { Camera.transform.DOLookAt(targetPoint.position, 0.1f).SetEase(Ease.Linear); //isLasing = false; } } /// /// 激光显示 /// public void CastRayAndRender() { if (InnerLaserlineRenderer) { InnerLaserlineRenderer.SetPosition(0, LaserPoint.transform.position); // 设置线段起点为物体位置 InnerLaserlineRenderer.SetPosition(1, Receivingposin.position); // 设置线段终点为目标点 } if (OuterLaserlineRenderer) { OuterLaserlineRenderer.SetPosition(0, LaserPoint.transform.position); // 设置线段起点为物体位置 OuterLaserlineRenderer.SetPosition(1, Receivingposin.position); // 设置线段终点为目标点 } StrikeDrone(Receivingposin); } /// /// 打击无人机 /// private void StrikeDrone(Transform hit) { UnmannedAerialVehicle unmannedAerialVehicle = hit.GetComponent(); if (unmannedAerialVehicle) { //unmannedAerialVehicle.BeAssaulted("激光打击"); AddBao(unmannedAerialVehicle); StartCoroutine(LaserExtinction()); } } /// /// 激光打击位置未打中 /// public void Lasering() { if (targetPoint != null) { targetPoint.position = new Vector3(targetPoint.position.x + 5, targetPoint.position.y, transform.position.z); LaserModer.transform.DOLookAt(targetPoint.position, 0.5f); //CastRayAndRender1(); } } /// /// 十字准星架为打中视角 /// public void Crosshair1() { if (targetPoint != null) { targetPoint.position = new Vector3(targetPoint.position.x + 5, targetPoint.position.y, transform.position.z); Camera.transform.DOLookAt(targetPoint.position, 0.1f).SetEase(Ease.Linear); } } /// /// 激光显示为打中 /// public void CastRayAndRender1() { if (InnerLaserlineRenderer) { InnerLaserlineRenderer.SetPosition(0, LaserPoint.transform.position); // 设置线段起点为物体位置 InnerLaserlineRenderer.SetPosition(1, Receivingposin.position); // 设置线段终点为目标点 } if (OuterLaserlineRenderer) { InnerLaserlineRenderer.SetPosition(0, LaserPoint.transform.position); // 设置线段起点为物体位置 InnerLaserlineRenderer.SetPosition(1, Receivingposin.position); // 设置线段终点为目标点 } StartCoroutine(LaserExtinction()); } /// /// 销毁单体无人机 /// 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); } /// ///上传日志 /// /// public void UploadLog(string _log) { List uploadLogMains = new List(); 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); })); } /// /// 单个无人机被销毁 /// /// protected string GetSyncDis(UnmannedAerialVehicle unmannedAerialVehicle) { return string.Format("{0},{1},{2}", "DroneWasDestroyed", unmannedAerialVehicle.unmannedAerialVehicleManage.equipmentCommon.deviceID, unmannedAerialVehicle.serialNumber); } /// /// 隐藏激光 /// public IEnumerator LaserExtinction() { yield return new WaitForSeconds(1f); if (InnerLaserlineRenderer) { InnerLaserlineRenderer.SetPosition(0, LaserPoint.transform.position); // 设置线段起点为物体位置 InnerLaserlineRenderer.SetPosition(1, LaserPoint.transform.position); // 设置线段终点为目标点 } if (OuterLaserlineRenderer) { OuterLaserlineRenderer.SetPosition(0, LaserPoint.transform.position); // 设置线段起点为物体位置 OuterLaserlineRenderer.SetPosition(1, LaserPoint.transform.position); // 设置线段终点为目标点 } isLasings = false; } #endregion /// /// 激光发射点位 /// /// protected string GetSyncData() { Debug.Log("目标点位..:" + Receivingposin.position); return string.Format("{0},{1},{2},{3},{4}", "Lasing", equipmentCommon.deviceID, Receivingposin.position.x, Receivingposin.position.y, Receivingposin.position.z); } /// /// 非自生成激光发射台发射激光发射激光 /// /// public void NonSelfGeneratedEmissionLaser(string[] data) { //激光位置下发传递 Vector3 vector3 = new Vector3(float.Parse(data[2]), float.Parse(data[3]), float.Parse(data[4])); LaserModer.transform.DOLookAt(vector3, 0.1f).OnComplete(() => { if (InnerLaserlineRenderer) { InnerLaserlineRenderer.SetPosition(0, LaserPoint.transform.position); // 设置线段起点为物体位置 InnerLaserlineRenderer.SetPosition(1, vector3); // 设置线段终点为目标点 } if (OuterLaserlineRenderer) { OuterLaserlineRenderer.SetPosition(0, LaserPoint.transform.position); // 设置线段起点为物体位置 OuterLaserlineRenderer.SetPosition(1, vector3); // 设置线段终点为目标点 } StartCoroutine(LaserExtinction()); }); } /// /// 检查鼠标是否进入物体 /// public void OnMouseEnter() { if (UIBootstrap.Instance.GetRoleByIDPracticeId(GlobalFlag.practiceSeatId) != "0") { Transform Canvas = GameObject.Find("Canvas").transform; if (Canvas && Front) { crosshair = Instantiate(RawImage, Canvas); crosshair.transform.position = Camera.main.WorldToScreenPoint(transform.position); } } } /// /// 检查鼠标是否离开物体 /// public void OnMouseExit() { Front = false; } private void OnDestroy() { Destroy(crosshair.gameObject); Destroy(InnerLaserlineRenderer.gameObject); Destroy(OuterLaserlineRenderer.gameObject); OnActivationChanged -= OnActivationChangedHandler; } }