Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Спецификаторы вызова функций

Поиск

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

Global

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

Super

Вызывает соответствующую версию функции базового класса. Вызываемая функция может быть как функцией состояния, так и глобальной функцией, в зависимости от контекста.

Super(classname)

Вызывает соответствующую версию функции, находящуюся в указанном классе, или версию ближайшего из базовых классов. Вызываемая функция может быть как функцией состояния, так и глобальной функцией, в зависимости от контекста.

Объединение нескольких спецификаторов вызова (например, Super(Actor).Global.Touch) является недопустимым.

Ниже приведено несколько примеров применения спецификаторов вызова:

class MyClass extends Pawn;

 

function MyExample(actor Other)

{

Super(Pawn).Touch(Other);

Global.Touch(Other);

Super.Touch(Other);

}

Также, например, функция BeginPlay() вызывается, когда актор входит в игровой процесс. Функция BeginPlay() реализована в классе Actor и включает некоторые важные операции, которые должны быть выполнены. Теперь, скажем, вы хотите переопределить функцию BeginPlay() в вашем новом классе MyClass, чтобы добавить новую функциональность. Чтобы сделать это безопасно, необходимо вызвать версию BeginPlay() из базового класса:

class MyClass extends Pawn;

 

function BeginPlay()

{

// Call the version of BeginPlay in the parent class (important).

Super.BeginPlay();

 

// Now do custom BeginPlay stuff.

//...

}

Доступ к статическим функциям из переменной класса

Статические функции из переменной класса могут быть вызваны следующим образом:

var class C;

var class<Pawn> PC;

 

class'SkaarjTrooper'.static.SomeFunction(); // Call a static function

// in a specific class.

 

PC.static.SomeFunction(); // Call a static function in a variable class.

 

class<Pawn>(C).static.SomeFunction(); // Call a static function in a

//casted class expression.

Значения по умолчанию для пременных

Доступ к значениям по умолчанию для переменных

UnrealEd позволяет дизайнерам уровней редактировать переменные "по умолчанию" класса объекта. Когда создается новый актор, все его переменные инициализируются значениями по умолчанию. Иногда это полезно для ручного сброса переменной в значение по умолчанию. Например, когда игрок бросает предмет инвентаря, код предмета инвентаря должен сбросить некоторые из значений актора в значения по умолчанию. В UnrealScript можно получить доступ к переменным по умолчанию класса с использованием ключевго слова "Default.". Например:

var() float Health, Stamina;

//...

 

// Reset some variables to their defaults.

function ResetToDefaults()

{

// Reset health, and stamina.

Health = Default.Health;

Stamina = Default.Stamina;

}

Доступ к значениям по умолчанию для переменных через ссылку на класс

Если у вас есть ссылка на класс (переменная типа class или class<classlimitor>), то вы можете получить доступ к свойствам по умолчанию для класса, на который она ссылается, не имея самого объекта этого класса. Этот синтаксис работает с любыми выражениями типа class.

var class C; var class<Pawn> PC;   Health = class'Spotlight'.default.LightBrightness; // Access the default value of // LightBrightness in the Spotlight class.   Health = PC.default.Health; // Access the default value of Health in // a variable class identified by PC.   Health = class<Pawn>(C).default.Health; // Access the default value // of Health in a casted class // expression.

Определение значений по умолчанию с использованием блока defaultproperties

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

  • В блоке defaultproperties не допустимо размещение операций, за исключением операций над динамическими массивами
  • Запятые могут быть размещены в конце каждой строки, но это не обязательно
  • Значения по умолчанию наследуются дочерними классами. Значения, указанные в defaultproperties дочернего класса переопределяют значения, указанные для базового классов.

Синтаксис
Синтаксис блока defaultproperties немного отличается от стандартного синтаксиса UnrealScript:

  • Простые типы (Ints, Floats, Bools, Bytes):
    • VarName=Value
  • Статические массивы:
    • ArrayProp(0)=Value1
      ArrayProp(1)=Value2
      или
    • ArrayProp[0]=Value1
      ArrayProp[1]=Value2
  • Динамические массивы:
    • ArrayProp=(Value1,Value2,Value3)
      или
    • ArrayProp(0)=Value1
      ArrayProp(1)=Value2
      ArrayProp(2)=Value3
      или
    • ArrayProp.Add(Value1)
      ArrayProp.Add(Value2)
      ArrayProp.Add(Value3)
  • Имена
    • NameProp='Value'
      или
    • NameProp=Value
  • Объекты
    • ObjectProp=ObjectClass'ObjectName'
  • Подобъекты
    • Begin Object Class=ObjectClass Name=ObjectName
      VarName=Value
      ...
      End Object
      ObjectProperty=ObjectName
  • Структуры (включая векторы):
    • StructProperty=(InnerStructPropertyA=Value1,InnerStructPropertyB=Value2)
      или
    • StructProperty={(
      InnerStructPropertyA=Value1,
      InnerStructPropertyB=Value2
      )}


Обратите внимание: Внутри структуры значений по умолчанию некоторые типы используют несколько иной синтаксис.

  • Встраиваемые (inline) статические массивы должны быть объявлены как (Обратите внимание, что здесь для доступа к элементам массива используются скобки "[]", вместо круглых скобок "()"):
    StructProperty=(StaticArray[0]=Value,StaticArrayProp[1]=Value)
  • Встраиваемые (inline) динамические массивы должны быть объявлены с использованием следующего синтаксиса:
    StructProperty=(DynamicArray=(Value,Value))
  • Встраиваемые (inline) переменные имен должны быть заключены в кавычки:
    StructProperty=(NameProperty="Value")
  • Операции над динамическими массивами. Они могут быть использованы для модификации содержимого динамического массива, который может быть унаследован от бызового класса.
    • Array.Empty - полностью очищает массив
    • Array.Add(element) - добавляет элемент к концу массива
    • Array.Remove(element) - удаляет элемент из массива, эта процедура может удалить все вхождения элемента
    • Array.RemoveIndex(index) - удаляет элемент по указанному индексу
    • Array.Replace(elm1, elm2) - заменяет elm1 на elm2. Все вхождения будут заменены. Если elm1 будет не найден, то выводится предупреждение.


Ознакомьтесь со следующим примером (основанном на Actor.uc):

defaultproperties { // objects MessageClass=class'LocalMessage'   // declare an inline subobject of class SpriteComponent named "Sprite" Begin Object Class=SpriteComponent Name=Sprite // values specified here override SpriteComponent's own defaultproperties Sprite=Texture2D'EngineResources.S_Actor' HiddenGame=true End Object //todo Components.Add(Sprite)   // declare an inline subobject of class CylinderComponent named "CollisionCylinder" Begin Object Class=CylinderComponent Name=CollisionCylinder // values specified here override CylinderComponent's own defaultproperties CollisionRadius=10 CollisionHeight=10 AlwaysLoadOnClient=True AlwaysLoadOnServer=True End Object //todo Components.Add(CollisionCylinder)   CollisionComponent=CollisionCylinder   // floats (leading '+' and trailing 'f' characters are ignored) DrawScale=00001.000000 Mass=+00100.000000 NetPriority=00001.f   // ints NetUpdateFrequency=100   // enumerations Role=ROLE_Authority RemoteRole=ROLE_None   // structs DrawScale3D=(X=1,Y=1,Z=1)   // bools bJustTeleported=true bMovable=true bHiddenEdGroup=false bReplicateMovement=true   // names InitialState=None   // dynamic array (in this case, a dynamic class array) SupportedEvents(0)=class'SeqEvent_Touch' SupportedEvents(1)=class'SeqEvent_UnTouch' SupportedEvents(2)=class'SeqEvent_Destroyed' SupportedEvents(3)=class'SeqEvent_TakeDamage' }


Поделиться:


Последнее изменение этой страницы: 2016-08-25; просмотров: 239; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.92.96 (0.007 с.)