我要分享的是 unreal engine 4 的建置方式:
這是unreal團隊抓 include 跟 import 的 regex
以下這兩段是c#
static Regex CPPHeaderRegex = new Regex (
"(([ \t]*#[ \t]*include[ \t]*[<\"](?<HeaderFile>[^\">]*)[\">][^\n]*\n*)|
([^\n]*\n*))*" , RegexOptions .Compiled | RegexOptions .Singleline |
RegexOptions . ExplicitCapture );
static Regex MMHeaderRegex = new Regex(
"(([ \t]*#[ \t]*import[ \t]*[<\"](?<HeaderFile>[^\">]*)[\">][^\n]*\n*)|
([^\n]*\n*))*" , RegexOptions .Compiled | RegexOptions .Singleline |
RegexOptions . ExplicitCapture );
unreal engine 4 使用 UnrealBuildTool(UBT)
這一個他們自己用c#寫的工具
來建置所有專案,一開始我覺得很怪,那他們要怎麼編譯
以前的跨平台工具像cmake,都需要自己寫一個build rules
那他們呢?
寫了大量的 cs 檔來描述如何編譯
module(obj) 用 xxx.Build.cs
exe dll lib a 用 xxx.Target.cs
使用自定義的 DynamicCompilation 包裝內建的函數
使用dotnet v4 來編譯
把指定或預設的source path裡面所有的cs檔抓出來編譯
編譯完後再讀進來看有沒有要編譯的模組
unreal 團隊把編譯規則寫在cs檔中
而 linux, mac 則用 mono 的 dotnet 來編譯執行
還自己寫解 include 檔相依性的程式
自己合成編譯指令呼叫 cl.exe 編譯
mac上當然會轉換成對應的參數
unreal 團隊為了開發一個遊戲引擎
寫了一個類似 cmake, bjam 的 c#版 make 工具
寫了一個跨平台的UI Framework
寫了錯誤回報程式
SymbolDebugger
自製pak工具
建立了跨平台的c#動態呼叫機制
......
真的獲益良多。
就算沒有要往遊戲界發展,
光是看他的code就有在吸收高手功力的感覺。
由於他們自定了自己的make工具,
所以可以自定義的選擇自己需要的cpp,
再編譯連結,可以從他們的介紹影片了解這個流程。
遊戲引擎=>開新專案=>遊戲引擎產生c++ class程式碼(.h .cpp)
=>遊戲引擎呼叫cl.exe link.exe生成dll=>dynamic link 進編輯器執行
在 gamedesign 看到的 Why C++ for Unreal 4?
http://ppt.cc/LqAH
在這個project中,感受到了他們的精神,
不過他們的成員都很喜歡使用新東西,
程式碼在windows下要 VS 2013 才編的過。