NavMeshAgent判断目标位置可否到达

在项目开发中有个需求,就是敌人互相判断是否可以看见对方。 对于平面游戏 一般我们只需要规定两个限定条件: ViewAngle:角度 ViewMaxDis:可视距离 平面游戏通过ViewAngle+ViewMaxDis这两个条件就可以很好得出目标是否在当前对象的视角范围内,而对于有平面高度差的3D世界来说,仅通过这两个条件会误判到不同平面下的对象。 如上图,两个敌人属于不同的平面,敌人B在敌人A的ViewAngle与ViewMaxDis内,敌人A即将追逐敌人B,但我们希望对于不同的平面上的对象视为无法看见。所以需要增加一个条件 即是否可到达/路径是否有效。 NavMesh系统为提供了计算路径的方法,我们可以根据NavMeshPathStatus来判断是否属于同一个平面。
private bool IsSeeTarget(Transform target, float angle)
{
if (target == null||target.gameObject.activeInHierarchy==false)
{
return false;
}
NavMeshPath path = moveComponent.CalculatePath(target.position);
if (path==null||path.status==NavMeshPathStatus.PathPartial||path.status==NavMeshPathStatus.PathInvalid)
{
return false;
}
Vector3 dir = (target.transform.position - moveComponent.POSITION).normalized;
return (Vector3.Angle(transform.forward, dir) <= angle / 2);
}
NavMeshPathStatus介绍:

NavMeshPathStatus.PathComplete:路径可到达

NavMeshPathStatus.PathInvalid:路径无效或不存在。

NavMeshPathStatus.PathPartial:路径存在但无法到达

像图中这样的两种没有阶梯连接的平台,我们只需要判断路径能否到达到目标位置即可大概判断出是否属于一个平面。 既然我们已经用了NavMeshPath判断可视范围了,那不妨我们将ViewMaxDis理解为有效路径的最大长度。 通过path.corner 获取到每一个拐点,累计每个点之间的距离计算出路径的长度,与ViewMaxDis进行比较,小于ViewMaxDis即判断为可视距离。通过NavMesh还能做到很多的可视判断,如敌人追踪等需求。大家可以尝试一下 [ivory-search id="105" title="Default Search Form"]
作者:Miracle
来源:麦瑞克博客
链接:https://www.unitymake.com/archives/unity/78
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议,转载请注明!
THE END
分享
打赏
海报
NavMeshAgent判断目标位置可否到达
在项目开发中有个需求,就是敌人互相判断是否可以看见对方。 对于平面游戏 一般我们只需要规定两个限定条件: ViewAngle:角度 ViewMaxDis:可……
<<上一篇
下一篇>>