類型轉換
類型轉換是指将一個值從一種類型轉換為另一種類型的過程,一般用于将該值賦給将要轉換到的變量類型的情況。對于簡單資料及類似于對象引用這樣的較複雜的資料類型來說,将一個值從一個種類型轉換為另一種類型是非常有用的。但是,需要記住的是在類型轉換過程中可能會丢失資料。
不同類型的資料具有不同的精确級别,将一個較高精确級别的資料類型轉換為一個較低級别的類型時将會導緻丢失額外的精度位數。
類型轉換有兩種形式: 隐性轉換或顯性轉換。
隐性類型轉換
某些變量資料類型(一般是數值資料類型 -
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
- Bool -将
的值轉換為String
或TRUE
。如果FALSE
包含String
或"True"
(不區分大小寫),那麼文本将會被直接轉換為等價的"False"
值。如果這些值都不存在,那麼Bool
的值将首先被轉換為數值型值(遵循上面描述的規則),然後如果數值型值為 ,則将其轉換為String
值Bool
,其他的任何值則轉換為FASLE
。TRUE
- Vector, Rotator - 将存放
或Vector
類型值(三個數值之間由逗号分割,比如“0.5,23.64,18.43”)的文本形式的Rotation
轉換為指定的目标類型資料。 對于String(字元串)
轉換來說,Vector
中的數值将會被轉換為具有兩位小數位精确度的String(字元串)
值。對于Float(浮點型)
轉換來說,Rotator
中的數值将會被删減,或者删除所有小數位,并将其轉換為String(字元串)
值。Int(整型)
Bool - Byte, Int, Float -
-
資料類型支援被轉換為以下資料類型:Bool
- String - 将
型的Bool
或TRUE
值分别轉換為FALSE
或"True"
。"False"
- Byte, Int, Float - 将
型的Bool
或TRUE
值分别轉換為數值FALSE
或 。1
Byte, Int, Float, Vector, Rotator - String - 将
- 這些數值型資料類型支援轉換為以下類型:
- String - 轉換為數值的文本形式。對于
或Vector
來說,文本形式是三個數值(Rotator
、X
、Y
或Z
、Pitch
、Yaw
),三個值之間由逗号分隔。Roll
- Bool - 将數值轉換為
值Bool
或TRUE
。任何非零值會被轉換為FALSE
,而值0将會被轉換為TRUE
。對于FALSE
或Vector
來說,每個分量的值都是0則轉換為Rotator
。如果有非零值存在,結果将是FALSE
。TRUE
Name - String - 轉換為數值的文本形式。對于
-
資料類型支援轉換為以下類型:Name
- String - 将
的文本值轉換為一個Name
文本值。STRING
Vector - String - 将
-
資料類型支援轉換為以下類型:Vector
- Rotator - 将從世界原點處到
坐标指定位置處的方向向量轉換為對應那個方向的Vector
的Rotator
和Pitch
值。==Roll== 值将總是為 。Yaw
Rotator - Rotator - 将從世界原點處到
-
資料類型支援轉換為以下類型:Rotator
- Vector - 将==Rotator==的
、Pitch
和Yaw
值轉換為從原點開始指向旋轉向量方向的Roll
的坐标。Vector
Object Reference - Vector - 将==Rotator==的
-
數值型資料類型支援轉換為以下類型: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.
}
}
要想執行actor轉換,需要書寫類的名稱并在後面加上您希望轉換的actor表達式,并使用圓括号括起。根據這個轉換是否合理,轉換将或者成功或者失敗。在上面的例子中,如果您的Target指向的是一個Trigger對象而不是一個Pawn,表達式Pawn(Target)将會傳回"None"值,因為不能将一個Trigger轉換為Pawn。然而,如果您的Target指向一個Brute對象,轉換将會成功并傳回那個Brute,因為Brute是Pawn的子類。
是以,actor類型轉換有兩個目的: 第一,你可以使用它們來判斷某個actor引用是否屬于某個類。第二,你可以使用它們來将一個actor引用從一個類轉換為一個更加明确的類。注意這些轉換不會影響您正在轉換的actor—它們隻是使UnrealScript将對待那個actor引用就像它是一個更加明确的類型一樣并且允許您通路這個更加子類中所聲明的屬性和方法。
另一個類型轉換的列子是在Inventory腳本中。每個Inventory actor由一個Pawn所有,盡管它的Owner變量可以指向任何Actor(因為Actor.Owner是一個Actor類型的變量)。是以在Inventory代碼中我們會将常看到将一個Owner轉換為Pawn類型的現象,比如:
// Called by engine when destroyed.
function Destroyed()
{
// Remove from owner's inventory.
if( Pawn(Owner)!=None )
Pawn(Owner).DeleteInventory( Self );
}