2012年10月31日 星期三

利用ini檔存放全域參數

開發專案時,有時會需要開放全域參數給美術或企劃人員設定。程式員可以把這些參數放在一個UnrealScript類別,然後建立一個物件儲存在固定的package檔裡,這其實就跟一般的Unreal資源很像。也可以把參數儲存在Unreal的ini檔裡,格式跟Windows的ini檔很像,一樣也是用section分類存放key=value設定。它也支援UnrealScript類別,一個section存放一個類別的屬性預設值設定。下表列出這三種方法的比較:

存放方式 固定路徑資源 ini檔的section方式 ini檔的屬性預設值方式
程式存取方式 載入物件後存取 呼叫存取函式 建立物件後存取
文字檔存取 不可
屬性視窗存取 不可 可,但需另外寫程式
執行時期更新 可,但需另外寫程式 可,但需另外寫程式 在遊戲中可用set指令修改

以方便性考量,建議將參數放在一個UnrealScript類別後利用ini檔儲存。這樣可以在文字檔內編輯參數,也可在遊戲執行時使用set指令修改參數。set指令的格式如下:
set <類別名稱> <屬性名稱> <數值>
例如要修改自訂的MyPawn類別的移動速度成400:
set MyPawn GroundSpeed 400
不過要注意用set指令修改的屬性預設值是儲存在冠著專案名稱的ini檔,而不是冠著Default的ini檔。

使用UnrealScript類別存放參數還有一個好處,就是可以利用屬性視窗編輯參數。物理資源編輯器PhAT就是利用PhATSimOptions類別存放參數,然後用屬性視窗來顯示。

範例


在UnrealScript中要使用ini檔的話,要用關鍵字config。在類別宣告裡config用來指定ini檔名,在變數宣告的config用來指示這個變數的預設值要放在ini檔。宣告為config的變數,其預設值就不能在defaultproperties區塊裡指定了。以下程式碼示範如何將參數放在一個UnrealScript類別內:
class MyOptions extends Object
    native
    hidecategories(Object)
    config(EditorUserSetings);
   

var() config bool bBoolOption;
var()        int  IntOption;
在程式中要讀取參數時,因為參數存放在類別預設值,所以就直接建立一個物件來存取:
UnrealScript
local MyOptions Options;
Options = new MyOptions;
C++
UMyOptions* Options = ConstructObject<UMyOptions>( UMyOptions::StaticClass() );

當要寫入參數設定時,直接呼叫SaveConfig()函式即可:
UnrealScript
Options.SaveConfig();
C++
Options->SaveConfig();

如果有些參數想要條件式寫入,可以不宣告為config變數,改用手動寫入。如上例中的IntOption屬性,想寫入時就呼叫函式:
GConfig->SetInt( TEXT("MyGame.MyOptions"), TEXT("IntOption"), Options->IntOption, GEditorUserSetingsIni );
GConfig->Flush( FALSE, GEditorUserSetingsIni );

沒有留言:

張貼留言