天天看點

uc腳本 4--類型轉換

類型轉換

類型轉換是指将一個值從一種類型轉換為另一種類型的過程,一般用于将該值賦給将要轉換到的變量類型的情況。對于簡單資料及類似于對象引用這樣的較複雜的資料類型來說,将一個值從一個種類型轉換為另一種類型是非常有用的。但是,需要記住的是在類型轉換過程中可能會丢失資料。

不同類型的資料具有不同的精确級别,将一個較高精确級别的資料類型轉換為一個較低級别的類型時将會導緻丢失額外的精度位數。

類型轉換有兩種形式: 隐性轉換或顯性轉換。

隐性類型轉換

某些變量資料類型(一般是數值資料類型 - 

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

     或 

    Rotation

     類型值(三個數值之間由逗号分割,比如“0.5,23.64,18.43”)的文本形式的 

    String(字元串)

     轉換為指定的目标類型資料。 對于 

    Vector

     轉換來說, 

    String(字元串)

     中的數值将會被轉換為具有兩位小數位精确度的 

    Float(浮點型)

     值。對于 

    Rotator

     轉換來說, 

    String(字元串)

     中的數值将會被删減,或者删除所有小數位,并将其轉換為 

    Int(整型)

     值。
Bool

Bool

 資料類型支援被轉換為以下資料類型:
  • String - 将 

    Bool

     型的 

    TRUE

     或 

    FALSE

     值分别轉換為 

    "True"

     或 

    "False"

     。
  • Byte, Int, Float - 将 

    Bool

     型的 

    TRUE

     或 

    FALSE

     值分别轉換為數值 

    1

     或   。
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

     。
Name

Name

 資料類型支援轉換為以下類型:
  • String - 将 

    Name

     的文本值轉換為一個 

    STRING

     文本值。
Vector

Vector

 資料類型支援轉換為以下類型:
  • Rotator - 将從世界原點處到 

    Vector

     坐标指定位置處的方向向量轉換為對應那個方向的 

    Rotator

     的 

    Pitch

     和 

    Yaw

     值。==Roll== 值将總是為   。
Rotator

Rotator

 資料類型支援轉換為以下類型:
  • Vector - 将==Rotator==的 

    Pitch

     、 

    Yaw

     和 

    Roll

     值轉換為從原點開始指向旋轉向量方向的 

    Vector

     的坐标。
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

     可以從該類轉換為另一個類。請參照轉換對象引用部分來獲得關于這種類型轉換的詳細資訊。

轉換對象引用

就像上面的簡單資料類型的轉換函數一樣,在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 );
}