常量
在UnrealScript,你几乎可以为所有的数据类型来指定常量值:
- 整型和字节型常量可以使用简单的数字来指定,比如
123
。=123=. 如果你必须以16进制的方式来指定一个整型或字节型常量,使用:0x123
- 使用十进制指定浮点型常量:
456.789
- 字符串常量必须加上双引号,比如:
"MyString"
- Name常量必须加上单引号,比如:
'MyName'
- Vector常量要像这样来了包含X, Y, 和 Z的值:
vect(1.0,2.0,4.0)
- Rotator常量要像这样来包含Pitch, Yaw, 和 Roll的值:
Rot(0x8000,0x4000,0)
- =None=常量指向"no object(空对象)"(或者等同地"no actor(空actor)")
- =Self=常量指向"this object(对象本身)"(或等同地,"this actor(actor本身)"),也就是正在执行的脚本所属的对象。
- 一般对象的常量通过用对象的类型并跟随带单引号的对象的名称来指定,比如:
texture'Default'
EnumCount=指定了一个枚举类型的元素个数,比如: =ELightType.EnumCount
ArrayCount=指定了一个静态数组中的元素的个数,比如: =ArrayCount(Touching)
。
你可以使用"const"关键字来声明一个常量,以后便可以通过常量的名称来引用了。 比如:
const LargeNumber=123456; const PI=3.14159; const MyName="Tim"; const Northeast=Vect(1.0,1.0,0.0);
常量可以在类或structs中定义。
如果要访问在另一个类中定义的常量,请使用"class'classname'.const.constname"语法,比如:
class'Pawn'.const.LargeNumber
Object和actor引用变量
你可以声明一个指向一个actor或object的变量,像这样:
var actor A; // An actor reference. var pawn P, Q; // A reference to an actor in the Pawn class. var texture T; // A reference to a texture object.
上面的变量"P"是一个到Pawn类的一个actor的引用。这个变量可以指向属于Pawn的子类的任何actor。比如,P可以指向一个Brute,或者一个Skaarj或Manta。它可以是任何类型的Pawn。然而,P永远不能指向一个Trigger actor(因为Trigger不是Pawn的子类)。
使变量指向一个actor从而获得便利的例子是在Pawn类中的Enemy变量,它指向Pawn正在试图攻击的actor。
当您有一个指向actor的变量时,你可以访问那个actor的变量并且调用它的函数。比如:
// Declare two variables that refer to a pawns. var pawn P, Q; // Here is a function that makes use of P. // It displays some information about P. function MyFunction() { // Set P's enemy to Q. P.Enemy = Q; // Tell P to play his running animation. P.PlayRunning(); }
指向actors的变量通常或者指向一个有效的actor(任何在关卡中实际存在的actor)或者指向 None
值。None等同于C/C++中的 NULL
指针。然而,在UnrealScript中访问具有 None
引用的变量和函数是安全的;结果通常为0。
注意一个object 或 actor引用是“指向”另一个actor 或 object,它并不“包含”一个真正的actor 或 object对象。在C语言中,一个actor引用等同于指向一个AActor类的对象的指针(在C语言中,你会称它为AActor*)。例如,你可以在世界中有两个鬼怪(monsters)Bob和Fred,它们相互打斗。Bob 的"Enemy"变量将“指向”Fred,并且Fred的"Enemy"变量将“指向”Bob。
和C语言中的指针不同,UnrealScript的对象引用总是安全的可靠的。一个对象引用指向一个不存在的对象或者无效的对象是不可能的(除了特殊情况: None
值)。在UnrealScript中,当一个actor被销毁,那么它的所有引用将被设置为 None
。
请参照脚本间的通信部分获得关于如何使用它们在一些对象和其他对象之间进行通信的详细信息。
类引用变量
在Unreal中,类就像actors、textures(贴图)及 sounds(声音)一样是对象。 Class 对象属于名称为"class"的类。 在很多情况下,您将需要存储一个到类对象的引用,以便您可以产生一个属于那个类的actor(在编译时不知道那个类是什么)。 比如:
var() class C;
var actor A;
A = Spawn( C ); // Spawn an actor belonging to some arbitrary class C.
现在,一定不要搞乱类C和属于类C的对象O(作为类C的一个“实例”)的角色作用。 打一个不太靠谱的比喻,一个类就像一个胡椒粉的研磨工,而那个类的实例就像是胡椒粉。 你可以使用胡椒粉的研磨工(类)来转动磨制机器的曲柄(调用Spawn函数)来创建胡椒粉(类的对象)…但是,一个胡椒粉研磨工(一个类)不是胡椒粉(属于这个类的对象),所以你一定不要尝试去吃它!
当定义一个引用这个类对象的变量时,你可以有选择性地使用语法 class<metaclass> 来限制这个类不能被 metaclass 类型(及它的子类)的变量所引用。 比如,在以下声明中:
var class ActorClass;
变量ActorClass仅能引用继承类"actor"的类。 这对改善编译时的类型检查是有帮助的。比如,Spawn函数采用一个类作为参数,但是仅当这个类是Actor的子类时才有效, class<classlimitor>语法使编译器来执行那个要求。
关于使用动态对象类型转换,你可以这样来动态地转换类的类型:
// casts the result of SomeFunctionCall() a class of type Actor (or subclasses of Actor)
class( SomeFunctionCall() )