2013年9月19日 星期四

自訂UnrealScript常數

UnrealScript跟其他程式語言一樣,有提供常數這個語言構件,本篇來介紹一下要怎麼擴充自訂的常數型別。

在UnrealScript中,常數實際上是用一個編成位元組碼(byte code)的指令代表。要自訂新的常數,大致上需要以下的步驟:
  • 找一個還未使用的位元組碼當作自訂的常數指令碼
  • 如果這個常數需要使用新的名稱,可以在UnNames.h註冊新的名字
  • 修改UByteCodeSerializer使得新增的指令可以正確地序列化
  • 撰寫對應的函式並且註冊到GNatives
  • 修改FTokenBase使解析器可以記錄新的常數型別
  • 修改FScriptCompiler讓編譯器認得新的指令

2013年8月31日 星期六

修正UnrealScript不能使用out bool array的問題

在UnrealScript中不允許使用宣告使用out bool參數的函式,例如:
function TestOutBool(out bool Bool);
編譯器會回報"Booleans may not be out parameters"。

這是因為布林變數實作上其實只是個bitfield,在編譯時同一個類別的布林屬性會湊在一起,儘量減少總共需要的大小。然而如果把上述宣告為原生函式,要產生C++標頭檔時,會遇到無法在C++中表示reference to bitfield的問題。雖然可以為這種情況作特殊處理,不過其實只要改為宣告為out byte就可以解決了。

然而宣告使用out array<bool>參數的函式會遇到編譯器回報同樣的錯誤:
function TestOutBoolArray(out array<bool> Array);

2013年7月29日 星期一

自訂UnrealScript指令

UDN花了許多篇幅解釋UnrealScript底層的運作,不過卻沒提如何自訂新的指令。本篇將透過一個簡單的範例說明如何擴充UnrealScript的指令。

UnrealScript並未提供擴充機制,讓開發者可以在自己的專案裡撰寫程式碼自訂新的指令。雖然增加擴充機制不會太難,主要是讓FScriptCompiler和UByteCodeSerializer可以subclassing,不過由於不是這次的主題,所以本例中就直接修改底層的程式碼。

要自訂新的指令,大致上需要以下的步驟:
  • 找一個還未使用的位元碼(byte code)當作自訂指令碼
  • 如果這個指令需要使用一個新的名稱,可以在UnNames.h註冊一個新的名字
  • 修改UByteCodeSerializer使得新增的指令可以正確地序列化。
  • 撰寫對應的函式並且註冊到GNatives
  • 修改FScriptCompiler讓編譯器認得新的指令

2013年6月9日 星期日

優化Kismet節點AttachToEvent

當在Kismet中設置事件節點時,會需要設定事件的發起者。對於事先放置在場景中的Actor,可以先選取Actor再建立事件,就會自動設定好發起者。然而對於動態產生的Actor,由於無法在編輯時直接參照,就會需要使用AttachToEvent節點來動態設定發起者。

這個節點會在每次觸發時產生事件複本掛到發起者的事件列表下,因為它可以將一個事件掛上多個發起者,如果不複製事件節點,多個發起者將共用同一個事件實例導致per instance data出錯。然而如果不曉得這個特性,將可能導致不必用的複製動作。實際上任何可能對同一個Actor重覆觸發的AttachToEvent都會導致重覆複製的事件實例,它們在條件成立時也會造成多重觸發,這通常不會是想要的結果。

接下來示範一下要怎麼修改AttachToEvent來避免重覆複製。我並不想去動引擎的原始碼,所以另外自訂一個事件叫BindEvent:

2013年5月26日 星期日

原生屬性定義語法

當你需要在UnrealScript類別中定義非UnrealScript型別的欄位時,就會需要使用原生屬性語法,當然你只能在原生類別中定義原生屬性。在此所謂的原生即指C++,也就是說可以使用C++型別來定義屬性。當然因為畢竟UnrealScript還是認不得這些型別,所以不能在UnrealScript中去呼叫這些原生屬性的C++函式,通常是透過原生函式來操作。

原生屬性定義大致上是利用大括號指定C++型別:
var native pointer property_name{ pointee_type };
先來看最簡單的例子:
var native pointer          pv;
上面pv的C++型別其實就是void*。
也可以在屬性名稱右邊加個大括號指定C++型別。例如:
var native pointer          pfile{FILE};
上面pfile的C++型別就會是FILE*。
另外pointer也可和array一起使用:

2013年4月22日 星期一

自訂按鍵綁定格式

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

 範例


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