![]() |
| ![]() |
Скрипты NPC: Искусственный Интеллект (ИИ) и ДвижениеКак заставить NPC пойти куда-либоAITravel, float_числ_x, float_числ_y, float_числ_z, [reset] Чтобы заставить NPC проследовать из одного место в другое, Вам следует использовать функцию AITravel. Аргументы x, y, z – это координаты на глобальной карте. Вы можете определить их в Конструкторе, подведя камеру к желаемой позиции и выделив объект рядом – координаты высветятся под окном объектов. Предназначение дополнительного флага неизвестно. При использовании этой функции необходимо проследить, чтобы она вызывалась только один раз. Взгляните на следующий скрипт: Begin Travel Он не будет работать, поскольку скрипт будет постоянно загружаться и загружаться, а NPC застынет на месте. Begin Travel Следующий пример будет работать – NPC отправится к желаемой позиции, как только его скрипт станет активным, то есть он будет находиться в одной локации с игроком. Проверка на совершение необходимого движенияGetAIPackageDone (возвращает Boolean/short) if ( GetAIPackageDone == 1 ) Функция GetAIPackageDone проверяет, появился ли NPC в необходимой локации. В тот самый единственный момент, когда движение заканчивается, функция возвращает 1. Следующий скрипт показывает, как использовать ряд функций AITravel и условных конструкций: Begin TravelLoop Хорошим примером использования AITravel является передвижение Фаргота к его тайнику и скрипт “CharGenWalkNPC”, управляющий тюремным стражем, проводящим Вас по кораблю в начале игру. Если Вы планируете часто использовать подобные функции, то Вам стоит запомнить следующий момент. Если движение началось, а игрок решает покинуть локацию или поспать, то, когда он вновь вернётся, NPC застынет в той позиции, в которой был покинут. Следующая часть кода предотвратит подобные неприятности (следует добавить в прошлый скрипт): ; *************** Спасение замороженного скрипта – восстанавливает скрипт после возвращения или Повернуть персонажаFace x_float, y_float Заставляет NPC повернуться лицом в заданном направлении. Вероятно, функция не прерывает выполнение активной анимации. То есть, если персонаж бродит, а на нём была использована эта функция, то он поворачивается в заданном направлении и продолжает своё движение, как ни в чём ни бывало. Пример: скрипт заставляет NPC постоянно наблюдать за игроком: … Случайное движениеAiWander, расстояние_числ, длительность_числ, время_числ, [idle2], [idle3], …[idle9], [reset] "ID" -> AIWander, 512, 5, 0, 0,20,0,0,10,30,0,0 Это алгоритм случайного движения, который используется почти всеми NPC в игре – они ходят туда обратно, меняют направление движения и останавливаются, чтобы почесать голову или оглядеться.
Для того, чтобы заставить NPC просто стоять на месте, можно использовать просто: AIWander, 0, 0, 0 Активация объектовAIActivate "Object ID" По словам Bethesda, «эта функция заставляет NPC активировать какой-либо объект. Мощный инструмент, возможности которого трудно переоценить». В стандартном Морровинде функция, похоже, не работает, единственная её возможность – заставить NPC что-либо выпить. В Трибунале, она, вроде бы, исправлена, по крайней мере, её возможности расширились. Я удачно использовал её, чтобы заставить NPC поднимать оружие, открывать обычные двери и проходить сквозь двери между локациями. Последний вариант работает только, если маркер двери находится в той же локации, что и NPC, или в активной локации, в которой находится герой. Иначе игра вылетает. Мне также удалось удачно использовать активатор – кнопку у Призрачных Ворот. Мне не удалось обнаружить сигнала AIPackageDone, но поменять направление движения можно и с помощью других методов (смотри ниже).
Примеры: вот некоторые из моих тестовых скриптов. Они показывают, как определить, закончилось ли движение: Begin TT_opendoor Begin TT_pickmace Begin TT_openloaddoor СледованиеAIFollow, "NPC ID", длительность_f_числ, x_f_числ, y_f_числ, z_f_числ, [reset] "MobID" -> AIFollow, "Mob2ID", 0,0,0,0 Функция заставляет одного персонажа следовать за другим. Можно использовать эту возможность, как для следования за игроком, так и для формирования каравана. Пример из моей практики, показывающий использование функции без всяких проверок: elseif ( state == 20 ) Поскольку здесь нет ни длительности движения, ни определённых координат, гуар будет следовать за NPC, пока не получит другой команды. Поэтому позаботьтесь о том, чтобы функции движения выполнялись только 1 раз, а не несколько десятков раз за секунду. Длительность, ID локации, координаты x, y, z – условия, по выполнению которых функция будет остановлена. Функция AIFollowCell позволяет пунктом назначение указать некий интерьер. Предназначение дополнительного флага “reset” в данный момент мне неизвестно. AIEscort, "NPC ID", длительность, x, y, z, [reset] Эти функции позволяют заставить NPC вести куда-либо игрока. Персонаж остановится и подождёт, если расстояние между ним и игроком увеличится слишком сильно. Пример использования этой функции можно увидеть в самом начале игры, когда стражник, проводящий Вас по кораблю останавливается, чтобы подождать, если Вы отстали от него. Проверка значения выполняемого движенияДля написания сложных скриптов полезно знать, какой режим движения совершается в данный момент, и в зависимости от этого выполнять определённые действия. GetCurrentAIPackage (возвращает short) If ( GetCurrentAIPackage == 2 ) Возвращаемые значения:
Как заставить NPC крастьсяForceSneak
Команда “ForceSneak” заставляет NPC перейти в крадущийся режим, “ClearForceSneak” выключает его. К сожалению, похоже, не существует функции, способной включить режим бега (она была добавлена лишь в Трибунале). “GetForceSneak” возвращает 1, если NPC крадётся. Хорошим примером тому является скрипт “LookoutScript”. Вот отрывок из него: elseif ( walkstate == 2 ) Заставить кого-либо упастьFall Заставляет NPC упасть. Может служить дополнительным толчком вниз, когда из под ног персонажа уходит почва. Также заставляет летающие существа свалиться с небес. Эта функция заставляет алхимика разбиться насмерть неподалёку от Сейда Нин. |
![]() |
| ![]() | ||
![]() |