【发布时间】:2016-07-04 21:47:03
【问题描述】:
对于敌人,我每隔 x 秒在导航网格上设置一个随机位置,以便敌人随机走动。这是我的脚本:
随机点(来自统一文档)
bool RandomPoint (Vector3 center, float range, out Vector3 result)
{
for (int i = 0; i < 30; i++) {
Vector3 randomPoint = center + Random.insideUnitSphere * range;
NavMeshHit hit;
if (NavMesh.SamplePosition (randomPoint, out hit, 1.0f, NavMesh.AllAreas)) {
result = hit.position;
return true;
}
}
result = Vector3.zero;
return false;
}
我的随机移动脚本:
IEnumerator Walking ()
{
if (!isFollowingPlayer && isServer) {
Debug.LogError ("-- Start Walking --");
agent.speed = 2;
Vector3 randomDirection;
bool blocked = RandomPoint (agent.transform.position, walkRadius, out randomDirection);
NavMeshHit hit;
blocked = NavMesh.Raycast (enemy.transform.position, randomDirection, out hit, NavMesh.AllAreas);
if (!blocked) {
geileMethodeZumZeichnen (agent);
target = hit.position;
agent.SetDestination (hit.position);
geileMethodeZumZeichnen (agent);
Debug.LogWarning ("Go to " + hit.position);
}
if (blocked) {
Debug.LogWarning ("-- BLOCKED --");
yield return new WaitForEndOfFrame ();
} else {
Debug.LogWarning ("-- WAIT --");
yield return new WaitForSeconds (5f);
}
StartCoroutine ("Walking");
}
}
随机行走通常有效。然而,当导航网格代理接近导航网格的边界时,他似乎“突围”,然后被卡在他的位置上。他只是在导航网之外“四处颤抖”。 (图片上的红线:路径)
看起来他们试图到达他们的位置,但无法再次进入导航网格。我不希望他们首先离开:)
【问题讨论】:
-
您好,首先,我不知道“geileMethodeZumZeichnen (agent)”函数的作用。无论如何,我看到的唯一问题是你在协程内部调用 walk 协程(我相信协程在主协程结束时停止)。最后一件事,我猜您正在绘制调试线以查看代理目标。如果没有,你应该这样做。谢谢。
-
对不起,是的,这正是该方法的作用。我的变量“阻塞”的意思是-“路被阻塞”,所以我再次调用它来计算另一个点
-
这可能是一个愚蠢的问题。但是你为什么不叫 walk in Update() 呢?它可能不太理想并浪费处理器周期。但是我认为当 yiu 在协程中调用协程时,第二个协程会在第一个协程结束时停止。 (除非你在第一个有无限循环)。我不知道你是否明白这一点... :( 抱歉