Рейтинг
Nekit_Aut20 Марта 2012 в 19:02

Unity3D NavMesh

Здравствуйте. Я знаю, что такие туториалы вроде в интернете есть, но я напишу специально для gcup. Эта функция работает только в юнити версии 3.5.
Итак... Приступим. Открываем Unity и создаём либо терраин, либо плоскость. Ставим ему слой Default и галку на Static. Как на скрине:


Теперь открываем окно Navigation в Windows => Navigation. Появилось такое окно. Теперь выбираем в Navigation Layer слой "Default" (если автоматически не стоит). И нажимаем Bake. Как на скрине:

У нас должна появиться синяя подсветка на поверхности.

Теперь создаём объект, который будет следовать за игроком (или за другим объектом, который укажем в скрипте). Указываем этому объекту компоненты Capsule Collider и Rigidbody (для чайников: это находится в окне Component => Physics). Теперь добавим ещё один компонент. Component => Navigation => Nav Mesh Agent. Теперь устанавливаем радиус. И в Nav Mesh Walkable выбираем слой "Default". Вот как на скрине(к примеру):


Теперь, как я понимаю, многие поняли, для чего мы указываем слой. Агент движется по этому слою.

Теперь пришло время писать скрипт. Создадим скрипт и назовём его AINavMesh. И пишем:
На C#
Code

using UnityEngine;
using System.Collections;

public class AINavMesh : MonoBehaviour {
public Transform _target; // Указываем переменную, к которой будет двигаться наш агент
NavMeshAgent _agent; // Указываем переменную агента

void Start () {
_agent = (NavMeshAgent)this.GetComponent("NavMeshAgent"); // Указываем, что переменная _agent - это наш агент.
}

void Update () {
_agent.SetDestination(_target.position); // Заставляем агента двигаться в сторону _target'а
}
}


Или UnityScript (JavaScript)
Code

#pragma strict

var _target : Transform; // Указываем переменную, к которой будет двигаться наш агент
var _agent : NavMeshAgent; // Указываем переменную агента

function Start () {
// Тут мы не напишем. Почему - читайте ниже.
}

function Update () {
_agent.SetDestination(_target.position); // Заставляем агента двигаться в сторону _target'а
}

Итак. Вот скрипты. Но мы не указали агент в JS. Там мы уж укажем агент в инспекторе (извините, моя проблема перевода скриптов с C# на JS).

Теперь переходим в редактор. Вешаем скрипт на объект с NavMeshAgent'ом. Если C#, то ничего в инспекторе указывать не надо. А если JS, то укажем агент. То есть перенесём самого персонажа туда. Теперь тестим! Всё работает! Но это ещё не всё.

Дополнительная информация к статье:
Чтобы сделать так, чтобы агент обходил стены, то им надо поставить слой "Default" (ну, всё так же, как и у поверхности).
Ну... Это всё) До скорых встреч! Так же пользуйтесь справкой по юнити, чтобы побольше узнать о скриптах NavMesh. Ведь на NavMesh можно построить хороший ИИ и сократить кол-во строчек кода!

11 комментариев