2013年4月22日 星期一

自訂按鍵綁定格式

UE的按鍵綁定功能可以在ini檔中指定按鍵會觸發的命令,開發者可以在UnrealScript中撰寫exec function,再設定好按鍵綁定即可在遊戲中使用,相當方便。按鍵綁定主要分成按鈕和類比軸兩種,各自有不同的設定格式,詳情可以參考UDN。如果想要自訂新的格式,可以改寫PlayerInput的Exec。

 範例


以下程式碼示範如何自訂一個可以取得按住時間的按鍵綁定格式:

2013年3月27日 星期三

自訂八分樹

在計算機繪圖學中,八分樹是一個常用來加速查詢場景中物件的一種資料結構。UE本身就擁有數個用途不同的八分樹,除了PrimitiveComponent用的八分樹,其他大都利用TOctree類別模板來定義:
template<typename ElementType, typename OctreeSemantics>
class TOctree;
ElementType可以視為跟STL容器的value type是一樣的東西,至於OctreeSemantics則是用來設定八分樹的參數,或是提供八分樹類別操作ElementType物件的方法。其實就是所謂的traits。

OctreeSemantics需要提供的成員如下:
  • MaxElementsPerLeaf:每個葉節點的最大能容納的元素。當新增元素會超過此上限時,會分割葉節點。
  • MaxNodeDepth:最大樹深。
  • GetBoundingBox:傳回元素的邊界盒。
  • SetElementId:TOctree會給予元素一個ID。移除元素時會用到這個ID。

2013年2月28日 星期四

自訂運算子符號

先前有提過如何自訂運算子,如果想進一步自訂UnrealScript沒有支援的運算子符號時,那該怎麼做呢?雖然UnrealScript沒有提供自訂運算子符號的功能,不過其實只要稍微修改一下解析運算子符號的程式碼就可以了。例如如果想要增加一個目前UnrealScript沒有支援的運算子&=:
   
native static final operator int &= ( out int A, int B );
只要修改一下FScriptCompiler的GetToken()函式,增加辨識&=符號即可。

2013年2月25日 星期一

Unreal的通用combo box對話窗

當撰寫編輯器,需要讓使用者先選擇一個選項再進行後續步驟時,可以使用UEd提供WxDlgGenericComboEntry類別,叫出一個combo box對話窗。例如AnimSetViewer選取LOD和bone時,都是利用WxDlgGenericComboEntry來達成。

TArray<FString> Options;
// Add option strings
Options.AddItem( TEXT("Option1") );
Options.AddItem( TEXT("Option2") );
Options.AddItem( TEXT("Option3") );

WxDlgGenericComboEntry Dialog;

if( Dialog.ShowModal( TEXT("MyTitle"), TEXT("MyCaption"), Options, 0, TRUE ) == wxID_OK )
{
    ...
}

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('');
    }
}