Скриптинг И.И.: Цели

Материал из CryWiki Russia

Перейти к: навигация, поиск
О статье
АвторAndreyFilantrop (перевод статьи с Crydev.net).
СложностьСредняя
ТребованияCrysis 2 Mod SDK.
Дата добавления01/02/11


Цели (Goals)

Примечание:


СТАТЬЯ НАХОДИТСЯ В РАЗРАБОТКЕ. ПРОСЬБА НЕ ВНОСИТЬ КОРРЕКТИРОВКИ ДО ОКОНЧАНИЯ РАБОТЫ. СПАСИБО ЗА ОЖИДАНИЕ.

Краткий обзор

ИИ Объекты в CryAISystem способны выполнять конкретные действия для достижения целей. Цели могут быть очень простыми - например, приблизиться на 2 метра к определенному объекту, или довольно сложным - например, спрятаться в крайнем левом препятствии на путик вашей текущей цели. Низкоуровневая ИИ система отвечает за выполнение и управление этими целями, и она также контролирует что случается если цели удачно выполнены или не выполнены. Другие функции включают определение того, какие функции выполняются параллельно, а какие – последовательно. Цели могут быть atomic (монолитные или «атомарные») и derived (производные). Атомарная цель - простая цель, которая не может быть далее разделена на под-цели, и является одной логической единицей. Производная цель, это цель, которая представляет собой сочетание нескольких атомных или производные цели, которые могут выполняться параллельно или последовательно. В то время, как атомарная цели определяется системой и внедрение новых атомарных целей потребует работы на низком уровне ИИ, пользователь может определять производные цели сам. Определение новых производных целей - отныне я буду называть производные цели просто цели - может быть сделано в C + + или в LUA (обе системы содержат набор функций, которые работают с целями). Обычно цели определяются исключительно в LUA скрипте. Так как производные цели создаются путем объединения атомарных и других производных целей, должен быть способ организации нескольких целей в логическое объединение - это программа, - что имеет начальную точку, тело для выполнения и условия для окончания. Это логическое объединение существует в CryAISystem и называется GOAL PIPE.

Голпайпы (Goal Pipes)

Логическое объединение атомарных и производных целей для того, чтобы создать еще одну производную цель называется целевая труба (goal pipe или голпайпа). Она называется так, потому что концептуально это напоминает трубу, в которой цели толкаются из одного конца, и когда они выполняются они выходят на другом конце, и снова толкаются от дна - как на картинке. Это означает, что цели выполняются в определенной последовательности, - что обычно правда - но есть также путь заставить цели выполняться параллельно. Даже голпайпа может быть запихана как цель в другую трубу. Это порождает такие экзотические концепты как вложенные (nesting) голпайпы, и самоповторяющиеся (рекурсивные - recursing) голпайпы. Нет ограничения количества вложений с голпайпами, так что это остаётся на усмотрение пользователя. Лично я бы не рекомендовал использование самоповторения (recursion) в пайпах, но система в общем поддерживает это. Объединив атомарные цели в более крупные цели, вы можете развить любой уровень абстракции для персонажей в игре. Например, выход из комнаты может включать в себя нахождение двери и использование её. Таким образом, вы разбили более высокоуровневую цель на две меньших целей. Поиск дверь распадается на нахождение объекта - двери и приближение к нему - оба этих действия являются довольно атомарными. Использование двери включает приближение на расстояние 1 метра и нажатие «Использовать» (USE). Так что хотя вы можете создать одну большую голпайпу, которая находит объект-дверь, приближается к ней, становится на 1 метр, нажимает «использовать», вы также можете разбить действие на 2 более высокоуровневые подцели и при необходимости повторно использовать их когда-нибудь позже. По тому же принципу возможно вы захотите использовать exit_room голпайпу находящуюся внутри большей exit_building голпайпы и так далее. Именно для этой цели предусмотрены вложенные голпайпы. Все голпайпы создаются при загрузке игры. Голпайпы не являются собственностью ИИ объекта, они являются собственностью самой ИИ системы, так что вам не нужно беспокоиться о том, чтобы каким-то образом реализовывать их или каким-то образом поддерживать их. Каждый ИИ объект которому необходима голпайпа, получает клон оригинала – это означает, что у него имеется своя собственная копия голпайпы и не может повлиять на операции других ИИ объектов, которые могут использовать ту же голпайпу. ИИ объекты являются владельцами этих клонированных голпайпов и они автоматически представляют их поддержку, так что это уже другая вещь и она не должна беспокоить пользователя. Для создания голпайпы вы должны вызвать следующую функцию (в LUA – есть также эквивалентная функция в C++, но мы сфокусируемся на LUA функциях: