Доступные спецификации метаданных

Ниже приведены теги, поддерживаемые в настоящее время, и их описание:

<ToolTip=TEXT_STRING>

Делает TEXT_STRING подсказкой, всплывающей при наведении мыши на соответствующее свойство в окне редактора свойств.

Обратите внимание: Недавно была добавлена поддержка комментариев вида /** VALUE */, которые автоматически переводятся компилятором сценариев в тег ToolTip метаданных.

<DisplayName=TEXT_STRING>

В окне редактора свойств имя свойства отображается как TEXT_STRING, а не настоящее имя свойства.

Пример:

Var() bool bEnableSpawning<DisplayName=Spawning Enabled>;

Внимание: Использование DisplayName для перечислений создаст проблемы, если вы измените параметр UPropertyInputCombo для сортировки перечислений в комбинированном списке редактора.


<EditCondition=ConditionalPropertyName>

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

Например, вы можете сделать следующие настройки в классе MyPackage.MyClass:

/** Enable or disable spawning */ Var() bool bEnableSpawning;   /** Set the rate at which AIs are spawned. Has no effect unless bEnableSpawning = TRUE */ Var() float RespawnsPerSecond<EditCondition=bEnableSpawning>;

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

Важно: Эти настройки метаданных требуют наличия контролируемой переменной (RespawnsPerSecond) и обязательное наличие настраиваемого элемента свойства (WxCustomPropertyItem_ConditionalItem).

Для их включения необходимо внести соответствующие изменения в файле Editor.ini:

[UnrealEd.CustomPropertyItemBindings]

CustomPropertyClasses=(PropertyPathName=" MyPackage.MyClass: RespawnsPerSecond ",PropertyItemClassName="WxCustomPropertyItem_ConditionalItem")

<FriendlyName=TEXT_STRING>

Используется Редактором UI Доступные спецификации метаданных - student2.ru .


<AllowAbstract>

При наличии в свойстве Class, выпадающие списки для редактирования свойств будут включать в себя и абстрактные классы. Если спецификация не указана, то списки содержат только конкретные (не абстрактные) классы. Для этой спецификации метаданных не нужно указывать такие значения, как True или False.


<AutoComment=BOOLEAN_VALUE>

При добавлении к свойству Kismet Sequence Action, свойство и его текущее значение будет автоматически появляться в сценарии в качестве комментария над действием. Чтобы увидеть это в действии поместите новую последовательность действий "Gate" в сценарий. В данном классе эта опция метаданных используется как bOpen и AutoCloseCount.

Расширенные технические вопросы

Реализация UnrealScript

Для получения более подробной информации о том, как UnrealScript работает, посетите страницы Compile Process Доступные спецификации метаданных - student2.ru , Execution Доступные спецификации метаданных - student2.ru , Byte Code Доступные спецификации метаданных - student2.ru и UnrealScript Implementation Доступные спецификации метаданных - student2.ru .

Вопросы двоичной совместимости UnrealScript

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

  • .uc файлы сценариев в пакете могут быть перекомпилированы без потери двоичной совместимости.
  • Добавление в пакет новых классов.
  • Добавление к классам новых функций.
  • Добавление к классам новых состояний.
  • Добавление к классам новых переменных.
  • Удаление из класса закрытых (private) переменных.

Другие преобразования, как правило, небезопасны, в том числе (но не ограничиваясь):

  • Добавление новых членов структур.
  • Удаление класса из пакета.
  • Изменение типа любой переменной, параметра или возвращаемого значения функции.
  • Изменение числа параметров функции.

Технические примечания

Сборка мусора. Все объекты и акторы в Unreal обрабатываются системой сборки мусора аналогично Java VM. Сборщик мусора Unreal использует функциональность сериализации класса UObject и рекурсивно определяет ссылки на другие объекты каждого активного объекта. В результате, объект не удаляется явно, сборщик мусора отслеживает их использование и удаляет объект только в случае его неиспользования. Этот подход имеет побочный эффект в виде скрытого удаления неиспользуемых объектов, однако это гораздо более эффективно, чем подсчет ссылок и удаление отдельных объектов. Подробнее читайте на странице Сборка мусора Доступные спецификации метаданных - student2.ru .

UnrealScript основан на байт-коде. Код языка UnrealScript компилируется в серии байт-кода, похожие на серии P-кода или байт-кода Java. Это делает UnrealScript независимым от платформы, позволяет осуществлять перенос компонентов клиента и сервера Unreal на другие платформы, то есть на Macintosh или на Unix.

Unreal, как виртуальная машина. Движок Unreal можно рассматривать как виртуальную машину для 3D-игр, как и язык и встроенные иерархии классов Java составляют виртуальную машину для сценариев веб-страниц. Виртуальная машина Unreal изначально портативна (благодаря разделению кода, зависимого от платформы, на отдельные модули) и расширяема (благодаря расширяемой иерархии классов). Однако, у нас нет никаких планов на документирование Unreal VM в объеме, необходимом для ее реализации других на платформах сторонними разработчиками.

Компилятор UnrealScript является трехпроходным. В отличие от C++, компиляция сценариев UnrealScript осуществляется в три разных прохода. В первый проход обрабатываются переменные, структуры, перечисления, константы, состояния, обявления функций и строится каркас каждого класса. На втором проходе код сценариев компилируется в байт-код. Два прохода позволяют собрать и связать сложные иерархии сценариев с круговыми зависимостями без отдельной фазы линковки. Третий проход анализирует и импортирует свойства по умолчанию для классов с использованием значений, указанных в блоке defaultproperties .uc файла.

Устойчивое состояние актора. Важно отметить, что в играх на двежке Unreal пользователь может сохранять игру в любое время, а состояния всех акторов, включая состояния выполнения их сценариев, могут быть сохранены только в то время, когда все акторы находятся на низком уровне стека UnrealScript. В целях устойчивости введено ограничение: латентные функции могут вызываться только из кода состояний. Код состояния выполняется на низком уровне стека, и, таким образом, состояние может быть легко сериализовано. Код функций, особенно, код встроенных функций на C++, может находиться на любом уровне стека, и их состояние не всегда возможно сохранить на диске, а затем восстановить.

Файлы Unreal имеют встроенный (native) двоичный формат. Файлы Unreal содержат индексы, сериализованные в дамп объектов, в частности, в пакеты Unreal. Файлы Unreal аналогичны DLL, они могут включать в себя ссылки на другие объекты, хранящиеся в других файлах Unreal. Такой подход сокращает времян загрузки (каждый пакет не загружается более одного раза), позволяет распространять контент Unreal в подготовленных "пакетах" через Интернет.

Почему UnrealScript не поддерживает статические переменные. C++ поддерживает статические переменные потому, что берет свои корни от низкоуровневого языка. Язык Java поддерживает статические переменные по причинам, которые кажутся не очень хорошо продумаными. Но таким переменным нет места в языке UnrealScript из-за неопределенностей, связанных с сериализацией, выводом и множеством уровней: статические переменные должны иметь "глобальные" семантики, а это означает, что все статические переменные во всех активных уровнях Unreal имеют одинаковое значение. Должны ли они быть в пакете? Должны ли они быть на уровне? Если да, то как они должны быть сериализованы: с классом в его .u файл, или с уровнем в .unr файл? Являются ли они уникальными для базового класса или модифицированные варианты классов имеют свои собственные значения статических переменных? В UnrealScript мы обошли эти проблемы, отказавшись от статических переменных, как от особенности языка, и позволили программистам управлять глобальными переменными путем создания классов. Если вам нужны переменные, которые доступны для всех объектов уровня, то вы можете создать новый класс для хранения этих переменных и, при этом, все переменные будут сериализованы вместе с уровнем. Таким образом исключается неопределенность. Примерами таких классов являются LevelInfo и GameInfo.

Наши рекомендации