2012年7月31日 星期二

自訂遊戲引擎

UE在執行遊戲前會先建立一個型別為GameEngine的遊戲引擎物件,然後將它的位址存放在全域指標GEngine裡。UE提供讓開發者自訂遊戲引擎的功能,只要繼承GameEngine自訂引擎類別,然後在DefaultEngine.ini裡指定自訂的類別即可:
[Engine.Engine]
GameEngine=MyGame.MyGameEngine 
GameEngine類別提供許多虛擬函式可供覆載,以下列出重要的函式:
  • Init():引擎初始化。
  • PreExit():關閉引擎前會呼叫這個函式。
  • Tick( DeltaSeconds ):更新遊戲時會呼叫這個函式。
  • Exec( Command, OutputDevice=GLog ):執行控制台指令。

2012年7月16日 星期一

優化AnimTrail

AnimTrail讓粒子跟隨動作拉出拖曳效果,可以用來製作武器揮動的特效。它需要指定一個資料型別為AnimTrail的粒子系統,並且在動作資料AnimSequence加上AnimNotify_Trails來指定特效的起始和結束時間。在AnimNotify_Trails上還要指定三個跟隨骨架移動的socket名稱,用來定位粒子。在編輯AnimNotify_Trails時,就會以指定的更新頻率取樣socket位置並且記錄下來,以供播放特效時內插粒子多邊形的位置。

在使用AnimTrail時,我發現幾個不盡理想的地方。我把其中兩個的問題和解法記錄在此,以供參考。

已建粒子系統元件的判斷方法

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()函式以自訂選項。第一個參數即為元資料設定的值。第二個參數為要傳回的選項。