UDN
Search public documentation:
UnrealScriptVariablesCH
English Translation
日本語訳
한국어
Interested in the Unreal Engine?
Visit the Unreal Technology site.
Looking for jobs and company info?
Check out the Epic games site.
Questions about support via UDN?
Contact the UDN Staff
日本語訳
한국어
Interested in the Unreal Engine?
Visit the Unreal Technology site.
Looking for jobs and company info?
Check out the Epic games site.
Questions about support via UDN?
Contact the UDN Staff
UnrealScript变量
概述
变量作用范围
- Instance Variables(实例变量) - 这些变量应用于整个对象(类或结构体),并且在它们所属对象的整个生命周期内都可用。实例变量在创建对象时创建,在销毁对象时被销毁。这些变量可以在属于该对象的任何非静态函数中使用,或通过到该变量所属的的对象的引用可以从其他对象中访问该变量。
- Local Variables(局部变量) - 这些变量是属于函数的“局部”变量,它们属于一个特定的函数。仅当执行函数时这些变量有效。当函数开始执行时创建这些局部变量,当函数执行结束时销毁这些变量。不能从其它函数或其他对象中使用或访问它们。
变量声明
var
或 local
关键字及后面跟随的可选修饰符、要声明的变量的类型及变量名称构成。
var Type Name; ... local Type Name;
var
进行定义。局部变量使用关键字 local
进行定义。
这里是在UnrealScript中的一些实例变量声明的例子:
class MyClass extends Actor; // All istance variables must be declared before // any functions or states are declared var int A; // Declare an integer variable named "A". var byte Table[64]; // Declare a static array of 64 bytes named "Table". var string PlayerName; // Declare a string variable named "PlayerName". var actor Other; // Declare a variable which can be assigned a reference to an Actor instance. var() float MaxTargetDist; // Declare a float variable named "MaxTargetDist" and allow its value to be modified from an UnrealEd property window. struct RangeVector { var Vector Min; // Declare a vector variable named "Min" within the struct. var Vector Max; // Declare a vector variable named "Max" within the struct. }; var RangeVector Bounds; // Declare a RangeVector variable named "Bounds". function foo { ... } var int B; // This will cause an error
function int Foo() { // All local variables must be declared before // any other code in the function body local int Count; local float Seconds; Count = 1; // Declaring a local variable here would cause an error local float Minutes; return Count; }
变量修饰符
变量也可以包含其它的额外修饰符来对其进一步的描述,比如const
。事实上,将会有很多你在一般的编程语言中没有见过的修饰符,这主要是因为我们想使UnrealScript支持许多游戏-和特定环境中-的专用概念:
- config
- 这个变量是可以配置的。当前的值将被保存到一个ini文件中并在创建时加载。 这个变量不能在默认属性中赋值。 意味着它是常量。
- globalconfig
- 和config的使用基本相同,除了不可以在子类中重写使用它所定义的变量。 这个变量不能在默认属性中赋值。 意味着它是常量。
- localized
- 这个变量的值将会定义一个本地化变量。主要用于字符串。意味着它是常量。在本地化参考指南 及 Unreal 字符串获得关于此的更多信息。
- const
- 把变量的内容当成一个常量。在UnrealScript,你可以读取常量的值,但是你不能对其写入值。"Const"仅用于引擎来负责更新的变量及不能从UnrealScript中安全地进行更新的变量,比如一个物体的位置(仅能通过调用MoveActor函数来进行设置)。
- private
- 这个变量是私有的,仅能通过该类的脚本来进行访问;其它的类(包括子类)不能访问该变量。
- protected
- 这个变量仅能由此变量的类及其子类进行访问,其它类不能访问。
- privatewrite
- 在声明该变量的类之外,该变量是常量型 const 。
- protectedwrite
- 在声明该变量的类及其子类之外,该变量是常量型 const 。
- repnotify
- 当通过复制接收到这个属性的值时,应该通知Actors(通过 ReplicatedEvent 函数)。
- deprecated
- 意味着这个变量在不久的将来将会被删除,并且将不能在编辑器中访问。 Deprecated属性可以被加载,但不能被保存。
- instanced
- 仅用于对象属性。 当创建了一个这个类的实例,将会默认地为这个变量赋予一个这个对象的唯一拷贝。 用于在类的默认属性中定义的实例化子对象。
- databinding
- 这个属性可以通过数据库系统进行操作。
- editoronly
- 属性值仅在运行UnrealEd或者一个命令开关时被加载。 在游戏中,这个属性值将被丢弃。
- notforconsole
- 这个属性值将仅在运行PC时加载。 在游戏控制台中,该属性值被丢弃。
- editconst
- 编辑器。这个变量可以在UnrealEd中看到,但不能被编辑。一个editconst变量并 不 暗示着它是"const"变量。
- editfixedsize
- 编辑器。仅用于动态数组。这将防止用户通过UnrealEd属性窗口来改变数组的长度。
- editinline
- 编辑器。允许用户编辑在UnrealEd属性窗口中编辑这个变量所引用的物体属性。(仅用于对象引用,包括数组对象的引用)。
- editinlineuse
- 编辑器。 除了执行 editinline 的相关行为外,在编辑器中这个对象引用的旁边添加一个"Use"按钮。
- noclear
- 编辑器。防止从编辑器中将该对象引用设置为None。
- interp
- 编辑器。意味着这个值可以受到Matinee中的浮点或向量属性轨迹的驱动从而随时间改变。
- input
- 高级。使得在Unreal的输入系统中是可以访问的该变量,从而使输入(比如按钮的押下和操作杆的运动)能够和变量直接地进行映射。仅和变量类型"byte"和"float"相关。
- transient
- 高级。说明这个变量是临时使用的,且不是对象永久状态的一部分。Transient变量不会被保存到磁盘。当加载一个对象时,Transient变量被初始化为类的默认值。
- duplicatetransient
- 高级。意味着当创建对象的一个二进制副本时,变量的值将被重置为类的默认值(通过StaticDuplicateObject).
- noimport
- 高级。 意味着当导入T3D文本时,将跳过这个变量。 换句话说,当导入或者 复制/粘帖 对象时,这个变量的值将不会被传递到新的对象实例中。
- native
- 高级。声明了这个变量通过C++代码进行加载和保存,而不是通过UnrealScript。
- export
- 高级。仅对对象属性(或对象数组)有用。 意味着当一个对象被复制(复制/粘帖)或导出到T3D中而不是仅仅输出对象引用本身时,赋予给这个属性的对象应该作为一个子对象块整体地导出。
- noexport
- 高级。仅用于native类。 这个变量不能包含在自动生成的类声明中。
- nontransactional
- 高级。意味着这个变量值的改变将不会被包含到编辑器的 取消/重复 历史中。
- pointer{type}
- 高级。 这个变量是一个指向 type(数据类型) 的指针 ( type(数据类型) 是随意的)。注意语法是: pointer varname(指针变量名){type(数据类型)}
- init
- 高级。 这个属性将被作为FString或TArray而不是一个FStringNoInit 或TArrayNoInit导出到头文件中。 仅适用于在native类中声明的字符串和动态数组。 'Init'属性不能被赋予默认值,因为当创建对象时,默认值将会被清除。(请查看 Unreal 字符串 和 Native 字符串)
- repretry
- 高级;仅用于结构体属性。如果没能完全成功发送该属性(比如,网络上没有获得要进行序列化的对象应用)则重新复制它。对于简单的引用来说这个处理是默认的,但是对于结构体来说,由于带宽消耗通常我们不会将其作为默认修饰符,所以如果没有指定这个标志将会禁用该处理。
- allowabstract
- 高进;仅用于对象引用。允许在编辑器中将抽象类赋予该变量。
- out
- 这个修饰符仅对函数参数有效。 请查看函数参数修饰符页面来获取详细信息。
- coerce
- 这个修饰符仅对函数参数有效。 请查看函数参数修饰符页面来获取详细信息。
- optional
- 这个修饰符仅对函数参数有效。 请查看函数参数修饰符页面来获取详细信息。
- skip
- 这个修饰符仅对运算符函数参数有效。 仅用于逻辑运算符比如&& 和 ||。如果可以通过第一个参数决定逻辑操作的结果,那么则告诉编译器插入一小段代码到程序流中以便跳过(不计算)第二个参数。
这保证了表达树中C语言风格的行为,比如:if( ++a==10 && ++b==10 )
元数据
变量也可以通过在每个变量上指定元数据的形式来具有额外信息,以供引擎或编辑器使用,从而提供扩展功能。可以使用元数据指定一个显示名称、工具提示信息、其他东西之间的最小值和最大值。 要想将元数据链接到变量,您可以将它添加到变量声明中,它位于在变量名称的后面且在结束声明的分号的前面。元数据被指定为一系列成对的Tag(标签)=Value(值)
,位于尖括号内由竖线 (|
)分隔< >。
比如:
var float MyVar<DisplayName=My Float Variable|Tooltip=This is a float variable with additional metadata specified|UIMin=0.0|UIMax=10.0|ClampMin=0.0|ClampMax=5.0>;
默认属性
在UnrealScript中,当声明变量时不会指定变量的默认值,这和其他编程语言中可以声明默认值不同。另外,在UnrealScript中创建的类没有用于设置默认值的“构造”函数的概念。反之,UnrealScript使用在类定义的脚本结尾处添加的defaultproperties
块来指定在该类中声明的实例变量的默认值。该默认属性块中不允许执行代码,并且它遵循的某些规则和UnrealScript中其他地方使用的语法略有不同。
比如:
defaultproperties { IntVar=3 FloatVar=2.5 StringVar="This is a string" ArrayVar(0)=2 ArrayVar(1)=4 ArrayVar(2)=7 ArrayVar(3)=1 }
变量类型
基本数据类型
这里是UnrealScript中支持的通常可以在其他语言中找到的基本数据类型的列表:- byte(字节型)
- 范围是
0
到255
的一个字节值。 - int(整型)
- 32位的整型值
- bool(布尔型)
- 布尔值:
true
或false
。 - float(浮点型)
- 32位的浮点数。
- string(字符串型)
- 一个字符串。(请参照虚幻字符串)。
- constant(常量)
- 不能修改的变量。
- enumeration(枚举型)
- 一个能够代表多个预先设定的整数值中其中一个值的变量。比如,在Actor脚本中定义的枚举类型ELightType描述了一个动态光源,它可以具有像
LT_None=、 =LT_Pulse=、 =LT_Strobe
等值。
集合数据类型
- array<Type>(数组类型)
- 一个
Type
类型的数组。 - struct
- 和C中的结构体类似,UnrealScript的structs可以让您创建包含子变量的新的变量类型。比如,两个常用的Unreal structs是由X坐标、Y坐标及Z坐标组成的
vector(向量)
;及由倾斜度、偏转度、旋转度组成的rotator
。请参照 Structs(结构体)部分获得更多信息。
Unreal类型
- Name
- 在Unreal中一个东西的名称(比如函数名、状态名、类名等)。 Names(名称)会作为一个索引存储到全局名称表中。Names(名称)和简单的字符串相对应,最多可以包含64个字符。Names(名称)不像字符串那样一旦创建不能改变(请查看Unreal 字符串获得更多的信息)。
- 对象和Actor引用
- 指向世界中另一个object 或 actor的变量。比如,Pawn类有一个
Enemy
actor 引用,那么它指定了玩家应该攻击的物体。Object 及actor引用是非常强大的工具,因为它们使您可以访问另一个actor的变量及函数。比如,在Pawn的脚本中,你可以用Enemy.TakeDamage(123)
来调用您的敌人的TakeDamage
函数—从而导致敌人受到伤害。Object 引用也可能包含着一个特殊值None=
,它和C 语言中的NULL
指针是等同的: 它的意思是这个变量不能指向任何物体。 - Delegate
- 保存着到一个Unrealscript函数的引用。
可编辑性
var() int MyInteger; // Declare an editable integer in the default // category. var(MyCategory) bool MyBool; // Declare an editable integer in // "MyCategory".
editconst
,这意味着这个变量将可以在UnrealEd中看见但 不 可以编辑。注意这仅仅是为了防止变量在编辑器中被改变而不是在脚本中。如果您想使一个变量为真正的 const
但是仍然可以在编辑器中可见,您必须声明它为 const editconst
:
// MyBool is visible but not editable in UnrealEd var(MyCategory) editconst bool MyBool; // MyBool is visible but not editable in UnrealEd and // not changeable in script var(MyCategory) const editconst bool MyBool; // MyBool is visible and can be set in UnrealEd but // not changeable in script var(MyCategory) const bool MyBool;
数组
var int MyArray[20]; // Declares an array of 20 ints.
动态数组
先前我们所讲的数组是指静态数组。它意味着数组的大小(数组中有多少个元素)是在编译时设置的并且是不能改变的。动态数组和静态数组都有以下共同的特征:- 不变的搜索时间 – 时间代码在访问任何数组中给定的元素所花费的时间是相同的,无论在一个数组中有多少个元素。
- 没有限制的元素类型 – 您可以创建任何类型的数组 - ints, vectors, Actors等(booleans除外,它仅对动态数组有效。)
- 访问方式 – 您可以使用数组中的索引来访问任何元素,反过来说,尝试访问一个在数组范围之外的一个索引的元素将会抛出一个访问无效的警告信息。
>>
操作符来处理。比如:声明一个叫IntList的动态整型数组:
var array<int> IntList;
class<PlayerController>
、名称为Players的动态数组:
var array<class<PlayerController> > Players;
IntList.MethodName()
。以下是动态数组提供的方法:
- Add(int Count): 通过使用 Count 来扩展数组的长度,和FArray::AddZeroed()一样。
- Insert(int Index, int Count): Index_是插入元素的索引位置, _Count 是插入的元素数量。任何在那个位置存在的元素将会被上移,将会创建新的元素并把它们插入到指定的位置。在索引为3的位置插入5个元素将会使数组中从索引3开始的所有元素都会被上移5位。现在放在索引3出的元素将会被放置到索引8,元素4将是元素9等等。* Remove(int Index, int Count):_Index_ 是指从何处开始移除元素的索引, Count 是要移除的元素的数量。 新增加的元素都被初始化为默认值(除了structs包含structdefaultproperties外,其它所有元素将被初始化为 0/空)。
- Remove(int Index, int Count): 这里 Index 是从其开始删除元素的数组索引, Count 是要删除的元素的数量。 这允许我们从数组中任何有效的索引开始来移除数组中的一组元素。注意任何高于将被删除的范围的索引将会改变它们的索引值,如果您存储索引值到一个动态数组中时请记住这一点。
- AddItem(Item): 在数组的末尾增加一个元素 Item ,从而是数组的长度加1。
- RemoveItem(Item): 使用线性搜索来删除任何元素实例 Item 。
- InsertItem(int Index, Item): 将元素 Item 插入到数组中的索引 Index 处,从而是数组的长度加1。
- Find(...) - 查找一个元素在数组中的索引。有两个Find函数版本: 标准的查找函数是匹配所有的元素值,另一个专用版本的查找函数是基于struct的一个单独属性值来匹配一个struct。
- Find(Value): Value 是要搜索的值。 返回在数组中第一个匹配指定值的元素的索引,如果没有找到返回-1。 Value 可以是任何有效的表达式。
- Find(PropertyName, Value): PropertyName 是在struct中用于搜索的属性名称(必须是'Name'类型), Value 是要搜索的值。 返回在数组中第一个匹配指定的属性名 PropertyName 的值的struct的索引,如果没有找到,返回-1。 Value 可以是任何有效的表达式。
- Sort(SortDelegate): 使用 SortDelegate 来适当地对数组的内容排序。 SortDelegate 的签名应该和以下显示的一样:
- delegate int ExampleSort(ArrayType A, ArrayType B) { return A < B ? -1 : 0; } // 一个负数返回值预示着应该交换这些项。
长度变量
动态数组也有一个变量叫Length
,它是指动态数组的当前长度(元素的个数)。要想访问Length,通过使用我们的示例数组,我们可以这样操作: IntList.Length
。
我们不仅能读取这个Length变量,并且我们可以直接设置它,从而允许我们修改数组中元素的数量。当您直接修改Length变量时,在数组长度中的所有改变都在数组的末端发生。比如,如果我们设置 IntList.Length = 5,然后我们再设置IntList.Length = 10,那么我们刚刚添加的额外的5个元素会添加到数组的末端,同时保持我们原始的5个元素及其它们的值。如果我们降低Length,元素也会被从数组的末端拿掉。注意当您想一个数组增加元素时,不管是通过Insert()函数还是通过增加长度,元素都会被初始化为它的变量类型的默认值(ints为0,类的引用为None等)。值得注意的是您也可以通过设置元素的索引比当前的Length值大来增加动态数组的长度。这将和您设置Length的值为较大的值来扩展数组是一样的。
OldLength = Array.length
Array.Length = OldLength + 1
Array[OldLength] = NewValue
Array[Array.Length] = NewValue
Array.AddItem(NewValue)
Array[Array.length].myStructVariable = newVal
array<bool>
类型!
最后需要注意的是 - 动态数组是 不能 复制(注意这个"复制"是指Replicate, 不是Copy)的。您可以通过可以复制数组的函数来解决这个问题,并且具有两个参数:一个是动态数组的一个索引及那个索引处所存储的值。然而,你也必须要考虑在客户端和服务器的一次更新时间间隔内元素不一样的后果。
迭代动态数组
动态数组现在支持foreach=
操作符来进行简单的迭代操作。 基本语法是:
foreach ArrayVariable(out ArrayItem, optional out ItemIndex) { ... }
ArrayItem
必须和数组中的元素是同一类型。如果提供了属性,每次迭代都将索引值进行增量计算并输出元素项及其索引值。
function IterateThroughArray(arraySomeArray) { local string ArrayItem; local int Index; foreach SomeArray(ArrayItem) { `log("Array iterator test #1:"@ArrayItem); } foreach SomeArray(ArrayItem,Index) { `log("Array iterator test #2:"@ArrayItem@Index); } }
Structs(结构体)
Struct(结构体)定义
在您声明一个struct变量之前,您必须定义要使用的结构体。它的定义由struct
关键字及后面跟随的结构体名称构成。然后,在花括号{}内,使用和声明任何其他实例变量一样的方法来声明构成结构体的变量。结束花括号的后面必须有分号。
以下是个向量结构体定义的示例:
// A point or direction vector in 3D space.
struct Vector
{
var float X;
var float Y;
var float Z;
};
structdefaultproperties
代码块来玩成。比如,如果您想事先定义 Vector
结构体中的每个变量的起始值为 1.0
,那么您可以这样定义该结构体:
// A point or direction vector in 3D space.
struct Vector
{
var float X;
var float Y;
var float Z;
structdefaultproperties
{
X=1.0
Y=1.0
Z=1.0
}
};
Struct (结构体)修饰符
Structs也具有少量几个可以影响struct的所有实例的修饰符。修饰符在定义中位于struct
关键字和结构体名称之间。
- atomic
- 意味着这个struct要一直作为一个单独的单元进行序列化;如果在struct中的任何属性和它的默认值不同,那么struct中的所有元素都将被序列化。
- atomicwhencooked
- 仅在使用已烘焙的包的数据时才应用'atomic'标志。
- immutable
- 意味着这个结构体使用二进制序列化(减少磁盘空间占用并提高序列化性能);在没有增加包的版本的情况下从这个struct中增加/移除成员是不安全的。
- immutablewhencooked
- 仅当使用已烘焙的包数据进行工作时才能应用'immutable'标志。
- strictconfig
- 意味着当一个struct属性有'config/globalconfig'修饰符时,仅在这个结构体中标记为config/globalconfig的属性才能被从.ini文件中读取。(如果没有此标志,在struct中的所有属性都是可配置的)
声明Struct(结构体)变量
一旦您定义了一个struct,你便可以开始定义那个struct类型的特定变量了:
// Declare a bunch of variables of type Vector.
var Vector Position;
var Vector Destination;
使用Struct(结构体)变量
要想访问struct中的分量 ,请使用以下代码:function MyFunction() { Local Vector A, B, C; // Add some vectors. C = A + B; // Add just the x components of the vectors. C.X = A.X + B.X; // Pass vector C to a function. SomeFunction( C ); // Pass certain vector components to a function. OtherFunction( A.X, C.Z ); }
- Vector
- 在空间中的一个唯一的三维点或者向量,具有X、 Y、Z分量。
- Plane
- 在三维空间内定义了一个的唯一的平面。平面是通过它的X、Y、Z分量(假设它们都是归一化的)加上它的W分量来定义的,W代表了沿着平面的法线平面到原点的距离 (它是从平面到原点的最短的线)。
- Rotator
- 一个rotation(旋转量)定义了一个唯一的正交坐标系统。一个rotator包括Pitch(倾斜度)、Yaw(偏转度)及Roll(旋转度)分量。
- Coords
- 在三维空间中的任意一个坐标系统。
- Color
- 一个RGB颜色值。
- Region
- 定义了关卡中的一个凸起区域。
枚举型
EPhysics
,它描述了Unreal要应用到actor上的物理。这个物理可以设置为已经预先定义的值中的一个,比如 PHYS_None=、 =PHYS_Walking=、 =PHYS_Falling
等。
在内部,枚举变量是作为字符变量存储的。在设计UnrealScript时,并没有认为枚举类型是必需的,但是当看到一个actor的物理模型被设置为 PHYS_Swimming
而不是(比如) 3
,发现它使代码变得如此易读。
这里是定义枚举类型的示例代码。
// Declare the EColor enumeration, with three values. enum EColor { CO_Red, CO_Green, CO_Blue }; // Now, declare two variables of type EColor. var EColor ShirtColor, HatColor; // Alternatively, you can declare variables and // enumerations together like this: var enum EFruit { FRUIT_Apple, FRUIT_Orange, FRUIT_Bannana } FirstFruit, SecondFruit;
LT_Steady
、 PHYS_Falling
等,而不是简单地声明为"Steady" 或 "Falling"。 这只是编码风格的问题而不是语言的要求。
UnrealScript仅在枚举类型定义的类及其子类中可以识别没有明确枚举变量名的枚举标签(比如 FRUIT_Apple
)。 如果你需要引用一个在类的层次的其它地方定义的枚举标签,你必须使它符合要求:
FRUIT_Apple // If Unreal can't find this enum tag... EFruit.FRUIT_Apple // Then qualify it like this.
var int MyIntArray[EFruit];
常量
- 整型和字节型常量可以使用简单的数字来指定,比如
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 LargeNumber=123456; const PI=3.14159; const MyName="Tim"; const Northeast=Vect(1.0,1.0,0.0);
class'Pawn'.const.LargeNumber
Object和actor引用变量
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.
// 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(); }
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
。
请参照脚本间的通信部分获得关于如何使用它们在一些对象和其他对象之间进行通信的详细信息。
类引用变量
var() class C;
var actor A;
A = Spawn( C ); // Spawn an actor belonging to some arbitrary class C.
var classActorClass;
// casts the result of SomeFunctionCall() a class of type Actor (or subclasses of Actor) class( SomeFunctionCall() )
类型转换
隐性类型转换
某些变量数据类型(一般是数值数据类型 -byte
、 int
、 float
)支持彼此间的自动数据类型转换。这称为隐性类型转换,因为您正在转换数据类型但是却没有显示地说明要转换到的数据类型。当您将一种类型的值或变量分配给另一种类型的变量时执行隐性类型转换。
比如:
var int IntVar; var float FloatVar; ... IntVar = 2; // IntVar holds the value 2 FloatVar = 4.25; // FLoatVar holds the value 4.25 ... IntVar = FloatVar; // IntVar now holds the value 4
FloatVar
和 IntVar
是不同的类型,但是您可以将其中的一种类型的值赋予另一个类型的变量,因为 int
和 float
彼此间支持隐性类型转换。
显性类型转换
尽管数值类型可以进行隐性类型转换,但其他类型的数据需要声明要转换到的类型来进行显性类型转换。并不是所有类型都可以通过显性地类型转换为任何其他类型的数据。被转换的数据类型必须支持转换到的目标类型,否则编译器将会抛出错误。 当显性地类型转换一个值时,您必须要指明要转换到的类型,并在后面的圆括号内指出要转换的值。基本语法是:TypeToCastTo(ValueToCast)
Vector(向量)
变量,您想将其显示为 String(字符串)
。因为 Vector(向量)
数据类型支持显示地转换为 String(字符串)
类型,所有以下代码是完全有效的:
var Vector Offset; var String OffsetText; ... Offset = vect(1.0, 2.5, 5.0); //Offset now holds the values X=1.0, Y=2.5, Y=5.0 OffsetText = String(Offset); //OffsetText now holds the value "1.0,2.5,5.0"
显性类型转换支持的类型
- string(字符串型)
-
String
数据类型支持转换为以下类型:- Byte, Int, Float -
String
存放的数值将会被转换为真正的数值型数值。如果String
的值不包含一个数值,那么根据要转换到的类型的不同,类型转换的结果将是0
或0.0
。 - Bool -将
String
的值转换为TRUE
或FALSE
。如果String
包含"True"
或"False"
(不区分大小写),那么文本将会被直接转换为等价的Bool
值。如果这些值都不存在,那么String
的值将首先被转换为数值型值(遵循上面描述的规则),然后如果数值型值为0
,则将其转换为Bool
值FASLE
,其他的任何值则转换为TRUE
。 - Vector, Rotator - 将存放
Vector
或Rotation
类型值(三个数值之间由逗号分割,比如“0.5,23.64,18.43”)的文本形式的String(字符串)
转换为指定的目标类型数据。 对于Vector
转换来说,String(字符串)
中的数值将会被转换为具有两位小数位精确度的Float(浮点型)
值。对于Rotator
转换来说,String(字符串)
中的数值将会被删减,或者删除所有小数位,并将其转换为Int(整型)
值。
- Byte, Int, Float -
- Bool
-
Bool
数据类型支持被转换为以下数据类型:- String - 将
Bool
型的TRUE
或FALSE
值分别转换为"True"
或"False"
。 - Byte, Int, Float - 将
Bool
型的TRUE
或FALSE
值分别转换为数值1
或0
。
- String - 将
- Byte, Int, Float, Vector, Rotator
- 这些数值型数据类型支持转换为以下类型:
- String - 转换为数值的文本形式。对于
Vector
或Rotator
来说,文本形式是三个数值(X
、Y
、Z
或Pitch
、Yaw
、Roll
),三个值之间由逗号分隔。 - Bool - 将数值转换为
Bool
值TRUE
或FALSE
。任何非零值会被转换为TRUE
,而值0将会被转换为FALSE
。对于Vector
或Rotator
来说,每个分量的值都是0则转换为FALSE
。如果有非零值存在,结果将是TRUE
。
- String - 转换为数值的文本形式。对于
- Name
-
Name
数据类型支持转换为以下类型:- String - 将
Name
的文本值转换为一个STRING
文本值。
- String - 将
- Vector
-
Vector
数据类型支持转换为以下类型:- Rotator - 将从世界原点处到
Vector
坐标指定位置处的方向向量转换为对应那个方向的Rotator
的Pitch
和Yaw
值。==Roll== 值将总是为0
。
- Rotator - 将从世界原点处到
- Rotator
-
Rotator
数据类型支持转换为以下类型:- Vector - 将==Rotator==的
Pitch
、Yaw
和Roll
值转换为从原点开始指向旋转向量方向的Vector
的坐标。
- Vector - 将==Rotator==的
- Object Reference
-
Object Reference
数值型数据类型支持转换为以下类型:- Int - 将
Object Reference
转换为唯一的Int
值。 - Bool - 如果
Object Reference
保存了一个有效的引用那么则返回TRUE
,否则如果对象引用的值是None
则返回FALSE
。 - String - 将
Object Reference
转换为文本形式,也就是将正在引用的Object
或Actor
的Name
属性转换为字符串 (转换Name
为一个String
数据) ,否则如果没有引用任何Object
,则将转换为"None"
。 - Object Reference - 假设两个类是相关的,那么一个类的
Object Reference
可以从该类转换为另一个类。请参照转换对象引用部分来获得关于这种类型转换的详细信息。
- Int - 将
转换对象引用
就像上面的简单数据类型的转换函数一样,在UnrealScript中你可以在各种类型之间转换actor和object引用。比如,所有的actors有一个叫"Target"的变量,它是到另一个actor的引用。假如您正在写一个脚本,在脚本中您需要检查并查看Target是否属于"Pawn" actor类的,并且你需要对您的target做一些特殊的处理,但仅当它是一个pawn类时才有效--比如,您需要调用Pawn函数的其中一个。actor的类型转换操作符可以让您完成这个目的。这里是一个示例: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. } }
// Called by engine when destroyed. function Destroyed() { // Remove from owner's inventory. if( Pawn(Owner)!=None ) Pawn(Owner).DeleteInventory( Self ); }