这是第一个 Unity 开放项目的repo,是 Unity 和社区合作创建的一个小型开源游戏演示,第一款游戏是一款名为 Chop Chop 的动作冒险游戏。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

117 行
2.2 KiB

using UnityEngine;
using UnityEngine.AI;
using System.Collections.Generic;
using System.Linq;
public class PathwayNavMesh
{
private PathwayConfigSO _pathway;
public PathwayNavMesh(PathwayConfigSO pathway)
{
_pathway = pathway;
_pathway.Hits = new List<bool>();
}
public bool HasNavMeshAt(int index)
{
NavMeshHit hit;
bool hasHit = true;
if (_pathway.Waypoints.Count >= _pathway.Hits.Count)
{
hasHit = NavMesh.SamplePosition(_pathway.Waypoints[index].waypoint, out hit, _pathway.ProbeRadius, NavMesh.AllAreas);
if (index > _pathway.Hits.Count - 1)
{
index = _pathway.Hits.Count;
_pathway.Hits.Add(hasHit);
}
else
{
_pathway.Hits[index] = hasHit;
}
if (hasHit)
{
_pathway.Waypoints[index].waypoint = hit.position;
}
}
else
{
_pathway.Hits.RemoveAt(index);
}
return hasHit;
}
private List<Vector3> GetPathCorners(int startIndex, int endIndex)
{
NavMeshPath navMeshPath = new NavMeshPath();
if (NavMesh.CalculatePath(_pathway.Waypoints[startIndex].waypoint, _pathway.Waypoints[endIndex].waypoint, NavMesh.AllAreas, navMeshPath))
{
return navMeshPath.corners.ToList();
}
else
return null;
}
private bool CopyCorners(int startIndex, int endIndex)
{
List<Vector3> result;
if ((result = GetPathCorners(startIndex, endIndex)) != null)
{
_pathway.Waypoints[startIndex].corners = result;
}
return result != null;
}
public bool UpdateCornersAt(int index)
{
bool canUpdate = true;
if (_pathway.Waypoints.Count > 1 && index < _pathway.Waypoints.Count)
{
if (index == 0)
{
canUpdate = CopyCorners(index, index + 1);
canUpdate &= CopyCorners(_pathway.Waypoints.Count - 1, index);
}
else if (index == _pathway.Waypoints.Count - 1)
{
canUpdate = CopyCorners(index - 1, index);
canUpdate &= CopyCorners(index, 0);
}
else
{
canUpdate = CopyCorners(index - 1, index);
canUpdate &= CopyCorners(index, index + 1);
}
}
return canUpdate;
}
public void UpdatePath()
{
if (_pathway.Waypoints.Count > 1)
{
_pathway.Path = _pathway.Waypoints.Aggregate(new List<Vector3>(), (acc, wpd) =>
{
wpd.corners.ForEach(c => acc.Add(c));
return acc;
});
}
else
{
_pathway.Path.Clear();
}
}
}