例如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並不會跟著動態變更大小。依據使用的情形,可能會造成潛在的臭蟲。
沒有留言:
張貼留言