2012年9月26日 星期三

動態存取UnrealScript的enum

雖然對於UnrealScript來說,enum一旦編譯完是不能修改的。但對C++而言就不是這麼一回事了,畢竟UnrealScript是用C++實作出來的。

例如AudioDevice類別的ESoundClassName列舉,在uc檔裡只宣告了一個Master項目:
enum ESoundClassName
{
     Master
};
實際上編輯SoundMode時,型別為ESoundClassName的SoundClassName卻會列舉出所有的SoundClass。其實這是因為在C++中可以動態修改UnrealScript的enum。

動態取得UnrealScript的enum


使用UEnum::GetEnum()可以取得列舉子。以下程式碼展示如何取得所有的EPhysics列舉子名稱:
UEnum* PhysicsEnum = FindObject<UEnum>( NULL, TEXT("Engine.Actor.EPhysics") );
TArray<FName> Modes;

for(INT i = 0; i < PhysicsEnum->NumEnums() - 1; i++)
{
    Modes.AddItem( PhysicsEnum->GetEnum(i) );
}
因為系統會自動加上PHYS_MAX列舉子,所以數量減1略過。

動態修改UnrealScript的enum


使用UEnum::SetEnums()可以動態修改UnrealScript enum。接續上面程式碼,下段示範如何修改EPhysics:
Modes.AddItem( TEXT("PHYS_WallWalk") );
PhysicsEnum->SetEnums(Modes);
實際上動態修改enum是有風險的。如果有某個陣列的大小使用EPhysics宣告如下:
var int MyArray[EPhysics];
之後再用SetEnums()增減EPhysics列舉子的話,MyArray並不會跟著動態變更大小。依據使用的情形,可能會造成潛在的臭蟲。

沒有留言:

張貼留言