Один скрипт AI на несколько обьектов.

Программирование на Юнити.

Re: Один скрипт AI на несколько обьектов.

Сообщение strelok 23 дек 2010, 15:37

Делюсь своим опытом.
Да, возможно, он не оптимален, не профессионален, но тем не менее - работает.
1.Берём готовое решение поиска пути (А*). Настраиваем локацию.
2.Варганим простой (или сложный, у меня простой) скрипт ИИ, отвечающий за поведение персонажа. Я использовал оператор switch (руководств по JS огромное количество, хотя, он работает, по-моему, во всех языках идентично).
3.Связываем два наших решения и лепим готовые скрипты на подготовленного (анимация, кровища, рэг-долл т.д.) персонажа. Всю эту красотищу запихиваем в префаб.
4."Рожаем" бота в любом месте локации, любым способом, в любое время и он, сЮка, начинает жить своей собственной жизнью, пока ему что-нибудь не отстрелят :D
:ympeace:
Последний раз редактировалось strelok 23 дек 2010, 15:54, всего редактировалось 1 раз.
strelok
UNIверсал
 
Сообщения: 356
Зарегистрирован: 15 ноя 2009, 13:29
Откуда: Курск

Re: Один скрипт AI на несколько обьектов.

Сообщение Kann 23 дек 2010, 15:50

пара примеров
ИИ на триггере, создаем пару триггеров, 1й отвечает за растояние видимости, 2й за растояние стрельбы, записываем всех попавших в 1й триггер врагов в массив, гоняемся за врагом пока не убьем, либо выполняем еще какие либо действия, убили врага, проверяем в массиве кто у нас тут есть еще, можно устроить проверку на ближайшего врага к нам
второй вариант, ИИ на тегах, ищем всех врагов по тегу, раз в секунду пока не найдем кого либо, нашли, занесли в массив, проверяем расстояние до ближайшего врага раз в 0.5 сек, если враг в радиусе, побежали убили, далее опять ищем врагов по тегу, ну и все по кругу...
обход препядствий реализуем через А* либо OpenSteer
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Один скрипт AI на несколько обьектов.

Сообщение Левш@ 23 дек 2010, 17:38

Kann писал(а):обход препядствий реализуем через А* либо OpenSteer

Вот это не понял.. если можно, подробнее пожалуйста.
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Один скрипт AI на несколько обьектов.

Сообщение Golandez 23 дек 2010, 19:02

Ты нужен только тогда,когда нужен.(С)
Сказать спасибо
Аватара пользователя
Golandez
Пилигрим
 
Сообщения: 1637
Зарегистрирован: 06 авг 2009, 13:55
Откуда: Харьков
Skype: lestardigital

Re: Один скрипт AI на несколько обьектов.

Сообщение Kann 23 дек 2010, 20:54

А* - алгоритм поиска кратчайшего пути между двумя точками,
OpenSteer - steering behaviors библиотека уклонения от столкновений
в играх часто используется совместно, так как хорошо дополняет недостатки друг друга.
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Один скрипт AI на несколько обьектов.

Сообщение Левш@ 24 дек 2010, 01:23

Kann, Golandez спасибо за информацию.
По моему вопросу кое что прояснил, осовная причина тормозов и глюков была такая штука:
Когда я опрашивал переменную
if (enemy0.GetComponent(SpiderAI).death == 2)
дочерних обьектов для их уничтожения, я не поставил условие - если обьект существует ( не уничтожен). И уничтожал обьект.
В результате после destroy, скрипт продолжал искать несуществующий обьект и его переменную death... О чем меня все время информировал редактор, но я не обращал внимания... [curved_hands] Когда наконец обратил, сразу понял в чем причина...
Теперь опрос выглядет так:

if (enemy0 != null)
if (enemy0.GetComponent(SpiderAI).death == 2)
Destroy (enemy0, destroyTime);


Думаю это и было основной причиной глюков.
И эта проблема снята, теперь занят оптимизацией Райкастов, позже отпишусь о результатах.
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Один скрипт AI на несколько обьектов.

Сообщение Belfegnar_ 24 дек 2010, 07:39

Левш@ писал(а):Да, это проба пера. Первый так сказать опыт.
Про другие методы типа вейпоинтов и т.д. осведомлен, но мне хочеться создать не псевдо AI, а именно свободное и непредсказуемое поведение врага по настоящему и при переигрывании оно не должно ни разу повторяться.
Поэтому и возникает такой вопрос а способно ли на это вообще унити?
Потому что Сталкеровский X_Ray свободно пережевывает как минимум по 50 - 70 ботов на локе. Причем частенько по 20 - 30 в кадре и все активны. И все таки не ожидал что даже с таким может неоптимальным кодом вшивые 8 ботов будут так тупить.

Ну а, к примеру, так, как это сделано в самом сталкере, вас интересует? Там между прочим fsm только у монстров/животных.

п.с. может стоит вместо
Синтаксис:
Используется javascript
var enemy0 : GameObject;
var enemy1 : GameObject;
var enemy2 : GameObject;
var enemy3 : GameObject;
var enemy4 : GameObject;
var enemy5 : GameObject;
var enemy6 : GameObject;
var enemy7 : GameObject;

использовать
Синтаксис:
Используется javascript
public var enemies : SpiderAI[];

чтоб в случае чего быстро менять кол-во ботов?
Belfegnar_
UNIт
 
Сообщения: 112
Зарегистрирован: 22 ноя 2010, 14:08

Re: Один скрипт AI на несколько обьектов.

Сообщение Левш@ 24 дек 2010, 16:30

public var enemies : SpiderAI[]; чтоб в случае чего быстро менять кол-во ботов?

Спасибо, в принципе так и собирался в конце сделать. Провозился с логикой...
Вобщем все чего добился это вместо 2-х теперь 4 бота работают, стоит добавить к ним 5-го и все равно тупит и глючит. :-? устал... :)
Наверное придеться все заново с нуля и искать другие логические решения.
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Один скрипт AI на несколько обьектов.

Сообщение depsemt 24 дек 2010, 17:47

"Что за фигня? это все на что способен Unity? полупустая лока и 8 ловполи ботов?"
посмотрите демо на оф сайте и в асет сторе ... там генерится большое число ботов и вроде без лагов...может что у них подсмотрите.
depsemt
UNIт
 
Сообщения: 73
Зарегистрирован: 26 июл 2010, 04:25

Re: Один скрипт AI на несколько обьектов.

Сообщение Левш@ 24 дек 2010, 19:58

на оф сайте и в асет сторе ... там генерится большое число ботов и вроде без лагов

В том то и дело, что то не видно демок с большим кол-вом ботов и хорошим AI...
Трабла не в количестве, fps держиться и с 20 ботами, трабла в том что AI тупит.
Если есть такие ссылки пните, а то везде натыкаюсь либо на тиры (образно - шутеры без AI), либо на плтформеры.
Игры типа Моего проекта не нахожу, потому и сомнения грызут...
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Один скрипт AI на несколько обьектов.

Сообщение Belfegnar_ 24 дек 2010, 21:13

Behave на оф. форуме смотрели? Там в демке можно довольно приличное количество котят сделать, пока не начнуться тормоза. Если абстрагироваться от кошек, то вполне жизнеспособный аи можно сварганить.
Сделать вызов Tick() пореже и в немного разное время у разных ботов, произвести кое-где оптимизацию кода, то вполне можно армию собрать, если это нужно конечно. Еще одна прелесть Tick() в том что можно без особых мозговывихов как бы симулировать "последовательные размышления" бота. То есть, например в первом тике проверяем нужно ли атаковать, в следующем тике (который может быть вызван уже в другом кадре) - выбираем, к примеру, из списка доступных врагов цель, в следующем - пускаем луч и т.д.
Belfegnar_
UNIт
 
Сообщения: 112
Зарегистрирован: 22 ноя 2010, 14:08

Re: Один скрипт AI на несколько обьектов.

Сообщение Левш@ 25 дек 2010, 03:45

Еще одна прелесть Tick() в том что можно без особых мозговывихов как бы симулировать "последовательные размышления" бота. То есть, например в первом тике проверяем

Не совсем понял... смотрел в справке не находит Tick().. :-?
А есть функции или условия которым можно в аргумент указать через сколько кадров запускаться?
Не нашел... поэтому спрашиваю.
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Один скрипт AI на несколько обьектов.

Сообщение Belfegnar_ 25 дек 2010, 09:37

Левш@ писал(а):Не совсем понял... смотрел в справке не находит Tick().. :-?

В справке чего смотрели?) Это функция в Behave http://forum.unity3d.com/threads/61849-AI-Behaviour-trees-in-Unity-Behave-1.1-released
А есть функции или условия которым можно в аргумент указать через сколько кадров запускаться?
Не нашел... поэтому спрашиваю.

А вот это уже я не совсем понял. Вы же вроде уже применяли yield(yield WaitForSeconds)? В вашем коде видел. Вполне подойдет для этих целей
Belfegnar_
UNIт
 
Сообщения: 112
Зарегистрирован: 22 ноя 2010, 14:08

Re: Один скрипт AI на несколько обьектов.

Сообщение Левш@ 25 дек 2010, 10:53

А вот это уже я не совсем понял. Вы же вроде уже применяли yield(yield WaitForSeconds)? В вашем коде видел. Вполне подойдет для этих целей

Да, yield Применимо, но зная унивесальность Унити, я предположил что есть некая функция которая может фиксировать кол-во кадров.
Правда в справке я ничего не нашел... А нельзя как то прописать кол-во кадров в WaitForSeconds вместо секунд?
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Один скрипт AI на несколько обьектов.

Сообщение Zaicheg 25 дек 2010, 11:36

Цикл с WaitForEndOfFrame и счётчик кадров.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Пред.След.

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7