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

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

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

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

Вобщем такие дела, написал скрипт AI для ботов врагов.
Пока бот с этим скриптом на локации один, все четко работает.
Как только ботов с этим скриптом несколько все начинает жестоко глючить, причем дело не в тормозах, fps на высоте.
Глюки проявляються следующие:
1. Глотаеться проигрывание анимации и иногда звуков. Убитый бот вместо того чтоб упасть, стоит как вкопанный и дальше через время ничего не меняеться... (анима смерти не проигрываеться) и это не у всех то проигрываеться, то нет.
2.После смерти по истечению времени задержки обьект должен исчезнуть, так как ему назначен Destroy, тут аналогично обьекты исчезают через раз...
3.Самое интересное, что вызванная функция стартует и отрабатывает, потому что в конце фуекции прописан счетчик убитых врагов и он считает правильно, но та же анимация и дестрой в той же функции почемуто игнорируеться.
Стреляешь в убитого врага который не исчез (хотя должен был), и тут лог тебе нагло заявляет что ты обратился к дестроенному обьекту... Изображение а этот обьект нагло валяеться у твоих ног и совсем не желает дестроиться...

Что за фигня? это все на что способен Unity? полупустая лока и 8 ловполи ботов?
Или я чтото не догоняю? :-?
Возникли вопросы:
1. Можно ли один и тот же скрипт вешать на разных ботов, или для каждого должен быть свой? Может они типа мешают др. дружке?
2. И если можно, то почему так тупит AI когда в сцене около 100fps ?
При том что когда только один бот с тем же скриптом все работает на ура. :-?
Комп у меня конечно не ракета, но и не настолько слаб - ПЕНЬ 3.0Ггц / 2Гиг оперы / Nvidia GT9400
Я понимаю еслиб только графа тормозила...
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

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

Сообщение Golandez 23 дек 2010, 01:24

1.Можно
2.Листинг в студию.

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

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

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

Golandez писал(а):нужно у себя ошибки искать.

Были б ошибки так и 1 - 2 бота тоже б не работали? А они четко работают.
Вот когда их 8, все начинает тупить.

Golandez писал(а):1.Можно
2.Листинг в студию.

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

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

Сообщение Zaicheg 23 дек 2010, 08:22

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

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

Сообщение Guyver 23 дек 2010, 08:50

очень хочется верить, что у вас есть некий Контейнер, который хранит в себе ссылки на все обьекты - АИ (и убивает обьекты пробегаясь по списку и проверяя сколько у кого ХП ... кст апдейт тоже можно былобы там вызывать ... чтобы как минимум иметь контроль вызовов этих самых апдейтов)

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

ну и какбы ... я читал что ява медленнее шарпа ... и даже натыкался в инете гдето, что идентичный скрипт переписанный на шарпе дал буст примерно 150%
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск

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

Сообщение Zaicheg 23 дек 2010, 10:59

Guyver писал(а):ну и какбы ... я читал что ява медленнее шарпа ... и даже натыкался в инете гдето, что идентичный скрипт переписанный на шарпе дал буст примерно 150%

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

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

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

очень хочется верить, что у вас есть некий Контейнер, который хранит в себе ссылки на все обьекты - АИ (и убивает обьекты пробегаясь по списку и проверяя сколько у кого ХП ... кст апдейт тоже можно былобы там вызывать ... чтобы как минимум иметь контроль вызовов этих самых апдейтов)

Много упоминался дестрой бота, но в листинге дестроя нет.

Все боты дочерние к ГО на котором висит этот скрипт:

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

function FixedUpdate () {
        if (enemy0.GetComponent(SpiderAI).death == 2)
            Destroy (enemy0, destroyTime);
        if (enemy1.GetComponent(SpiderAI).death == 2)
            Destroy (enemy1, destroyTime);
        if (enemy2.GetComponent(SpiderAI).death == 2)
            Destroy (enemy2, destroyTime);     
        if (enemy3.GetComponent(SpiderAI).death == 2)
            Destroy (enemy3, destroyTime);     
    if (enemy4.GetComponent(SpiderAI).death == 2)
            Destroy (enemy4, destroyTime);
        if (enemy5.GetComponent(SpiderAI).death == 2)
            Destroy (enemy5, destroyTime);
        if (enemy6.GetComponent(SpiderAI).death == 2)
            Destroy (enemy6, destroyTime);
        if (enemy7.GetComponent(SpiderAI).death == 2)
            Destroy (enemy7, destroyTime);
}


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

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

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

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

Сообщение strelok 23 дек 2010, 14:12

Гы-ы-ы! Разрешите позлорадствовать :D
Помнится, автор метал в меня грозные молнии по поводу ужасных тормозов, производимых моей "демкой" и "настоятельно рекомендовал" заняться оптимизацией....
Причём, проблему с ИИ, при большом количестве персонажей, Вы, уважаемый Левша, отвергли навсегда, приводя в пример "Сталкер", с его физикой, анимацией, количеством персонажей, ИИ и т.д.
Земля-то круглая [-(
Если интересно моё мнение, то...(шёпотом, тих-тихо, оглядываясь на наших больших специалистов)..., что если заменить все "макароны" if-else-if-if-else и т.д. на один оператор switch, в котором каждый case отвечает за одно состояние персонажа.
(кстати, я - то победил тормоза ;) )
P.S. Все боты дочерние к ГО на котором висит этот скрипт: - не это ли причина? И зачем так мудрить???
strelok
UNIверсал
 
Сообщения: 356
Зарегистрирован: 15 ноя 2009, 13:29
Откуда: Курск

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

Сообщение Zaicheg 23 дек 2010, 14:36

1. Проверка "death == 2" в FixedUpdate. Уже одно это должно вызывать у вас глюки с дестроями. Проверяйте в Update.
2. Явно укажите типы для всех переменных. Это однозначно поднимет вам производительность, ну и вообще полезная привычка будет.
3. Может быть, обращения GetComponent каждый кадр/фикседапдейт -- ресурсоёмко. Сохраните компонент в переменную и обращайтесь. Но тут может гоню, не уверен.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

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

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

Гы-ы-ы! Разрешите позлорадствовать
Помнится, автор метал в меня грозные молнии по поводу ужасных тормозов

:) А вы мокрое с мягким не путайте... я вообщето имел ввиду оптимизацию графики а не кода, насколько я помню. ;) По коду не мне вам советовать... И насколько я помню, я совсем не злорадствовал и не насмехался, просто выложил ИМХО... :-\
Злорадствуйте, пришло ваше время. :))

Все боты дочерние к ГО на котором висит этот скрипт: - не это ли причина?

Нет, не в этом, проверял.

что если заменить все "макароны" if-else-if-if-else и т.д. на один оператор switch, в котором каждый case отвечает за одно состояние персонажа.

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

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

Сообщение Kann 23 дек 2010, 14:46

помоему в приведенном листинге ИИ, проблемы с логикой и кодом, не мудренно что все тормозит и глючит, вообще написание ИИ в Update по моему некий извращенный мазахизм. :D
зы:кстати юнити тут вообще непричем, вот хотите примерчик с 20 ботами, это моя старая демка, там тоже все на JS, но работает терпимо, учитывая что небыло рефакторинга кода и оптимизации....
65 метров
http://commates-games.ru/Mars/bilds/ProjectMarsWeb.html
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

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

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

1. Проверка "death == 2" в FixedUpdate. Уже одно это должно вызывать у вас глюки с дестроями. Проверяйте в Update.
2. Явно укажите типы для всех переменных. Это однозначно поднимет вам производительность, ну и вообще полезная привычка будет.
3. Может быть, обращения GetComponent каждый кадр/фикседапдейт -- ресурсоёмко. Сохраните компонент в переменную и обращайтесь. Но тут может гоню, не уверен.

Cпасибо за дельные предложения, сегодня же все проверю и отпишусь.

помоему в приведенном листинге ИИ, проблемы с логикой и кодом, не мудренно что все тормозит и глючит, вообще написание ИИ в Update по моему некий извращенный мазахизм.

Скорее всего. :) кодил на базе скриптов из уроков и мануала.
Конечно надо еще много учиться, но все таки слишком быстро словил глюки и тормоза. Что дальше то будет?
С логикой все в порядке, малое кол-во ботов работает четко.
Последний раз редактировалось Левш@ 23 дек 2010, 14:52, всего редактировалось 1 раз.
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

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

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

:) А вы мокрое с мягким не путайте... я вообщето имел ввиду оптимизацию графики а не кода, насколько я помню. ;) По коду не мне вам советовать... И насколько я помню, я совсем не злорадствовал и не насмехался, просто выложил ИМХО... :-\


Блин, я за правду!
Ниже мой ответ на все Ваши упрёки по поводу графики. На Вас это не произвело никакого впечатления....как выяснилось - к сожалению. (без обид).
"Я не спорю, что моя "оптимизация" - ГОВНО. В нашем споре, делаю акцент на том, что дело не в графике, не в "страшной" картинке(которая тормозит), а совершенно в других деталях. Ради интереса, убрал из сцены все персонажи, т.е. : никакой анимации, никаких скелетов, никакой физики, никакого ИИ - результат, почти 1000 fps."

Есть такая книжка "Программирование игр для Windows. Советы профессионала." Андре Ламот.
Так вот там разъясняются основные проблемы программирования игр (странно было бы, если чего-то другого ;) ), в том числе и ИИ. Для начала - самое оно. У меня где-то валяется в .PDF, если интересно, поищу.
strelok
UNIверсал
 
Сообщения: 356
Зарегистрирован: 15 ноя 2009, 13:29
Откуда: Курск

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

Сообщение Guyver 23 дек 2010, 15:10

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

есть некй трек по которому бот идёт (он его сам построил до ближайшей последней цели)
каждый кадр (поверьте ... лучше ваапще раз в 10-50 кадров принимать решения) бот "осматривается"
если при осмотре найдено что то интересное (например враг попал в радиус видимости ... проверяем видим ли он физически (рейкаст очевидно .. если ничего лучше не придумать !!) ... если видим и принято решение переагриться на него (приоритет этой задачи выше чем была до этого) .. строим новый трек вейпоинтов (возможно рейкасты .. возможно выбор сплайна из существующих для перемещения наиболее оптимального возможно типа А* на графах) .. и делаем достижение и убивание этого врага первостепенной задачей (она потом может измениться ... всё зависит от приоритетов задачи бота) )

вся логика опрашивается каким то менеджером АИ который имеет референсы на все АИ боты на сцене + где то лист возможных противников (чтобы каждый раз их не искать)
опрашивается очень редко .. в основном движется по принятому заранее маршруту


какбы в моих словах тут небыло ниодного термина Юнити ... значит и юнити тут вовсе не причём даже ?
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск

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

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

Guyver писал(а):есть некй трек по которому бот идёт (он его сам построил до ближайшей последней цели)
каждый кадр (поверьте ... лучше ваапще раз в 10-50 кадров принимать решения) бот "осматривается"
если при осмотре найдено что то интересное (например враг попал в радиус видимости ... проверяем видим ли он физически (рейкаст очевидно .. если ничего лучше не придумать !!) ... если видим и принято решение переагриться на него (приоритет этой задачи выше чем была до этого) .. строим новый трек вейпоинтов (возможно рейкасты .. возможно выбор сплайна из существующих для перемещения наиболее оптимального возможно типа А* на графах) .. и делаем достижение и убивание этого врага первостепенной задачей (она потом может измениться ... всё зависит от приоритетов задачи бота) )

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

След.

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

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

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


cron