Здавалка
Главная | Обратная связь

Преобразование ссылок на объекты и классы



Выражения

Присваивание

Чтобы присвоить значение переменной, используйте оператор "=" следующим образом:

function Test()

{

local int i;

local string s;

local vector v, q;

 

i = 10; // Assign a value to integer variable i.

s = "Hello!"; // Assign a value to string variable s.

v = q; // Copy value of vector q to v.

}

В языке UnrealScript, когда функция или другое выражение, требуют определенный тип данных (например, "float"), а вы указываете другой тип данных (например, "int"), компилятор будет пытаться автоматически привести значение к соответствующему типу. Преобразования между всеми числовыми типами данных (byte, int и float) происходит автоматически, без каких-либо усилий с вашей стороны.

UnrealScript также может конвертировать многие другие встроенные типы данных в другие типы, если вы явно указываете их преобразование преобразовать в коде. Синтаксис для явного преобразования следующий:

function Test()

{

local int i;

local string s;

local vector v, q;

local rotator r;

 

s = string(i); // Convert integer i to a string, and assign it to s.

s = string(v); // Convert vector v to a string, and assign it to s.

v = q + vector(r); // Convert rotator r to a vector, and add q.

}

Ниже приведен полный набор типов, для которых в языке UnrealScript можно использовать не автоматическое явное преобразование:

  • String в Byte, Int, Float: Осуществляется попытка преобразовать строку вида "123" в значение 123. Если строка не является текстовым представлением числа, то результатом будет 0.
  • Byte, Int, Float, Vector, Rotator в String: Число преобразуется в текстовое представление.
  • String в Vector, Rotator: Осуществляется попытка преобразовать содержимое строки в значения элементов вектора или ротатора, соответственно.
  • String в Bool: Преобразует строки "True" и "False" (без учета регистра) в значения True и False, соответственно; преобразует любое ненулевое значение строки в True, а если строка пуста, то в False.
  • Bool в String: результатом будет строковое значение "True" или "False".
  • Byte, Int, Float, Vector, Rotator в Bool: Преобразует ненулевое значение в True, а нулевое в False.
  • Bool в Byte, Int, Float: Преобразует True а 1, а False в 0.
  • Name в String: Преобразует имя в соответствующий текстовый эквивалент.
  • Rotator в Vector: Возвращает вектор "вперед" в соответствии со значением ротатора.
  • Vector в Rotator: Возвращает ротатор с компонентами Pitching и Yaw, указывающими в направление вектора, для Roll присваивается 0.
  • Object (или Actor) в Int: Возвращает целое число, гарантированно уникальное для этого объекта.
  • Object (или Actor) в Bool: Возвращает False если ссылка на объект равна None или True для ссылки на существующий объект.
  • Object (или Actor) в String: Возвращает текстовое представление объекта.

Преобразование ссылок на объекты и классы

Подобно функциям преобразования между различными типами данных, в языке UnrealScript есть возможность преобразования типов ссылок на объекты и акторы. например, у вас есть переменная, названная "Target", являющаяся ссылкой на актор. Скажем, вы пишете сценарий, где вам необходимо проверить, принадлежит ли актор, представленный ссылкой Target, классу "Pawn", а если принадлежит, то осуществить последовательность необходимых вам операций, имеющих смысл только для класса Pawn, например, вызвать определенную функцию. Это можно сделать путем применения операторов преобразования.

var actor Target;

//...

 

function TestActorConversions()

{

local Pawn P;

 

// Cast Target to Pawn and assign the result to P. If Target is not a Pawn (or subclass of Pawn), then the value assigned to P will be None.

P = Pawn(Target);

if( P != None )

{

// Target is a pawn, so set its Enemy to Self.

P.Enemy = Self;

}

else

{

// Target is not a pawn.

}

}

 

Для выполнения преобразования типа актора введите имя класса, в который необходимо преобразовать ссылку,а в скобках укажите имя переменной, ссылающейся на иходный тип актора. Результат преобразования зависит от возможности выполнения преобразования. В приведенном выше примере, если Target ссылается объект Trigger, а не Pawn, выражение Pawn(Target) вернет "None", так как Trigger не может быть преобразован в Pawn. Однако, если ваша цель ссылается объект Brute, преобразование успешно вернет Brute, потому что Brute наследует класс Pawn.

Таким образом, преобразование типов акторов имеет две цели: во-первых, вы можете использовать для проверки объекта на принадлежность определенному классу. Во-вторых, вы можете использовать его для преобразования ссылки на актор из одного класса в другой. Обратите внимание, что это преобразование не влияет на актор и не меняет класс актора, а просто приводить ссылку на актор к конкретному типу, позволяя получить доступ к свойствам и методам, объявленным для типа, к которому осуществляется приведение, например к свойствам и методам производного класса.

Другой пример преобразования находится в сценарий Inventory. Каждый актор сценария Inventory принадлежит к классу Pawn, даже если его переменная Owner ссылается на любой другой актор (Actor.Owner - это переменная типа Actor). Таким образом, общей темой в коде Inventory является приведение типа Owner к типу Pawn, например:

// Called by engine when destroyed.

function Destroyed()

{

// Remove from owner's inventory.

if( Pawn(Owner)!=None )

Pawn(Owner).DeleteInventory( Self );

}

Функции

Объявление функций

В языке UnrealScript вы можете объявлять новые функции и писать новые версии уже существующих (переписывать функции). Функции могут принимать один или несколько параметров (UnrealScript поддерживает переменные любых типов) и, опционально, могут возвращать значение. Хотя большинство функций пишутся непосредственно в UnrealScript, вы также можете объявлять функции, которые могут быть вызваны из UnrealScript, но реализованы на C++ и находятся в DLL. Технология Unreal поддерживает все возможные комбинации вызовов функций: из кода движка на C++ можно вызывать функции сценариев; из сценариев можно вызывать функций, реализованные на C++, и, естественно, из сценариев можно вызывать функции, реализованные в сценариях.

Ниже приведен пример определения простой функции. Эта функция в качестве параметра принимает вектор и возвращает число с плавающей точкой:

// Function to compute the size of a vector.

function float VectorSize( vector V )

{

return sqrt( V.X * V.X + V.Y * V.Y + V.Z * V.Z );

}

Объявление функции всегда начинается с ключевого слова function. За ним следуют тип возвращаемого значения функции (в данном случае float), имя функции, а затем список параметров функции в круглых скобках.

При вызове функции выполняется код, находящийся между фигурными скобками. Внутри функции можно объявлять локальные переменные (с использованием ключевого слова local) и разместить любой код UnrealScript. Необязательное ключевое слово return заставляет функцию немедленно вернуть значение.

В функции вы можете передавать любые типы UnrealScript (в том числе массивы), а функция может возвращать результат любого типа.

По умолчанию, любые локальные переменные, объявляемые в пределах функции, инициализируются нулем.

Вызов функции может быть рекурсивным. Например, следующая функция вычисляет факториал числа:

// Function to compute the factorial of a number.

function int Factorial( int Number )

{

if( Number <= 0 )

return 1;

else

return Number * Factorial( Number - 1 );

}

Некоторые функции UnrealScript вызываются движком при наступлении определенных событий. Например, когда актора коснулся другой актер, двигатель называет функцию Touch, сообщающую акторы, кто с ним соприкасается. При написании собственной функции Touch, вы можете выполнить необходимые действия, выполняемые при вызове Touch:

// Called when something touches this actor.

function Touch( actor Other )

{

Log( "I was touched!")

Other.Message( "You touched me!" );

}

Вышеприведенная функция иллюстрирует несколько моментов. Во-первых, функция записывает сообщение в лог-файл, используя командуLog (которая эквивалентна командам языка Basic "print" и языка C "printf", за исключением некоторых правил форматирования). Во-вторых, она вызывает функцию "Message", находящуюся в другов акторе. Вызов функций, определенных в других объектах, это распространенное действие в языке UnrealScript (как и в других объектно-ориентированных языках, например в Java), поскольку оно обеспечивает простое средство для "общения" акторов между собой.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.