天天看点

uc脚本 3--结构体structs 与 枚举型 enum

Structs(结构体)

struct是把一组变量一起塞入到一个新类型称为struct的超级变量的一种方法。uc structs和C语言中的结构体很像,它可以包含变量、数组及其它的结构体,但uc structs中不可以包含函数。

关于在uc 中使用struts相关的性能消耗方面的信息

Struct(结构体)定义

在您声明一个struct变量之前,您必须定义要使用的结构体。它的定义由 

struct

 关键字及后面跟随的结构体名称构成。然后,在花括号{}内,使用和声明任何其他实例变量一样的方法来声明构成结构体的变量。结束花括号的后面必须有分号。

以下是个向量结构体定义的示例:

// A point or direction vector in 3D space.
struct Vector
{
	var float X;
	var float Y;
	var float Z;
};
      

Structs(结构体)也可以指定它们所包含的变量的默认值。这通过在结构体定义中添加 

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
	}
};
      

关于结构体成员的默认属性的信息,请参照UnrealScript默认属性页面的 Struct(结构体)默认值?部分。

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 );
} 
      

你可以像操作其它变量一样来操作Struct变量: 你可以赋值变量给它们、也可以传递它们给函数、而且您也可以访问它们的成员。

在Object类中定义了几个Structs,这些在整个的Unreal将一直会使用。你必须熟悉它们的操作,因为它们是脚本的基础构建模块。

Vector
在空间中的一个唯一的三维点或者向量,具有X、 Y、Z分量。
Plane
在三维空间内定义了一个的唯一的平面。平面是通过它的X、Y、Z分量(假设它们都是归一化的)加上它的W分量来定义的,W代表了沿着平面的法线平面到原点的距离 (它是从平面到原点的最短的线)。
Rotator
一个rotation(旋转量)定义了一个唯一的正交坐标系统。一个rotator包括Pitch(倾斜度)、Yaw(偏转度)及Roll(旋转度)分量。
Coords
在三维空间中的任意一个坐标系统。
Color
一个RGB颜色值。

Region

定义了关卡中的一个凸起区域。

枚举型

在uc中枚举类型的存在,可以方便地声明能够包含一串关键字中的任意一个值的变量。比如,actor类包含着枚举变量 

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;
      
在Unreal代码中,我们经常要声明枚举值,像 

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];