Для врагов я устанавливал случайную позицию в навигационной сетке каждые x секунд, чтобы враги случайно шли вокруг. Вот мои скрипты:NavMeshAgent застрял (снаружи) NavMesh
Случайная точка (из Docs единства)
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");
}
}
случайная ходьба обычно работает. Однако, когда агент навигационной сети близок к границе навигационной сетки, кажется, что он «вырывается» и затем придерживается своего положения. Он только «дрожит» вне навигационной сетки. (красные линии на изображении: путь)
Похоже, они пытаются достичь своей позиции, но не может войти в навигационную сетку снова. Я не хочу, чтобы они ушли на первое место :)
Здравствуйте, fgirst of all, я не знаю, что делает функция geileMethodeZumZeichnen (agent). Во всяком случае, единственная проблема, которую я вижу, это то, что вы вызываете сопрограмму прохода внутри сопрограммы (я считаю, что сопрограмма останавливается, когда заканчивается главный). Последнее, я думаю, вы рисуете линии отладки, чтобы увидеть цели агентов. Если нет, вы должны это сделать. Благодарю. – Cabrra
Извините, да, именно это и делает метод. Моя переменная «заблокирована» означает «путь заблокирован», поэтому я вызываю это снова, чтобы вычислить другую точку. – Mirco
Это может быть глупый вопрос. Но почему бы вам не позвонить в Update()? Это может быть менее оптимальным и израсходовать процессорные циклы. Но я думаю, что когда yiu вызывает сопрограмму внутри коротина, вторая сопрограмма останавливается, когда заканчивается первая. (unles у вас есть бесконечный цикл в первом). Я не знаю, понимаете ли вы это ... :(sorry – Cabrra