Четверг, 21 Ноября 2024, 16:26

Приветствую Вас Гость

Меню сайта
Категории каталога
Создание игр [358]
Статьи об общих понятиях связанных с созданием игр.
Программирование [83]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [147]
Статьи о программах для создания игр, уроки и описания.
Софт [43]
Различные программы, в том числе в помощь игроделам.
2D-графика [14]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [17]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [5]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [167]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [132]
Статьи, которые не вошли в определённые разделы.
Наш опрос
Игры какого типа вы предпочитаете делать?
Всего ответов: 16684
Главная » Статьи » Создание игр

Создание простого ИИ с помощью NavMesh(для RPG)
Всем привет! И это снова я! Так как про создание ИИ для FPS (First Personal Shooter) я закончил, я перехожу к следующей части серии своих уроков по NavMesh. Сейчас мы будем создавать искусственный интеллект врага для RPG (Role-Playing Game). Я надеюсь, что вы уже читали статью про сам NavMesh. И, желательно, прочитать статьи про создание ИИ для FPS (1, 2). Пишем на C#. Теперь приступим. У нас есть уже готовый скрипт для NavMesh:
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'а  
}  
}  

В отличие от FPS, RPG на мой взгляд, делать легче. Так что я уложусь и в один урок. Тут мы опять же (как и в FPS-уроке) прописываем в скрипте ИИ Новую строчку в методе (void) Update:
Code

GameObject player = GameObject.FindGameObjectWithTag("Player");  

Опять же мы создаём переменную, и ищем (и помещаем) в неё GameObject с тэгом "Player". Теперь создадим ещё строчку:
Code

if(Vector3.Distance(_agent.transform.position, player.transform.position) < 100){  

}

То же что и в FPS:
Тут мы проверяем, если дистанция от агента до игрока меньше ста. В скобочках ("{", "}") мы укажем что будет.
ЗАПОМНИТЕ! _agent.SetDestination(_target.position); оставляем за проверкой расстояния!
Теперь вернёмся к проверке. Тут мы укажем, что _target - это наш Player.
Мы пишем:
Code

_target = player.transform;

Мы указали, что _target равен координатам нашей переменной player (та, у которой тэг). Проверям. Теперь враг идёт на нас, если мы подошли на определённое расстояние. Едем дальше. Теперь сделаем так, чтобы враг, как потерял игрока, возвращался на стартовую точку. Создадим переменную public Transform _home;. И создадим void Awake(){}. Поясняю. Этот метод при загрузке игры. И пишем:
Code

_home = transform.parent.transform;

То есть указываем координаты материнского объекта. Теперь переходим в редактор, создаём новый (пустой) GameObject. И помещаем в него нашего агента. Теперь опять к коду. После проверки дистанции делаем else (то есть иначе). И прописываем там:
Code

_target = _home;

Тут мы указываем, что объект, к которому движется агент - _home.
Это всё я ещё объяснял в уроке для FPS. У нас получился код:
Code

if(Vector3.Distance(_agent.transform.position, player.transform.position) < 100){  
_target = player.transform;  
}  
else{  
  _target = _home;  
}

Теперь проверка для атаки врага. Но дистанция сейчас будет другая. Пусть будет 4:
Code

if(Vector3.Distance(_agent.transform.position, player.transform.position) < 4){  

}  

А сейчас мы укажем, что будет происходить. Мы просто остановим противника. Указав ему скорость на ноль. И получим:
Code

if(Vector3.Distance(_agent.transform.position, player.transform.position) < 4){  
  _agent.speed = 0;  
}  

Теперь ставим else. В ней мы восстановим скорость. У меня изначальная была 3.5. Вот я и ставлю _agent.speed = 3.5f;
И у нас получилось в итоге:
Code

if(Vector3.Distance(_agent.transform.position, player.transform.position) < 4){  
  _agent.speed = 0;  
  }  
  else{  
  _agent.speed = 3.5f;  
  }  

Так... Теперь мы пойдём в другую сторону. Раньше, для FPS, мы делали объекты оружия, пуль и т.д. Сейчас этого делать не надо. Мы сделаем проще (можете изменить под свой метод). Мы создадим переменную public AnimationClip _animationAttack;. И создавать новый метод (как тогда Fire()) не нужно. Мы просто создадим анимацию пару условий. Пишем в void Start() animation.AddClip(_animationAttack, "attack"); В условии если дистанция меньше 4 пишем animation.CrossFade("attack");. И в условии у нас получается:
Code

if(Vector3.Distance(_agent.transform.position, player.transform.position) < 4){  
  animation.CrossFade("attack");
  _agent.speed = 0;  
  }  
  else{  
  _agent.speed = 3.5f;  
  }  

Вот. Теперь добавим ещё одно условие в void Update(). Это будет проверка проигрывания анимации. Мы пишем:
Code

if(animation.isPlaying("attack")){
player.SendMessage("ApplyDamage", _damage);
}

Всё. Всё у нас получилось.
Теперь немного об дополнительных эффектах. Всё почти так же, как и в FPS-уроке.
Категория: Создание игр | Добавил: Nekit_Aut (22 Марта 2012)
Просмотров: 20485 | Комментарии: 7 | Рейтинг: 4.2/10 |
Теги: SCRIPT, ИИ, Unity3D, Role-playing game, fps, NavMesh, RPG, AI, C#
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

Игровые объявления и предложения:
Если вас заинтересовал материал «Создание простого ИИ с помощью NavMesh(для RPG)», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 7
+2-
3 monowar71   (22 Марта 2012 16:39) [Материал]
monowar71В отличие от FPS, RPG на мой взгляд, делать легче.

Ты не перепутал ли?!

+3-
5 Nekit_Aut   (22 Марта 2012 17:39) [Материал]
Nekit_AutВ отличие от FPS, RPG на мой взгляд, делать легче.

Ну... Для меня легче.

+1-
1 Nekit_Aut   (22 Марта 2012 14:45) [Материал]
Nekit_AutУрок по NavMesh, наверное, заключительный. Можете сказать, какие туторчики написать. Попробую. wink

+2-
2 monowar71   (22 Марта 2012 16:37) [Материал]
monowar71[троллинг]Напиши про создание супер-пупер MMORPG [/троллинг]

В общем распиши про сеть, я думаю создателям mmo будет интересно happy

+2-
4 Nekit_Aut   (22 Марта 2012 17:36) [Материал]
Nekit_AutУхухух... До этого ещё не дошло. Я сам делал мультиплеер по туториалу. Но блин... Серер нужен cry

+3-
6 monowar71   (23 Марта 2012 14:27) [Материал]
monowar71Лучше бери foton и расскажи что нибудь по нему! А то по нему мало туториалов cry

+2-
7 Nekit_Aut   (23 Марта 2012 15:07) [Материал]
Nekit_AutНемного юзал его... Ещё поюзаю и напишу))) Пока можете предложить другие темы. wink

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск по сайту
10 случ. движков
  • AppSalute Creator
  • Retribution Engine
  • Angle2D
  • G3D Engine
  • QCake
  • O.H.R.RPG.C.E
  • GINCS Studio
  • Emcore3D
  • Ursina
  • Platinum Arts Sandbox
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    Все права сохранены. GcUp.ru © 2008-2024 Рейтинг