using AX.Network.Protocols; using AX.Serialization; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; using System; public class PATHFIND_SYNC : NetworkMessageBehaviour { public List corners = new List(); private NavMeshQueryFilter filter; private Vector3 lastPosition; private NavMeshAgent agent; void Start() { } protected override void Execute(BinaryMessage message) { InputHistory.Instance.RegisterInputHistory(message); //var sender = message.ID; var info = message.Body.Deserialize(); if (InputManager.Instance) { if (CurrentUserInfo.mySelf.Id != info.SendUserID) { BaseGameObjInfo i = GetComponent(); if (info.gameObjID==GetComponent().gameObjID) { pathfind(info); if (GetComponent()) { GetComponent().targetPosition = info.trappedTargetpoint; GetComponent().MeetDangerous = info.TrappedMeetDangerous; } } } } //else //{ // NetworkSyncHelper.AddSyncData(info); //} } private void pathfind(PathFindSyncData data) { // GameObject pathfindobj = EntitiesManager.Instance.GetEntityByID(data.gameObjID); agent =GetComponent(); filter = new NavMeshQueryFilter(); filter.agentTypeID = agent.agentTypeID; filter.areaMask = agent.areaMask; if (GetComponent().gameObjID == data.gameObjID) { //挂在所有寻路物体上? StopAllCoroutines(); corners.Clear(); bool flag = setPathCorners(transform.position, data.TargetPoint, corners); if (flag) { //setFloorMessage(hitObj.transform); removeNoMainCorners(corners); StartCoroutine(GoToDestination()); } } } bool setPathCorners(Vector3 sourcePosition, Vector3 targetPosition, List corners) { NavMeshPath NavMeshPath = new NavMeshPath(); NavMesh.CalculatePath(sourcePosition, targetPosition, filter, NavMeshPath); Vector3[] b = NavMeshPath.corners; if (b.Length == 1) { //Debug.Log("断裂"); return false; } if (NavMeshPath.status == NavMeshPathStatus.PathComplete) { //Debug.Log("PathComplete"); foreach (Vector3 corner in b) { if (!corners.Contains(corner)) { corners.Add(corner); } } return true; } else if (NavMeshPath.status == NavMeshPathStatus.PathPartial) { if (Vector3.Distance(b[b.Length - 1], lastPosition) == 0) { //Debug.Log("(" + sourcePosition.x + "," + sourcePosition.y + "," + sourcePosition.z + ")、(" + lastPosition.x + "," + lastPosition.y + "," + lastPosition.z + ")"); //Debug.Log("进入死循环"); return false; } foreach (Vector3 corner in b) { if (!corners.Contains(corner)) { corners.Add(corner); } } lastPosition = sourcePosition; return setPathCorners(b[b.Length - 1], targetPosition, corners); } else if (NavMeshPath.status == NavMeshPathStatus.PathInvalid) { return false; } else { return false; } } void removeNoMainCorners(List corners) { for (int i = 0; i < corners.Count - 1; i++) { for (int k = corners.Count - 2; k > i; k--) { float distance = Vector3.Distance(corners[i], corners[k]);//计算两点的距离 if (distance < 5) { for (int j = k; j > i; j--) { corners.RemoveAt(j); } break; } } } } IEnumerator GoToDestination() { int i = 1; while (i < corners.Count) { NavMeshPath NavMeshPath = new NavMeshPath(); NavMesh.CalculatePath(transform.position, corners[i], filter, NavMeshPath); agent.SetDestination(corners[i]); while (agent.pathPending) yield return null; //wait until we reached this position float remain = Vector3.Distance(transform.position, corners[i]); while (remain == Mathf.Infinity || remain - agent.stoppingDistance > float.Epsilon) { remain = Vector3.Distance(transform.position, corners[i]); yield return null; } var objinfo = GetComponent(); if (objinfo.gameObjType == CloneObjType.fireman || objinfo.gameObjType == CloneObjType.ObligationFireman) { //setFloorMessage(); } i++; } } }