Перейти к содержанию

Как видит НеПиСь?


Рекомендуемые сообщения

Как НеПиСь или Кричер в TES III ориентируется в игровом пространстве?

Я имею ввиду не координаты объекта или игрока и не GetDistance, которые используются в скриптах, а то, что «зашито в движок»???

Ссылка на комментарий
Поделиться на другие сайты

В смысле тебя интересует система АИ?

 

http://tes.ag.ru/cs/articles/npc_guide.shtml

 

- Ну, вначале в зависимости от того, в каком месте он стоит, такие у него будут темы диалогов (если на не не висит скрипт nolore)

- выбор расы и класса обеспечит его рядом характеристик (способности, заклинания) и тоже отразится на темах. Обычно о своей расе он говорит одно, а о других - другое.

- выбор фракции и ранга скажется на его отношении к игроку.

 

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

Ссылка на комментарий
Поделиться на другие сайты

2LofZ, и все

Я имею ввиду «ориентируется» в узком, физическом смысле.

Используемые в скриптах ориентиры мне известны (координаты, ID объекта, GetDistance, CellName и др.) в бою тоже понятно, что НеПиСь привязывается к ПиСю (э-э… Игроку). Все это относиться, как ты верно заметила, к к о н т р о л ю.

Но вот если неконтролируемый непись идет прямо, а потом в узком переулке поворачивает направо – то это чё: случайные перемещения в заданном радиусе, иль он может как-то сориентироваться, в каком месте повернуть направо?

 

Таким образом, суть вопроса состоит в следующем:

Существует ли «по умолчанию» какая-нить, пусть даже простейшая, элементарная, система ориентирования в игровом пространстве для НеПиСей и кричеров?

Ссылка на комментарий
Поделиться на другие сайты

ничего непись не "видит". Суть в том что на пространстве для каждого НПС проложен маршрут в обход возможных препятствий. Вот почем в плагах, где об этом забывают, НПС вдруг зависает у какой нибудь стены. Точно такая же реакция будет у игровых НПС, если ты в плаге поставишь статик поперек проложенной для них дорожки. То есть что то вроде невидимых рельсов. Положи что то поперек - и они перестанут "видеть". Свободное движение для НПС - только видимость.
Ссылка на комментарий
Поделиться на другие сайты

2Майк,

Мы об этом еще поговорим, в свое время, а сейчас ответь просто: ДА/НЕТ

 

Я видел, как пол Балморы забирается в реку, наверное, с целью принять крещение; видел как непись, упершись в стену, упрямо продолжает идти и идти вперед.

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

 

Альтернативные точки зрения есть?

Ссылка на комментарий
Поделиться на другие сайты

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

Правильно, тебе ж только что ответили:

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

Это пасьгридами назывеецца, PathGrids

Аналогично и в обливе - там создал територию и нажимаеш генеить пасьгриды, очень долгиий процесс..

Ссылка на комментарий
Поделиться на другие сайты

Интересно.

Как реализован АИ спецназовцев из первой халвы? Они там прятались за какими угодно укрытиями, которые существовали между позицией (взглядом) игрока и самим неписем. Могли спрятаться за арматурину, если она закрывала полтела. Вот они "видели" мир.

Ссылка на комментарий
Поделиться на другие сайты

Но вот если неконтролируемый непись идет прямо, а потом в узком переулке поворачивает направо – то это чё: случайные перемещения в заданном радиусе, иль он может как-то сориентироваться, в каком месте повернуть направо?

 

В данном случае скорее всего - случайное перемещение.

 

Если непись идет целенаправлено, то это называется пакет анимации AiTravel. Так идет стражник на корабле в начале игры. Тут уж создатель сам вписывает нужные координаты, чтобы NPC не стукнулся обо что-нибудь. Должно быть это имел в виду Siegrun, когда сказал, что

на пространстве для каждого НПС проложен маршрут в обход возможных препятствий
, потому что никакого такого маршрута для любого непися - нет. Столкновения - головная боль разработчиков.

 

Если непись идет за игроком или другим неписем, это AiFollow, Player (ID NPC). Тогда Аи просто повторяет путь ведущего, но в меру своих характеристик и способностей, поэтому не может иногда вскарабкаться в гору или может застрять.

 

Если непись просто гуляет, это пакет AI Wander, он настраивается через АI -> AI Wander, но там просто небольшой анимационный набор вроде "почесать голову", "потянуться". Создатель может только настроить частоту этих движений, время полного цикла этой анимации и расстояние, на которое непись способен отойти от исходной точки. Столкновения совершенно не учитываются.

 

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

Ссылка на комментарий
Поделиться на другие сайты

Теперь переходим к самому интересному:

 

Есть какие-нить теории по исправлению этой несправедливости?

Может ссылочки на формумы какие, мот русские, мот буржуйские?

Ссылка на комментарий
Поделиться на другие сайты

Да ничего сложного: просто вычисли все возможные объекты, с которым непись может столкнуться или координаты края берега, за которым он может свалиться реку, и напиши для каждого в скрипте, что когда он оказывается слишком близко (GetDistance), чтобы он повернулся или изменил положение (setPos, например). А можно еще для каждого непися нарисовать особенный маршрут через AITravel. Учти, что некоторые неписи по квестам ходят за игроком и у многих свои скрипты.

 

Но проще всего, конечно, чтобы они не сталкивались, запретить им перемещения.

 

Ты про кризис миметического искусства ничего не слышал?

Ссылка на комментарий
Поделиться на другие сайты

Ну ладно, наиболее подъемный вариант - это создать объект типа активатор, разместить его копии возле стен и, зная ID всех проходящих неписей, повесить скрипт со строкой

if ( GetDistance, aryon (например) > 10 )

return

endif

 

if ( GetDistance, aryon <= 10 )

aryon -> Face x_float, y_float или setpose (или move x/rotare чего-то там, координаты)

endif

так надо будет продублировать для всех ближайших неписей. Для всего Морровинда слишком жирно, и так тормозить должен неслабо, зато все просто. Для какой-нибудь избранной локации можно.

 

Но другой вопрос - а надо ли? Виртуальный мир все-таки.

Есть такая грань, когда реалистичность только во вред. Не лучше ли сэкономить на случайных столкновениях, которые не все оценивают так негативно, и отсутсвие которых может никто не заметит в пользу создания сложных скриптов для отдельных неписей?

Ссылка на комментарий
Поделиться на другие сайты

Ох ты, господи, сколько наотвечали!

Непись ходит так: Ничего он не видит, а при событии задается ему цель(например фоллоуплейер или травел тот же) с определенными координатами. Строится маршрут(поиск пути в лабиринте). Это самая сложная часть любой игры, если делать реалистично. Поэтому в 3Д-шутерах и прочих /от первого лица/ играх применяют как раз таки гриды, или контрольные точки. И путь юнита проходит между этими точками. Если на пути между точками встречается препятствие - юнит в морре и обливе продожает бежать в него. Иногда его направление движения позволяет проскользнуть, обогнуть препятствие. В других игрушках это может быть сделано иначе. Например в стратегии Земля 2150 юнит просил препятствие подвинуться и ОДНОВРЕМЕННО с этим строил новый путь - в обход. А иногда юнит свободно проходит сквозь другого юнита.

 

ЗЫ: если вы придумаете принципиально новый алгоритм движения - вам дадут нобелевскую премию по математике Э:)

Ссылка на комментарий
Поделиться на другие сайты

Теперь перейдем к техническим вопросам.

 

Само по себе «зрение» НеПиСей нужно лишь для того, чтоб они могли преодолевать препятствия.

Мне кажется, что в основу системы «видения» НеПиСями окружающего мира нада положить столкновение (коллизию, collision).

Я решил начать с самого примитивного. Создать систему наткнулся на препятствие -> перепрыгнул. В итоге получился незатейливый скрипт типа:

 

Begin Hulgarth_the_dummy

 

Short DoOnce

Short isjumping

 

if ( GetCollidingActor = = 1 )

if ( Do Once = = 0 )

set isjumping to ( hulgarth -> ForceMoveJump )

set DoOnce to 1

endif

endif

 

elseif ( DoOnce = = 1 )

set isjumping to ( hulgarth -> ClearForceMoveJump )

endif

 

end

 

Чё-то не работает. Нет ошыыбок, но и эффекта тоже нет. В чем проблема, по-вашему?

 

Одно я знаю точно, что кажысь функция GetColliding отслеживает столкновения по осям X, Y и Z. То есть, когда НеПиСь стоит на земле или объекте, или приземляется или бежит – то все это одна большая КОЛЛИЗИЯ.

Нада сделать так, чтоб столкновения отслеживались только по оси X и Y, то есть только горизонтальные столкновения, вертикальные нах не нужны.

 

Речь не идет о том, чтобы перепрыгивать стены и горы – это просто первый шаг.

Ссылка на комментарий
Поделиться на другие сайты

Ну, во-первых, ForceMoveJump - работает только с Трибуналом.

И ты, прав, - сложно определить, что считать коллизией.

set isjumping to ( hulgarth -> ForceMoveJump )

ИМХО, тут проблема.

надо бы

set isjumping to 1

endif

if ( isjumping == 1 )

hulgarth -> ForceMoveJump

set Do once to 2

endif

Правда вероятно, что это будет работать всего 1 раз. Потому что do once

Либо наоборот - после столкновения он постоянно начнет прыгать :)

 

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

 

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

if ( GetDistance, aryon > 10 )

return

endif

 

if ( GetDistance, aryon <= 10 )

aryon -> Face x_float, y_float или setpose (или move x/rotare чего-то там, координаты)

endif

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

Просто и выполнимо. А то... прыгать через горы :1anim_as:

Ссылка на комментарий
Поделиться на другие сайты

Попробовал вот ето:

 

Begin Hulgarth_the_dummy

 

Short DoOnce

Short isjumping

 

if ( MenuMode == 1 )

return

end

 

if ( GetCollidingActor, "hulgarth" == 0 )

return

endif

 

if ( GetCollidingActor, "hulgarth" == 1 )

if ( isjumping == 0 )

set isjumping to 1

endif

endif

 

elseif ( isjumping == 1 )

if ( DoOnce == 0 )

hulgarth->ForceMoveJump

set DoOnce to 1

return

endif

endif

 

end

 

 

Не хочет.

:1anim_ak: :1anim_ak: :1anim_ak:

Ссылка на комментарий
Поделиться на другие сайты

Эммм, "колинг актор" на чем висит? на НПС? или активаторе?

if ( GetCollidingActor == 1 ) это команда для активатора, а не для НПСа.

Поидее скрипт должен быть таким, только вместо

if ( GetCollidingActor == 1 )

должно стоять что-то другое, наподобии ИФ АКТОР ДЕТЕКТ КОЛИЖЕН, или ИФ АКТОР ГЕТ СТАНДИНГ ТО КОЛИЖЕН... но таких команд вроде нет:(( а если бы и были, то с опросом на условие по какоим осям..

Иначе понятно Што будет.

 

Рабочий скрипт. вешается на активатор. назначение заставить Эргнира из гильдии бойцов альдруна прыгать, когда кто-то (или он сам) встает на активатор.

Begin ergnir_the_dumm2

 

if ( GetStandingActor >= 1 )

ergnir ->ForceMoveJump

else

ergnir ->ClearForceMoveJump

return

endif

 

end

 

Только он должне быть на активаторе... а не на НПСе. Вместо стандинг - можно и колинг, тогда просчитыватся будет первое соприкосновение с активатором.

Дотронулся - подпрыгнул. Работает как для "лежащих" объектов, так и "стоящих" по оси Z.

Вот теперь и спрашивается, сколько потребуется активаторов, для решения этой задачи.... Да, условия должны включать ИДЕ ВСЕХ нпс в игре... и плагинов тоже:)

Ссылка на комментарий
Поделиться на другие сайты

кстати, скрипт будет работать только 1 раз.

elseif ( isjumping == 1 )

if ( DoOnce == 0 )

hulgarth->ForceMoveJump

set DoOnce to 1

Потому что в условие обозначено, что для прыжка требуется DoOnce == 0, а оно после первого раза имеет значение 1

Ссылка на комментарий
Поделиться на другие сайты

2 EJ-12,

Я тоже об этом думал. И, видимо, самое печальное в том, что ты прав. Столкновения отслеживаются с объекта, а не с актера. И самая большая несправедливость, состоит в том, что скрипт можно положить только на активатор (максимум еще на некоторые объекты) – все это делает бессмысленной мою затею. А жаль. Впрочем нада еще попробовать с активаторами.

 

Но вот объясните мне, ламеру неразумному, почему, например, в Готике каждая задрипанная Орочья собачка может запрыгнуть на любой камень? Неписи и кричеры могут не только запрыгивать на мелкие, но и вскарабкиваться на высокие препятствия. Чтобы преодолеть препятствие, нужно его, как минимум обнаружить. Чем же эти движки принципиально отличаются друг от друга??? Ведь Готика – это не шутер, какой-нить.

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...