2012年8月30日 星期四

自訂變形節點

UE的動畫樹(AnimTree)提供動畫混合、變形混合、骨架控制三種功能。它可以讓開發者自訂節點來擴充新的功能,在此篇簡單說明一下如何自訂變形節點。

變形節點的基礎類別叫做MorphNodeBase,其他的變形節點都會直接或間接繼承自此類別。它定義數個C++虛擬函式以供子類別擴充,以下列出重要的成員:
  • NodeName [name] :使用者可自行定義的節點名稱。可以呼叫SkeletalMeshComponent的FindMorphNode()函式找到指名的變形節點。
  • InitMorphNode(SkeletalMeshComponent) :動畫樹會呼叫此函式初始化變形節點。
  • GetNodes(TArray<UMorphNodeBase*>& OutNodes):列出此節點和其下所有節點。
  • GetActiveMorphs(TArray<FActiveMorph>& OutMorphs):列出以此節點算起子樹的所有節點裡,作用中的變形目標和其權重。

2012年8月18日 星期六

自訂編輯器引擎

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

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