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.
165 lines
5.4 KiB
165 lines
5.4 KiB
5 years ago
|
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++;
|
||
|
}
|
||
|
}
|
||
|
}
|