天天看點

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