2012年4月28日 星期六

自訂Kismet行動

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

行動節點的基礎類別是SequenceAction,重要的屬性有:
  • ObjName [string]:編輯器顯示的名稱。
  • ObjCategory [string]:編輯器選單的分類名稱。在右鍵選單的New Action的子選單裡會看到同名的分類選單。指定新的分類名稱會產生新的分類選單。
  • HandlerName [name]:當此節點啟動時,呼叫指定名稱的UnrealScript函式。指定的函式要寫在節點作用的Actor類別上或操作該Actor的Controller類別上,而不是在節點類別上。若沒有指名,則以節點類別名稱自動產生,例如SeqAct_XXX會呼叫OnXXX函式。

2012年4月21日 星期六

在Visual Studio建立UnrealScript專案

nFringe是一套可以讓Visual Studio支援UnrealScript的軟體,它可以建立UnrealScript專案,支援IntelliSense和除錯器,有分要收費的商業授權和免費的非商業授權。非商業授權可以免費註冊並且使用所有腳本相關功能,對於不想花錢的UDK使用者而言,能免費使用中斷點和單步執行等除錯功能絕對是一大福音。

安裝


  • 首先安裝好Visual Studio 2008並且確認可以使用。
  • 下載nFringe,並且安裝。
  • 註冊nFringe。一定要註冊才能正常運作

建立UnrealScript專案


從主選單點選File>New>Project..,會出現一個對話窗:

2012年4月14日 星期六

UnrealScript起步

UnrealScript是UE所提供的腳本語言,透過它你可以控制角色移動、運鏡、播放動畫和特效、甚至畫出簡單的UI。UDK的使用者只需要文字編輯器就可編寫UnrealScript了。每次起動UDK時會自動偵測腳本是否有被修改,所以寫完UnrealScript要測試時只要重新起動UDK就可以了。本篇為UDK的使用者簡介如何入門UnrealScript。請注意本篇使用的UDK版本為2012年3月版。

撰寫腳本


安裝完UDK後,可以在Development\Src\UTGame\Classes路徑下找到副檔名為uc的腳本檔,在Src下的其他子目錄如果有Classes目錄裡面也有放uc檔。在先前提到的UTGame\Classes路徑下找到UTCheatManager.uc檔,然後用文字編輯器打開檔案,在尾端鍵入以下程式碼:

2012年4月8日 星期日

子原型

目前UDN上還沒有子原型(Sub-Archetype)的說明,因此在此簡單地介紹一下。

子原型指一個繼承另一個原型的原型。原本修改原型的屬性也會跟著修改所有實例的對應屬性,子原型也是一樣。修改母原型的屬性也會反應到子原型身上,當然也會反應到由子原型所建立的實例上。PhysicalMaterial的Parent屬性就有點類似子原型的功能。

使用者介面


其實UE一直都有支援子原型功能,只是沒有寫使用者介面讓開發者可以直接使用。直到2012年2月版的UDK才在內容瀏覽器的內容選單裡增加了建立子原型的選項。

2012年4月7日 星期六

自訂動畫元資料

UE提供讓開發者在動畫上附加額外自訂資料的功能,方法大致如下:
  • 擴充AnimMetaData類別撰寫自訂功能。
  • 開啟AnimSetViewer,找到要加資料的AnimSequence,然後在它的MetaData陣列新增自訂的元資料。

範例


以下程式碼示範如何自訂一個可以提早結束動畫的元資料:

2012年4月1日 星期日

取得socket或bone的位置

UE提供socket功能方便開發者指定一個相對於bone的位置。例如像手上拿著武器的時候,就可以將武器模型附著在人物模型的某個socket上。

而撰寫特效程式時,時常會需要取得骨架上的某個位置。其實可以只用一個name欄位來指定socket或bone,只要骨架上socket和bone的名稱不重覆就不會有問題。

不過UE沒有提供方便的函式直接取得socket或bone的位置,需要自行撰寫一個:

自訂聲音節點

UE的SoundCue提供混音、變調、衰減等多種音效功能,它可以讓開發者自訂節點來擴充新的功能。

聲音節點的基礎類別叫做SoundNode,它有一個陣列存放下一層子節點。多次播放同一個SoundCue並不會產生多份SoundNode來播放,所以像SoundNodeLooping這種需要額外記錄目前播放次數的情況,會把額外資料放在AudioComponent::SoundNodeData裡,它是一個位元陣列,由 AudioComponent::SoundNodeOffsetMap記錄不同SoundNode資料在該位元陣列的起始位置。為了方便寫碼,UE提供以下三個巨集:

自訂動畫節點

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

動畫節點的基礎類別叫做AnimNode,其他的動畫節點都會直接或間接繼承自此類別。它的子類別主要可分為:
  • 代表動畫的葉節點
  • 混合子節點動畫的中間節點
前者通常繼承AnimNodeSequence類別而來
後者通常繼承AnimNodeBlendBase類別(或其子孫)而來

Unreal的繪圖底層界面

UE提供一個跨平台的繪圖底層界面,叫做Render Hardware Interface,簡稱RHI。它是以全域函式的形式給子系統去呼叫,例如RHISetViewport()、RHISetDepthState()、RHISetRenderTarget()等。在RHI.h的#include "RHIMethods.h"那行宣告這些全域函式。

而這些RHI全域函式的定義形式分成StaticRHI和DynamicRHI兩種。差別在於這些函式是轉呼靜態成員函式還是虛擬函式,根據不同平台擇一使用。

Windows DynamicRHI
Mac DynamicRHI
XBox360 StaticRHI
PS3 StaticRHI
PS Vita StaticRHI
WiiU StaticRHI