using AX.InputSystem; using AX.MessageSystem; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class FireManDebarkation : MonoBehaviour { private Vector3 EndPos; private Vector3 StartPos; private List ThePath; private NavMeshPath path; private int ManMum; void Start() { MessageDispatcher.AddListener("Debarkation", firemandebarkation); } void OnDestroy() { MessageDispatcher.RemoveListener("Debarkation", firemandebarkation); } private void firemandebarkation(IMessage obj) { if (RecordEvent.IsReplay()) return; long gameid = (long)obj.Sender; if (gameid == this.GetComponent().GameObjID) if (GetComponent()) {//如果障碍组件存在 StartCoroutine(SetXiaoFangYuanPos()); } else { SetPos(); } } IEnumerator SetXiaoFangYuanPos() { GetComponent().enabled = false; yield return null; if (!GetComponent().enabled) {//如果障碍组件关闭了,就开启寻路组件 GetComponent().enabled = true; SetPos(); } else {//如果障碍组件没关闭,就继续执行协程 StartCoroutine(SetXiaoFangYuanPos()); } } void SetPos() { BoxCollider BoxCollider = GetComponent(); float X = 3; int ManMum = GetComponent().CarAttribute.FireManNum; Vector3 vetPos = this.transform.position; bool Can = true; bool Can1 = true; bool Can2 = true; bool Can3 = true; for (int num = 1; num < 5; num++) { switch (num) { case 1: X = BoxCollider.bounds.size.x / 2; StartPos = new Vector3(vetPos.x + 3 * 1, vetPos.y, vetPos.z); ThePath = new List(); for (int i = 0; i < ManMum; i++) { X += 1; EndPos = new Vector3(vetPos.x + X * 1, vetPos.y, vetPos.z); path = new UnityEngine.AI.NavMeshPath(); UnityEngine.AI.NavMesh.CalculatePath(StartPos, EndPos, -1, path); if (path.corners.Length <= 2 && path.corners.Length != 0) { ThePath.Add(path.corners[path.corners.Length - 1]); } else { Can = false; } } if (Can) { GetCar(ThePath); return; } break; case 2: X = BoxCollider.bounds.size.x / 2; StartPos = new Vector3(vetPos.x + 3 * (-1), vetPos.y, vetPos.z); ThePath = new List(); for (int i = 0; i < ManMum; i++) { X += 1; EndPos = new Vector3(vetPos.x + X * (-1), vetPos.y, vetPos.z); path = new UnityEngine.AI.NavMeshPath(); UnityEngine.AI.NavMesh.CalculatePath(StartPos, EndPos, -1, path); if (path.corners.Length <= 2 && path.corners.Length != 0) { ThePath.Add(path.corners[path.corners.Length - 1]); } else { Can1 = false; } } if (Can1) { GetCar(ThePath); return; } break; case 3: X = BoxCollider.bounds.size.z / 2; StartPos = new Vector3(vetPos.x, vetPos.y, vetPos.z + 3 * 1); ThePath = new List(); for (int i = 0; i < ManMum; i++) { X += 1; EndPos = new Vector3(vetPos.x, vetPos.y, vetPos.z + X * 1); path = new UnityEngine.AI.NavMeshPath(); UnityEngine.AI.NavMesh.CalculatePath(StartPos, EndPos, -1, path); if (path.corners.Length <= 2 && path.corners.Length != 0) { ThePath.Add(path.corners[path.corners.Length - 1]); } else { Can2 = false; } } if (Can2) { GetCar(ThePath); return; } break; case 4: X = BoxCollider.bounds.size.z / 2; ThePath = new List(); StartPos = new Vector3(vetPos.x, vetPos.y, vetPos.z + 3 * (-1)); for (int i = 0; i < ManMum; i++) { X += 1; EndPos = new Vector3(vetPos.x, vetPos.y, vetPos.z + X * (-1)); path = new UnityEngine.AI.NavMeshPath(); UnityEngine.AI.NavMesh.CalculatePath(StartPos, EndPos, -1, path); if (path.corners.Length <= 2 && path.corners.Length != 0) { ThePath.Add(path.corners[path.corners.Length - 1]); } else { Can3 = false; } } if (Can3) { GetCar(ThePath); return; } break; default: break; } if (!Can && !Can1 && !Can2 && !Can3) { ResourceLoadWindow.Instance.LoadTextHintWindow("没有合适下车位置", 1.5f); } } } public void GetCar(List ath) { ManMum = GetComponent().CarAttribute.FireManNum; for (int i = 0; i < ManMum; i++) { instanceMan(i); } GetComponent().EnabledSkills &= ~TruckSkillsEnum.Debarkation; if (SelectedObjs.selectedObj == this.gameObject) MessageDispatcher.SendMessage("SetTrcukSkills", gameObject); ReSetNavMesh(); } void ReSetNavMesh() {//如果已经下车,那么就重置障碍组件 if (!GetComponent()) {//如果障碍组件不存在,就跑路 return; } StartCoroutine(ReSetNav()); } IEnumerator ReSetNav() { GetComponent().enabled = false; yield return null; if (!GetComponent().enabled) {//如果寻路组件没有被开启,就开启障碍组件 GetComponent().enabled = true; } else { StartCoroutine(ReSetNav()); } } void instanceMan(int I) { Vector3 vetPos = this.transform.position; Vector3 POS; if (ThePath[I] == null) { POS = ThePath[I - 1]; } else { POS = ThePath[I]; } var arg = new CloneCmdArgs { cloneObjType = CloneObjType.FireMan, hitPos = new Vector3(POS.x, POS.y, POS.z), gameObjID = GetComponent().GameObjID }; MessageDispatcher.SendMessage(EntitiesManager.Instance.CreateObjID(), "CLONE_COMMAND", arg); } }