Встроенные операторы и их приоритет

Язык UnrealScript предоставляет широкий спектр операторов в стиле C, C++ и Java для таких операций, как сложение чисел, сравнение значений, и инкремент переменных. Полный набор операторов определен в пакете Object.u. Ниже описаны стандартные операторы, в порядке убывания приоритета. Обратите внимание, что все операторы в стиле С имеют тот же приоритет, что и в языке C.

Оператор Типы, к которым применим оператор Назначение
@ string Объединение строк с дополнительным пробелом между двумя строками. "string1"@"string2" = "string1 string2"
@= string Объединение строк, с дополнительным пробелом между двумя строками, объединить и присвоить. "string1"@="string2", "string1" => "string1 string2" (версия 3323 и выше)
$ string Объединениестрок. "string1"$"string2" = "string1string2"
$= string Объединение строк, объединить и присвоить. "string1"$="string2", "string1" => "string1string2" (версия 3323 ивыше)
*= byte, int, float, vector, rotator Умножить и присвоить
/= byte, int, float, vector, rotator Разделить и присвоить
+= byte, int, float, vector Сложить и присвоить
-= byte, int, float, vector Вычесть и присвоить
|| bool Логическое ИЛИ
&& bool Логическое И
^^ bool Логическое исключающее ИЛИ
& int Побитовое И
| int Побитовое ИЛИ
^ int Побитовое исключающее ИЛИ (XOR)
!= Все Провенить на неравенство
== Все Проверить на равенство
< byte, int, float, string Меньше, чем
> byte, int, float, string Больше, чем
<= byte, int, float, string Меньше или равно
>= byte, int, float, string Больше или равно
~= float, string Проверить на приблизительное равенство (с точностью 0.0001), сравнить без учета регистра (для строк).
<< int, vector Левый двоичный сдвиг (int), прямое преобразование вектора (vector)
>> int, vector Правый двоичный сдвиг (int), обратное преобразование вектора (vector)
>>>   То же, что и >>
+ byte, int, float, vector Сложить
- byte, int, float, vector Вычесть
% float, int, byte По модулю (остаток от деления)
* byte, int, float, vector, rotator Умножить
/ byte, int, float, vector, rotator Разделить
Dot vector Скалярное произведение (dot product)
Cross vector Векторное произведение (cross product)
** float Возведение в степень
ClockwiseFrom int (элементы rotator) Возвращает истину, если первый аргумент расположен по часовой стрелке по отношению ко второму аргументу

В таблице, приведенной выше, перечислены операторы в порядке убывания их приоритета (для каждой группы операторов). При вводе сложного выражения, например: "1 * 2 + 3 * 4", UnrealScript автоматически группирует операторы по их приоритету. Так как умножение имеет более высокий приоритет, чем сложение, выражение рассматривается компилятором как "(1 * 2) + (3 * 4)".

Операторы "&&" (логическое И) и "||" (логическое ИЛИ) являются замкнутыми: если результат выражения может быть определен только из первого выражения (например, если первый аргумент операции && имеет значение false), то второе выражение не вычисляется.

Что касается операций прямого и обратного преобразования векторов, оператор >> переводит вектор из локального пространства в пространство мира, а оператор << производит обратное преобразование, то есть переводит вектор из пространства мира в локальное пространство.

Например, если у вас есть вектор перед, находящийся в 64 единицах перед игроком, vect(64,0,0) - это вектор локального пространства игрока. Если вы хотите перевести его в мировое пространство, то вы должны преобразовать его с использованием вектора ориентации игрока, вычислив вектор в пространстве мира следующим образом:

myWorldSpaceVect = my64Vect >> playerPawn.rotation;

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

В дополнение к стандартным операторам язык UnrealScript поддерживает следующие унарные операторы:

  • ! (bool) логическое отрицание.
  • - (int, float) математическое отрицание.
  • ~ (int) двоичное отрицание.
  • ++, -- префиксиые и постфиксные инкремент и декремент.

Время от времени в движок будут добавляться новые операторы. Полный список операторов вы найдете в исходном коде класса Object.

Функции общего назначения

Создание объектов

Для того чтобы создать новый экземпляр объекта в UnrealScript, вы будете использовать одну из двух функций в зависимости от того, наследует ли класс объекта класс Actor. Для акторов вы должны использовать функцию Spawn, которая объявлена в файле сценария Actor.uc. Для остальных классов вы должны использовать оператор new. Синтаксис оператора new в отличается от любой другой функции. В дополнение к необязательному списку параметров вы должны указать класс нового объекта и необязательный шаблон объекта. В сценариях UnrealScript нет объявления для оператора new, но если бы было, то выглядело примерно так new:

native final operator function coerce Object new

(

object InOuter,

name InName,

int InFlags,

class InClass,

object InTemplate

);

InOuter

(необязательный) Пакет, который необходимо назначить как "внешний" (Outer) для вновь созданного объекта. Если этот параметр не указан, "внешним" для объекта будет установлен специальный пакет, который существует только во время игры, называемый "переходным пакетом" (transient package).

InName

(необязательный) Имя для нового объекта. Если параметр на указан, объекту будет дано уникальное имя в формате ClassName_##, где ## - уникальный номер, увеличивающийся при создании каждого нового экземпляра этого класса.

InFlags

(необязательный, в настоящее время значение ограничивается 64 битными флагами) Флаги, уточняющие особенности применения объекта после его создания:

· 0x0000000100000000: Редактором поддерживается отмена/повтор операций с данным объектом. (RF_Transactional)

· 0x0000000400000000: Может ссылаться на внешние файлы. (RF_Public)

· 0x0000400000000000: Не может быть сохранен на диск. (RF_Transient)

· 0x0010000000000000: Не загружать объект на игровой клиент. (RF_NotForClient)

· 0x0020000000000000: Не загружать объект на игровой сервер. (RF_NotForServer)

· 0x0040000000000000: Не загружать объект в редактор. (RF_NotForEdit)

· 0x0008000000000000: Держать объект для редактирования, даже если он не на что не ссылается. (RF_Standalone)

InClass

класса, экземпляр которого создается

InTemplate

Объект, используемый для инициализации значений свойств нового объекта

Синтаксис применения оператора new выглядит следующим образом:

ObjectVar = new[(InOuter, InName, InFlags)] <class'InClass'>[(InTemplate)];

Создатьобъекткласса LightFunction:

function CreateALight()

{

local LightFunction NewObj;

NewObj = new class'Engine.LightFunction';

}

Создаем новый объект класса LightFunction с именем "NewLight", указываем этот объект как внешний пакет.

function CreateALight()

{

local LightFunction NewObj;

NewObj = new(Self,'NewLight') class'Engine.LightFunction';

}

Создаем новый объект класса LightFunction с именем "NewLight" в переходный пакет, инициализируем значения свойств нового объекта, используя переменную LightFunctionTemplate:

var LightFunction LightFunctionTemplate;   function CreateALight() { local LightFunction NewObj;   NewObj = new(None,'NewLight') class'Engine.LightFunction' (LightFunctionTemplate); }   defaultproperties { Begin Object Class=LightFunction Name=MyLightFunctionArchetype End Object LightFunctionTemplate=MyLightFunctionArchetype }

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