虛幻4隨筆4 從工程開始

前文說到UE3開始,虛幻就使用了UnrealBuildTool(如下簡稱UBT)來編譯和生成代碼。html

爲何這麼作而不是使用VS是很好理解的:由於VS跨平臺會比較麻煩。像虛幻這樣體量的工程,單爲工程作一次VS配置就基本是一天的時間編輯器

並且UE4還不像UE3那樣就十幾個工程,把全部uproject都看作工程的話,得幾十了。依賴關係複雜度幾何增加,用VS的工具去維護……並且要維護各個平臺和配置……再加上維護完後Mac、Linux還得維護一遍……分佈式

可是爲何不使用成熟的CMAKE呢,私覺得多是由於UBT裏有一系列錯綜複雜的規則,用CMAKE製做出來,即使可讀性OK,調試也比較麻煩。並且CMAKE對引擎使用者提出了必定的要求,而UBT則相對簡單——只要你不糾結它如何實現。工具

官網的這篇文章詳細解釋了爲何要作一個Build Tool出來:ui

https://docs.unrealengine.com/latest/INT/Programming/UnrealBuildSystem/ProjectFileGenerator/index.htmlspa

What are the advantages of generating project files?命令行

 

能夠先看看UBT的基本規則:調試

https://docs.unrealengine.com/latest/INT/Programming/UnrealBuildSystem/index.htmlhtm

 

目前說來,虛幻的全部代碼集中在下面幾個文件夾裏:blog

<Root>的Source,這個文件夾裏主要是引擎代碼。

其中:

Source/Runtime裏主要是引擎的核心代碼。

Source/Developer裏彷佛主要是一些工具工程。

Source/Editor裏是編輯器相關代碼。

Source/Programs裏是引擎使用中須要用到的工具。好比UBT、UnrealHeaderTool、Swarm(分佈式光照計算系統)等等。

Source/ThirdParty裏是各類第三方庫。

<Root>的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這些宏,抄幾個就能找到感受,或者用編輯器的類生成功能也可。

看起來,虛幻引擎發佈時(不是經過編譯生成,而是經過Launcher下載的那種),這些Classes文件是隨引擎發佈的,方便不具有全代碼的Mod愛好者和BluePrint開發者們來製做遊戲。

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的流程,明天繼續。

相關文章
相關標籤/搜索