网上演练
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

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++;
}
}
}