2013-05-25 47 views
0

我有這樣的功能:如何打印的Vector2D在UnrealScript

function AddImpulse(Vector2D impulse) 
{ 
    `log("ADD IMPULSE: " $ impulse); 
} 

麻煩的是,我得到的錯誤「正確的類型是‘$’不相容看來,雖然內置的載體。類會自動強制爲一個字符串,Vector2D類只是一個內置的結構,沒有任何操作符重載或自動轉換。

我寫了一個運算符重載,它有助於這種情況,但除非我把重載聲明對象類(我認爲不應該這樣做)我必須在每個可能使用它的類中聲明它:

static final operator(40) string $ (string A, Vector2D B) 
{ 
    return A $ string(B.x) $ ", " $ string(B.y); 
} 

有沒有一種方法可以做到這一點一般,這樣我不需要每次都做:

`log("ADD IMPULSE: " $ impulse.x $ "," $ impulse.Y); 

雖然在一個的Vector2D的情況還不錯,這會在更大的結構或類別中變得繁瑣。

回答

1

不幸的是,您在UnrealScript中進行泛型編程的選項是有限的。一種選擇可能是將您的運算符重載到包含文件中,並使用宏將其包含在每個需要它的類中。

如果這不起作用,另一個選項可能是使用宏來調用特殊類中的靜態函數來處理結構體到字符串的轉換。

首先在您的代碼包的根文件夾中創建一個Globals.uci文件。 Globals.uci是一個特殊的文件,它被編譯器自動包含在與它關聯的包中的所有UncrealScript文件中。如果你的軟件包叫做MyPackage,那麼Globals.uci會放在Development/Src/MyPackage/Globals.uci中。它應該在你的包的Classes文件夾旁邊。

把你的宏Globals.uci:

`define toString(type,name) class'MyStructConversions'.static.`{type}ToString(`{name},"`{name}") 

放入MyStructConversions.uc轉換功能:

class MyStructConversions; 

static function string Vector2DToString (const out Vector2D A, string varname) 
{ 
    return varname $ ": (" $ A.X $ ", " $ A.Y $ ")"; 
} 

現在,當你從你的包任何地方調用`toString(Vector2D, impulse)宏將被替換在編譯時調用Vector2DToString函數。然後,您可以通過向MyStructConversions.uc添加適當的定義來支持更多的結構類型,並且toString宏可以與它們無縫協作。

有關UnrealScript preprocessor的文檔有更多關於`include和其他宏的信息。查看Development/Src/Core中的Globals.uci以獲取一些有用的示例。