虛幻4隨筆4 從工程開始

2021-06-21 20:59:37 字數 2220 閱讀 3654



前文說到ue3開始,虛幻就使用了unrealbuildtool(以下簡稱ubt)來編譯和生成**。

為什麼這麼做而不是使用vs是很好理解的:因為vs跨平台會比較麻煩。像虛幻這樣體量的工程,單為工程做一次vs配置就基本是一天的時間

而且ue4還不像ue3那樣就十幾個工程,把所有uproject都看做工程的話,得幾十了。依賴關係複雜度幾何增長,用vs的工具去維護……而且要維護各個平台和配置……再加上維護完後mac、linux還得維護一遍……

但是為什麼不使用成熟的cmake呢,私以為可能是因為ubt裡有一系列錯綜複雜的規則,用cmake製作出來,即便可讀性ok,除錯也比較麻煩。而且cmake對引擎使用者提出了一定的要求,而ubt則相對簡單——只要你不糾結它如何實現。

what are the advantages of generating project files?

可以先看看ubt的基本規則:

目前說來,虛幻的所有**集中在下面幾個資料夾裡:

的source,這個資料夾裡主要是引擎**。

其中:source/runtime裡主要是引擎的核心**。

source/developer裡似乎主要是一些工具工程。

source/programs裡是引擎使用中需要用到的工具。比如ubt、unrealheadertool、swarm(分布式光照計算系統)等等。

source/thirdparty裡是各種第三方庫。

的plugin,這個資料夾裡有各式各樣的plugin實現。特殊的是plugin的組織中需要多乙個uplugin,可能是plugin下可能會有一些資源什麼的吧。我們後面再來看uplugin。

《工程專案》的source,如果是**工程的話。

ubt目前只認這幾個資料夾,也就是說,如果你要為引擎擴充套件功能,您只能在這些資料夾裡建立自己的工程。這一點是在ubt裡寫死的,有**的可以關注一下ubt工程的findallrulessourcefiles這個方法。

在這些資料夾裡,您可以搜尋到大量的*.build.cs檔案,這些build.cs就是虛幻的工程組織核心,基本上,每個build檔案都可以被視為乙個工程檔案,而build檔案所在的資料夾可以被視為此工程的根目錄。接下來,我們不妨稱這些擁有build.cs的資料夾為工程。ubt一開始會先去找所有的build.cs,把它們放在一起生成乙個臨時的dll。然後基於它們逐個進行一系列的**分析工作,最後呼叫命令列進行編譯和連線過程。

對於每個工程而言,**一般都散落在下面幾個資料夾:

classes:如果你在工程根目錄下寫了個classes,就相當於告訴ubt這些檔案是要用unrealheadertool來生成執行時反射資訊的。所以,這個資料夾裡頭檔案的寫法必須符合可反射類的寫法規範。

還記得虛幻的哪些類是可反射的嗎?對了,所有uobject的派生類包括aactor的派生類。具體是否有所驗證還沒看,不過最好是按照這個節奏來。

規範上無非主要就是ustruct、uclass這些巨集,抄幾個就能找到感覺,或者用編輯器的類生成功能也可。

public:公共標頭檔案,跟classes一樣隨著引擎發布而發布,所以這裡一般都是些比較開放的介面,比如模組入口、功能核心介面什麼的。基本上這些介面沒有廢話,很清晰,跟實現相關的細節隱藏得非常好。與classes相同,如果你的工程裡有public,那麼裡面的.h就會被當作public來。

private:這個資料夾似乎不是虛幻定死的,也就是似乎可以不用private的名字,或者多來幾個資料夾什麼的。除了uht中有一段**與之有一定關聯之外,ubt裡是完全沒有跟這個有關的東西。它裡面基本上就是各種實現**,以及要在實現間共享的標頭檔案。你也可以建立其他類似的資料夾,只需要build.cs裡寫上相應的資料夾名即可:

此外還有需要注意的地方是source根目錄下的target.cs檔案,target的最終目標一般都是可執行檔案,可以說,target是整個生成期的入口,生成會首先從找到target開始,如果沒有target或者找不到,就會直接失敗。

此外,需要注意的是,target.cs裡面寫的類的類名,必須是target.cs的檔名加target,例如:sample.target.cs,其類名必須是sampletarget。ubt的gettargettypeandrulesinstance方法裡印證了這一點。

ubt裡面還是有不少限定用法的,target就是其中之一,虛幻是乙個比較強調命名的引擎,改名有很多麻煩,最好是能夠一步到位。

今天抽空看了看文件,大概跟了跟ubt的流程,明天繼續。

虛幻4隨筆4 從工程開始

前文說到ue3開始,虛幻就使用了unrealbuildtool 以下簡稱ubt 來編譯和生成 為什麼這麼做而不是使用vs是很好理解的 因為vs跨平台會比較麻煩。像虛幻這樣體量的工程,單為工程做一次vs配置就基本是一天的時間 而且ue4還不像ue3那樣就十幾個工程,把所有uproject都看做工程的話...

虛幻4 反射

今天講了虛幻4的反射機制。例子 uclass class testcpp api atestcppgamemode public agamemode generated body 部分,做了一大堆一大堆事情。定義在這個檔案中 先看他的定義 define body macro combine inne...

虛幻4 使用指令碼編譯自己的工程

工程檔案 engine source programs automationtool automationtool mono.sln public static void build buildcommand command,projectparams params,int workingcl 1,...