2013年1月30日 星期三

自訂屬性控制項

UEd的屬性視窗會根據屬性的型別使用不同的控制項,也提供開發者自訂屬性控制項的擴充功能。屬性控制項的基礎類別是WxItemPropertyControl,自訂屬性控制項必須直接或間接繼承此類別。因為UEd會利用wxWidget的RTTI機制建立控制項,開發者需要使用wxWidget提供的類別宣告和定義巨集註冊自訂類別。還要在DefaultEditor.ini檔設定屬性和自訂控制項的綁定,UEd才會使用自訂控制項取代預設的控制項。

2013年1月9日 星期三

自訂UnrealScript休眠函式

UnrealScript的休眠函式(latent function)提供開發者一個簡便的寫法等待某個條件完成。可以在Actor.uc裡找到其中兩個內建的休眠函式:
// Latent functions.
native(256) final latent function Sleep( float Seconds );
native(261) final latent function FinishAnim( AnimNodeSequence SeqNode, optional bool bFinishOnBlendOut );
休眠函式只能在類別的狀態(state)中呼叫,它會暫停目前狀態內的程式執行,直到指定的條件達成。下例中的GotoState()會等Sleep(1)完成後才執行:
class MyPawn extends GamePawn;

state Idle
{
    event BeginState(Name PreviousStateName)
    {
        Sleep(1);
        GotoState('');
    }
}

2012年12月30日 星期日

在C++中存取UnrealScript函式

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

由UnrealScript定義的函式必須放在一個繼承自Object的類別內,UnrealScript並沒有支援非成員函式。Object類別在C++中的對應型別為UObject。由於Object這個名稱容易混淆,所以接下來 皆以UObject稱之。每個UObject都會記得自己所屬類別以及相關成員,包括函式在內。可以用UObject::FindFunction()函式取得對應的UFunction物件,並且用ProcesEvent()函式執行UFunction。

UnrealScript類別的狀態(state)內也可定義函式,會遮蔽同名的非狀態函式。FindFunction()預設會先找目前作用中的狀態是否有同名函式,然後再找父狀態,都沒有才找同名的非狀態函式。如果不想要狀態函式的話可以讓第二個參數為TRUE。

使用ProcessEvent()函式時要注意如果要執行的UFunction有參數或傳回值,第二個參數必須傳入一塊代表參數和傳回值的區塊,用來傳遞給UFunction實際的參數並且傳回執行結果。例如若要在C++執行以下UnrealScript函式:
function int foo(int i);

2012年12月22日 星期六

自訂樹狀結構編輯器

許多Unreal資源都以樹狀或圖(一種以相連的結點構成的數學模型)表示,例如AnimTree和Kismet。為了方便撰寫這類編輯器,UEd提供一組以LinkedObj為名的類別,在此翻譯為鏈結物件。

鏈結物件以方形繪出,左右下三邊可能會有一個方塊或三角形代表接點。鏈結物件有四種接點:輸入、輸出、變數和事件。輸入在左,輸出在右,變數在左下,事件在右下。請參考下圖:
以下列出鏈結物件相關的類別:

2012年11月30日 星期五

自訂預覽視窗

先前提過如何撰寫資源編輯器的主視窗,接著本篇來介紹如何撰寫預覽視窗。許多資源編輯器都有預覽視窗,例如AnimSetViewer和AnimTreeEditor。UEd提供FEditorLevelViewportClient類別方便開發者撰寫預覽畫面,以及FPreviewScene類別方便管理預覽場景,接下來說明一下幾個相關的類別。

FEditorLevelViewportClient


在一般的資源編輯器中,預覽畫面大多是繼承FEditorLevelViewportClient類別加以改寫,它代表用來看預覽畫面的一個視埠,可說是撰寫預覽視窗時的主要框架。其實它不限用於預覽,Matinee編輯器的軌道視窗也是用它寫的。FEditorLevelViewportClient類別並不包括視窗的部分,所以需要把它放進一個視窗。它以虛擬函式的方式提供輸入、繪製、更新的擴充界面。以下列出幾個主要的成員:

2012年11月27日 星期二

自訂資源編輯器

自訂新的資源時,通常也需要在UEd裡撰寫相應的編輯器。就好比AnimSet有AnimSetViewer,AnimTree有AnimTreeEditor。UEd的GUI是用wxWidgets寫的,這是一個第三方跨平台的GUI函式庫。

為了結合UE系統以及寫碼方便,UEd繼承wxWidgets的類別進行擴充。原本wxWidgets的類別前綴小寫的wx,UEd繼承後變成首字大寫的Wx,所以可以依此區分是否為原wxWidget內建的型別。

以下列出幾個撰寫編輯器主視窗時常用的類別。當然編輯器不是只有主視窗而已,只是篇幅已經太長,其他像顯示3D物件的部份就另外再寫一篇好了。