[UE4] 認識UE4專案目錄架構與GamePlay Module

在建完專案之後,在專案底下看到下面幾個Folder跟檔案,見Figure 1.4.1:

· .vs:為visual studio產生的meta data。

  • Binaries:用來存放UE4專案建置出來的東西(build artifact),如dll、exe跟debug用的pdb……等等。
  • Config:用來存放專案的各種設置資訊,一開始在裡面可以看到四個檔案: DefaultEditor.ini、DefaultEngine.ini、 DefaultGame.ini、DefaultInput.ini。從這裡我們可以看到UE4會根據配置的功能存放在不同的.ini標案中。基本上裡面大部份的配置我們都能夠在Unreal Editor進行變更,因此不太需要對這裡面的內容進行手動的編輯。
  • Content:存放著專案所使用的uasset跟umap,這二種副檔名為現階段引擎(4.15)內部處理素材所使用的格式。基本上引擎內部會有機制將你所匯入的檔案(如png、jpg)先轉換成uasset,然後在之後建置專案的時候再根據平台轉換成該平台的格式。例如:android的ETC1、ETC2、iOS的PVR。
  • Intermediate:存放著引擎編譯過程所產生的各種中間產物。
  • Saved:放log跟專案預設的寫出檔案路徑。
  • Source:跟我們專案相關的cpp code。
  • ${PROJECT_NAME}.sln:Visual Studio的專案檔。
  • ${PROJECT_NAME}.uproject:UE4專案的描述檔,裡面記錄著這個專案所使用的引擎版本,裡面分成了多少模組(Module)以及用了哪些Plugin。
  • ${PROJECT_NAME}.VC.db:為Visual Studio的IntelliSense database

image

Figure 1.4.1 以下三項為構成UE4專案的基本核心:一、${PROJECT_NAME}.uproject:描述著我們的UE4專案相關資訊。二、Source資料夾:存放著我們的程式碼。三、Content資料夾:存放著專案所使用的asset。

在進到Source之後,首先會看到二個.Target.cs檔,見Figure 1.4.2,其主要的用途是用來描述我們所產出的執行檔是Editor、Game還是Dedicated Server與整個執行檔的編譯設定,大多時候我們都不需要對這個檔案進行編輯。

image

Figure 1.4.2 Source資料夾下面包含Target.cs描述檔,用來描述最後要產生的執行檔需要包含哪些Module以及相關環境資訊。

由於UE4是以「Module」的概念對程式碼的功能進行組織,在編譯過程中會去找到${PROJECT_NAME}.uproject底下所有的*.Build.cs當成該Module的根目錄,而每個找到的Module到最後都必須要產生或跟一個外部的library連接。(.dll或.lib)

在我們的初始專案資料夾下面,見Figure 1.4.3,我們可以看這個定義Module的檔案:

  • ${PROJECT_NAME}.Build.cs:這個檔案主要用來描述這個Module跟其他Module的相依關係、其相依專案include檔所存放的相對路徑與其他各種編譯設定。預設做完建立初始專案的動作後在Binaries\Win64下面可以找到對應的UE4Editor-${PROJECT_NAME}.dll,見Figure 1.4.4。

image

Figure 1.4.3 Build.cs主要用來描述Module之間的相依性關係與相關的編譯設定,副檔名為.cs表示其所使用的語言是C#。

image

Figure 1.4.4 UE4Editor-${PROJECT_NAME}.dll為編譯Module的Editor版本所產生的dll,Standalone版本則會去掉UE4Editor。

  • ${PROJECT_NAME}.h、${PROJECT_NAME}.cpp:h檔裡面就只是呼叫#include “Engine.h”,可以猜到這裡面是引擎的一些常用的標頭檔;而在cpp中我們則圖以看到一段定義:

IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, HorizonClassProject, “HorizonClassProject” )。

其中,參數一為引擎幫我們實作好的Module類別實作,參數二為Module的名字,而參數三則是遊戲的名字。

在UE4中引擎有去特意區分這個Module裡面的程式碼是不是屬於跟Gameplay相關的,實作這個Macro的用意是在告訴引擎說:我裡面都是跟Gameplay相關的遊戲邏輯,請進行相應的處理。例如:UE4 Editor中的HotReload [https://wiki.unrealengine.com/Hot_Reload]機制就是使用這個資訊來決定要不要將新編譯出來的dll動態載入。

  • ${PROJECT_NAME}.h、${PROJECT_NAME}.cpp:GameMode為第一個跟Gameplay相關的類別,主要是用來定義跟遊戲相關的規則。這部份我們留待後面的章節介紹。

Leave a Reply

Your email address will not be published. Required fields are marked *