You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
164 lines
5.4 KiB
164 lines
5.4 KiB
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<Vector3> corners = new List<Vector3>(); |
|
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<PathFindSyncData>(); |
|
if (InputManager.Instance) |
|
{ |
|
if (CurrentUserInfo.mySelf.Id != info.SendUserID) |
|
{ |
|
BaseGameObjInfo i = GetComponent<BaseGameObjInfo>(); |
|
if (info.gameObjID==GetComponent<BaseGameObjInfo>().gameObjID) |
|
{ |
|
pathfind(info); |
|
if (GetComponent<TrappedMoveFree>()) |
|
{ |
|
GetComponent<TrappedMoveFree>().targetPosition = info.trappedTargetpoint; |
|
GetComponent<TrappedMoveFree>().MeetDangerous = info.TrappedMeetDangerous; |
|
} |
|
} |
|
} |
|
} |
|
//else |
|
//{ |
|
// NetworkSyncHelper.AddSyncData(info); |
|
//} |
|
} |
|
|
|
|
|
private void pathfind(PathFindSyncData data) |
|
{ |
|
// GameObject pathfindobj = EntitiesManager.Instance.GetEntityByID(data.gameObjID); |
|
agent =GetComponent<NavMeshAgent>(); |
|
filter = new NavMeshQueryFilter(); |
|
filter.agentTypeID = agent.agentTypeID; |
|
filter.areaMask = agent.areaMask; |
|
if (GetComponent<BaseGameObjInfo>().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<Vector3> 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<Vector3> 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<BaseGameObjInfo>(); |
|
if (objinfo.gameObjType == CloneObjType.fireman || objinfo.gameObjType == CloneObjType.ObligationFireman) |
|
{ |
|
//setFloorMessage(); |
|
} |
|
i++; |
|
} |
|
} |
|
}
|
|
|