NPC инстанцирует на Навмеш - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь создать префаб NPC на NavMesh в виде сетки.В префабе есть компонент NavMeshAgent, а NavMesh запечен.Я получаю ошибки:

"SetDestination" can only be called on an active agent that has been placed on a NavMesh.
UnityEngine.AI.NavMeshAgent:SetDestination(Vector3)

и

"GetRemainingDistance" can only be called on an active agent that has been placed on a NavMesh.
UnityEngine.AI.NavMeshAgent:get_remainingDistance()

При использовании следующего сценария на пустом объекте GameObject, размещенном над NavMesh:

 // Instantiates a prefab in a grid

    public GameObject prefab;
    public float gridX = 5f;
    public float gridY = 5f;
    public float spacing = 2f;

    void Start()
    {
        for (int y = 0; y < gridY; y++)
        {
            for (int x = 0; x < gridX; x++)
            {
                Vector3 pos = new Vector3(x, 0, y) * spacing;
                Instantiate(prefab, pos, Quaternion.identity);
            }
        }
    }

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

О программе:

«SetDestination» может быть вызван только для активного агента, который был помещен в NavMesh.UnityEngine.AI.NavMeshAgent: SetDestination (Vector3)

Я считаю, что проблема заключается в том, что вы не добавляете соответствующую логику NavMeshAgent в префабы, которые вы создаете.Выполните следующие действия:

  • Добавьте агента Mesh Nav к префабу, экземпляр которого вы создаете
  • Установите, только для тестирования, точку назначения (это может быть пустой игровой объект) и имяit "Destination"
  • Добавьте следующий сценарий к объекту GameObject, для которого вы хотите создать экземпляр

Примерно так:

public class Movement : MonoBehaviour {
        //Point towards the instantiated Object will move
        Transform goal;

        //Reference to the NavMeshAgent
        UnityEngine.AI.NavMeshAgent agent;

        // Use this for initialization
        void Start () {
            //You get a reference to the destination point inside your scene
            goal = GameObject.Find("Destination").GetComponent<Transform>();

            //Here you get a reference to the NavMeshAgent
             agent = GetComponent<UnityEngine.AI.NavMeshAgent>();

            //You indicate to the agent to what position it has to move
            agent.destination = goal.position;
        }

}

В случае, если ваш экземплярный префаб нуждается вЕсли вы что-то преследуете, вы можете обновить goal.position из Update ().Нравится:

void Update(){
    agent.destination = goal.position;
}
0 голосов
/ 06 декабря 2018

ОК, разобрался в проблеме.Согласно моему OP, у меня была запеченная Nav Mesh, а в prefabs был компонент Nav Mesh Agent.Проблема заключалась в разрешении Nav Mesh и Base Offset в Nav Mesh Agent, который был установлен в -0.2.

Перепроверка Nav Mesh с настройкой Height Mesh позволила сделать области прохождения более точными.

enter image description here

Вместе с изменением базового смещения наагент Nav Mesh для 0.

enter image description here

0 голосов
/ 30 ноября 2018

Начну с того, что время от времени NavMesh очень хитрый.Есть так много маленьких причуд и т. Д., Что я закончил тем, что отошел от NavMesh и использую библиотеку стилей A * (A Star) для лучей.Нигде не эффективен для десятков одновременно движущихся объектов, но очень универсален для динамических карт И для лазания по объектам / моделям.

Также я бы сказал, что для использования Nav Mesh недостаточно использовать простые команды API - вам нужно понимать множество компонентов, которые работают вместе, а документация Unity не так полезна, как должнабыть.Будьте готовы выпустить немного волос, если вы используете динамические сущности и вам необходимо выполнить повторный запуск и т. Д.

В любом случае, первое, о чем я бы хотел вас предупредить, это то, что если у ваших сущностей есть коллайдеры вокруг них, они могутмешать их собственной навигации (поскольку их собственный коллайдер может врезаться в навигационную сетку, оставляя сущность на небольшом участке без сетки).

Во-вторых, я бы предложил вам Warp () на вашу сущность нанавигационная сетка.Это берет местоположение вашей сущности (возможно, не совсем в сетке навигации) и деформирует ее к закрывающему доступному узлу / ссылке NavMesh, в которой она должна быть в состоянии перемещаться

Удачи!

...