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 <類別名稱> <屬性名稱> <數值>

2012年10月10日 星期三

在C++中存取UnrealScript物件屬性

在C++中要存取UnrealScript物件的屬性時,一般的做法是宣告此類別為原生類別,這樣在編譯UnrealScript時會自動產生對應的C++類別定義,就可讓C++認得此類別的成員。不過如果是非原生類別,難道就沒有其他方法可以存取其屬性嗎?答案是當然可以,不然用C++實作的UnrealScript虛擬機就寫不出來了。

由UnrealScript定義的類別必須繼承自Object,它在C++中的對應型別為UObject。由於Object這個名稱容易混淆,所以接下來皆以UObject稱之。每個UObject都會記得自己當初建立時的UnrealScript類別,在UnrealScript中可以用Object:Class屬性取得,在C++中可以用UObject::GetClass()函式取得。它在C++中是一個型別為UClass的物件,記錄著對應UnrealScript類別的相關資訊,可以從這裡得知這個類別包括屬性在內的所有成員。

取得屬性


以下程式碼展示如何在一個UObject中取得其所有屬性:
for( UProperty* Property = GetClass()->PropertyLink; Property; Property = Property->PropertyLinkNext )
{
    ...
}
UnrealScript屬性在C++中的對應型別稱為UProperty,它是一個基底類別,依據屬性的型別有各自的具象類別: