2012年6月30日 星期六

自訂Kismet條件節點

Kismet可以讓開發者透過圖形界面編排遊戲腳本,例如當玩家碰觸開關時把門打開,或是進入門口時播放過場動畫。Kismet的基本結構是以各種不同功能的節點連接構成,節點可分為事件、行動、條件、變數。除了UE內建的功能外,開發者也可自行擴充需要的節點。在此篇簡單說明一下如何自訂條件節點。

條件節點的基礎類別是SequenceCondition,重要的屬性有:
  • ObjName [string]:編輯器顯示的名稱。
  • ObjCategory [string]:編輯器選單的分類。在右鍵選單的New Condition的子選單裡會看到同名的分類選單。指定新的分類名稱會產生新的分類選單。 
雖然SequenceCondition是條件節點的基礎類別,實際上它並沒有為條件節點增加什麼功能,它的父類別SequenceOp就已經提供了條件節點所需的功能。子類別必須覆寫Activated函式或Activated事件來輸出訊號。前者是是C++虛擬函式,要有原始碼授權才能覆載。UDK使用者可以使用Activated事件。

2012年6月17日 星期日

自訂UnrealScript迭代子

UnrealScript的迭代子(iterator)提供簡潔的foreach語法循序取得一個陣列中的所有元素。而且它不限只能用於陣列,開發者可以自訂迭代子取出任何列表的元素,即使這個列表實際上並不存在。在Actor.uc裡即可找到許多迭代子的宣告,例如:
native(307) final iterator function TouchingActors( class<Actor> BaseClass, out Actor OutActor );
迭代子宣告在一個原生UnrealScript類別裡,由C++實作,實際上是一個成員函式。要在UnrealScript中使用一個迭代子,需要透過foreach語法。下列程式碼示範如何使用一個迭代子:
function PrintTouchingActors()
{
    local Actor TouchedActor;
    foreach TouchingActors(class'Actor', TouchedActor)
    {
        `log(TouchedActor.Name);
    }
}

2012年6月9日 星期六

自訂UnrealScript運算子

UnrealScript提供自訂運算子的功能,可以不修改引擎原始碼而在自訂專案中添加新的運算子。運算子宣告在一個原生UnrealScript類別裡,由C++實作,實際上是一個成員函式。在Object.uc裡即可找到許多運算子的宣告,連最簡單的整數加法都有:
native(146) static final operator(20) int + ( int A, int B );
關鍵字native後面括弧裡面的數字是靜態查表索引,索引值不可重覆。靜態查表不限用於運算子,只要是原生函式都可使用。它的查詢速度比一般的動態查表快,通常是用在常用的函式。關鍵字operator用來宣告運算子,後面括弧裡面的數字代表運算優先權,用來建立先乘除後加減的規則。優先權越高的越先運算。

UnrealScript運算子只能使用固定組合的字符,以下列出其中幾個可用的字符以及它們在程式碼中的名稱:
+ Add
- Subtract
* Multiply
/ Divide
+= AddEqual
-= SubtractEqual
*= MultiplyEqual
/= DivideEqual
++ AddAdd
-- SubtractSubtract
== EqualEqual

2012年6月3日 星期日

動態列表

動態列表(Dynamic List)是一個連UE本身也尚未使用的功能,UDN上也沒有相關的網頁,在此簡單的說明一下。它用於屬性視窗,原本字串或名稱屬性的預設控制項是打字輸入,使用動態列表的話,可以把控制項改成是自訂選項的下拉式清單。使用這個功能需要作三個設定:
  • 想要動態列表的字串或名稱屬性要加上元資料設定。
  • 在DefaultEditor.ini裡設定自訂屬性控制項為UnrealEd.PropertyInputCombo
  • 覆寫UObject的GetDynamicListValues()函式以自訂選項。第一個參數即為元資料設定的值。第二個參數為要傳回的選項。