Operator, PreOperator, PostOperator
Эти ключевые слова предназначены для объявления особого вида функций, называемых операторами (эквивалентных операторам C++). Компилятор UnrealScript знает обо всех встроенных операторах, таких как "+", "-", "==", "||" и т.д. Если не вдаваяться в подробности, то операторы UnrealScript похожи на операторы C++ и вы можете объявить новые операторы, как функции UnrealScript или встроенные функции, применяя ключевые слова operator, preoperator и postoperator.
Event
Ключевое слово event в UnrealScript имеет то же значение, что и как функция function. Однако, при экспорте заголовочного файла C++ с использованием =unreal -make -h, UnrealEd автоматически генерирует для "события" заглушку вызова из C++ в UnrealScript, что автоматически синхронизирует код на C++ с функциями UnrealScript и исключает возможность передачи ошибочных параметров в функции UnrealScript. Рассмотрим следующий участок кода UnrealScript.:
event Touch( Actor Other )
{ ... }
Создает код на C++ в EngineClasses.h, подобный следующему:
void eventTouch(class AActor* Other)
{
FName N("Touch",FNAME_Intrinsic);
struct {class AActor* Other; } Parms;
Parms.Other=Other;
ProcessEvent(N, &Parms);
}
Это позволяет вам вызвать функцию UnrealScript из C++ следующим образом:
AActor *SomeActor, *OtherActor;
SomeActor->eventTouch(OtherActor);
Const
Это спецификатор добавляется после объявления функции и может быть использован только в объявлении встроенной функции. Указывает, что функция должна быть экспортирована в заголовочный файл как 'const'. Пример использования: |
native function int doSomething(string myData) const;
Управляющие структуры
Язык UnrealScript поддерживает все стандартные операторы управления выполнением языков C, C++ и Java:
Структуры повторения
Циклы for
Циклы "For" позволяют выполнять цикл до тех пор, пока не будет выполнено определенное условие. Например:
// Example of "for" loop.
function ForExample()
{
local int i;
log( "Demonstrating the for loop" );
for( i=0; i<4; i++ )
{
log( "The value of i is " $ i );
}
log( "Completed with i=" $ i);
}
В результате работы этого цикла мы получим вывод:
Demonstrating the for loop
The value of i is 0
The value of i is 1
The value of i is 2
The value of i is 3
Completed with i=4
В цикле for вы должны указать три выражения, разделенные точкой с запятой. Первое выражение для инициализации переменной в исходное значение. Второе выражение содержит условие, проверяемое перед выполнением каждой итерации цикла, если это выражение истинно, цикл выполняется, а если оно ложно, цикл завершается. Третье условие содержит выражение, увеличивающее счетчик цикла.
Хотя большинство выражений цикла "for" просто обновляют счетчик, вы также можете использовать циклы "for" для более расширенных операций, например, для обхода связанных списков, с помощью соответствующей инициализации исходного значения, условия прекращения и величины прироста.
Во всех управляющих структурах вы можете выполнять одну операцию без расстановки фигурных скобок, например:
for( i=0; i<4; i++ )
log( "The value of i is " $ i );
Или же вы можете выполнить несколько операций, заключив их в фигурные скобки, например:
for( i=0; i<4; i++ )
{
log( "The value of i is" );
log( i );
}
Циклы do
Циклы "do" позволяют вам выполнять цикл пока указанное вами окончательное выражение истинно. Обратите внимание, что Unreal использует синтаксис do-until, который отличается от синтаксиса языков C и Java (использующих do-while).
// Example of "do" loop.
function DoExample()
{
local int i;
log( "Demonstrating the do loop" );
do
{
log( "The value of i is " $ i );
i = i + 1;
} until( i == 4 );
log( "Completed with i=" $ i);
}
В результате работы этого цикла мы получим вывод:
Demonstrating the do loop
The value of i is 0
The value of i is 1
The value of i is 2
The value of i is 3
Completed with i=4
Циклы while
Циклы "while" позволяют вам выполнять цикл пока указанное вами начальное выражение истинно.
// Example of "while" loop.
function WhileExample()
{
local int i;
log( "Demonstrating the while loop" );
while( i < 4 )
{
log( "The value of i is " $ i );
i = i + 1;
}
log( "Completed with i=" $ i);
}
В результате работы этого цикла мы получим вывод:
Demonstrating the do loop
The value of i is 0
The value of i is 1
The value of i is 2
The value of i is 3
Completed with i=4
Оператор continue
Команда "continue" перемещает поток выполнения в начало цикла, а все, что находится после нее, выполнено не будет. В некоторых случаях это может быть использовано для пропуска участка кода цикла.
function ContinueExample()
{
local int i;
log( "Demonstrating continue" );
for( i=0; i<4; i++ )
{
if( i == 2 )
continue;
log( "The value of i is " $ i );
}
log( "Completed with i=" $ i );
}
В результате работы этого цикла мы получим вывод:
Demonstrating continue
The value of i is 0
The value of i is 1
The value of i is 3
Completed with i=4
Оператор break
Команда "break" осуществляетвыходизтекущегоцикла ("For", "Do" или "While").
function BreakExample()
{
local int i;
log( "Demonstrating break" );
for( i=0; i<10; i++ )
{
if( i == 3 )
break;
log( "The value of i is " $ i );
}
log( "Completed with i=" $ i );
}
В результате работы этого цикла мы получим вывод:
Demonstrating break
The value of i is 0
The value of i is 1
The value of i is 2
Completed with i=3
Обратите внимание, что команда "break" также может быть использована для пропуска оставшейся части условного оператора ("switch").
Структуры выбора
Выражения if-then-else
Операторы "if", "else if" и "else" позволяют вам выполнить код при выполнении определенных условий.
// Example of simple "if".
if( LightBrightness < 20 )
log( "My light is dim" );
// Example of "if-else".
if( LightBrightness < 20 )
log( "My light is dim" );
else
log( "My light is bright" );
// Example if "if-else if-else".
if( LightBrightness < 20 )
log( "My light is dim" );
else if( LightBrightness < 40 )
log( "My light is medium" );
else if( LightBrightness < 60 )
log( "My light is kinda bright" );
else
log( "My light is very bright" );
// Example if "if" with brackets.
if( LightType == LT_Steady )
{
log( "Light is steady" );
}
else
{
log( "Light is not steady" );
}
Выражения case
"Switch", "Case", "Default", and "Break" позволяют вам легко обрабатывать списки условий.
// Example of switch-case.
function TestSwitch()
{
// Executed one of the case statements below, based on
// the value in LightType.
switch( LightType )
{
case LT_None:
log( "There is no lighting" );
break;
case LT_Steady:
log( "There is steady lighting" );
break;
case LT_Backdrop:
log( "There is backdrop lighting" );
break;
default:
log( "There is dynamic" );
break;
}
}
Структура "switch" состоит из одного или более операторов "case", а также необязательного оператора "default". Управление передается оператору "case", совпадающему со значением оператора "switch". Оператор "switch" может включать любое количество экземпляров "case", но два оператора "case" не могут иметь одинаковое значение. Выполнение кода после оператора начинается с выбранного оператора и продолжается до тех пор, пока оператор break не передаст управление за пределы структуры case. Если ни одно выражение case не совпадает со значением оператора "switch", управление передается операторам, следующим за необязательным оператором "default". Если оператора "default" нет, то управление передается за пределы управляющей структуры "switch".
Оператор перехода "break", требуется после каждого блока case, включая последний блок, вне зависимости от того, какой из двух операторов ("case" или "default") там использован. Если вы не используете "break", то выполнение будет передано следующему оператору "case" (или "default").
// Example of switch-case.
function TestSwitch2()
{
switch( LightType )
{
case LT_None:
log( "There is no lighting" );
break;
case LT_Steady: // will "fall though" to the LT_Backdrop case
case LT_Backdrop:
log( "There is lighting" );
break;
default:
log( "Something else" );
break;
}
}
Оператор goto
Команда "goto" осуществляет переход потока выполнения к указанной метке.
// Example of "goto".
function GotoExample()
{
log( "Starting GotoExample" );
goto Hither;
Yon:
log( "At Yon" );
goto Elsewhere;
Hither:
log( "At Hither" );
goto Yon;
Elsewhere:
log( "At Elsewhere" );
}
В результате мы получим вывод:
Starting GotoExample
At Hither
At Yon
At Elsewhere
Функциональность языка