热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

eclipse工程目录结构_UE4C++基础教程工程目录结构

简介介绍UE4工程目录结构[1]以及常用的目录操作接口[2]。UE4将目录分为:引擎目录项目目录其中一些子目录是两个都有的,称之为通用目录,
cb073a95f998c44091bc47ef5adcf909.png

简介

介绍UE4工程目录结构[1]以及常用的目录操作接口[2]。UE4将目录分为:

  • 引擎目录
  • 项目目录

其中一些子目录是两个都有的,称之为通用目录,有一些目录是引擎特有的。当我们从github

https://github.com/EpicGames/UnrealEngine.git

上检出工程到本地时,起始目录叫做根目录。此外,开发过程中,为了方便起见,资源之间的引用是通过沙盒路径(虚拟路径)来进行标识的。

根目录

b231412f7e3c3621a440720a97bd097a.png
图 1-1 根目录

根目录说明如下:

  • Engine 引擎目录,包含构成引擎的所有源代码、内容等。
  • Samples 样例资源。
  • Templates 样例工程模块,创建新项目时可用的项目模板集合。
  • Setup.bat 只需运行一次。
    • 拉取引擎的三方依赖
    • 安装引擎运行环境 - 执行EngineExtrasRedisten-usUE4PrereqSetup_x64.exe
    • 引擎注册 - 执行UnrealVersionSelector.exe,让uproject可以被windows识别。
  • GenerateProjectFiles.bat 用于生成引擎vs工程文件。

Setup 和 GenerateProjectFiles还有对应的 .sh 文件,作用与.bat相同,用于在Mac平台下是生成从xcode工程文件。.command是Mac平台下的一种快捷方式,可以支持双击打开,而不在命令行模式执行。

通用目录

一些子目录是在引擎和游戏项目目录之间通用的:

  • Binaries - 包含可执行文件或编译期间创建的其他文件。
  • Build - 包含构建引擎或游戏所需的文件,包括创建特定于平台的构建版所需的文件。
  • Config - 配置文件,用于设置用来控制引擎行为的值。项目Config文件中设置的值会覆盖 EngineConfig 目录中设置的值。
  • Content - 保存引擎或游戏的内容,包括资源包和贴图。
  • DerivedDataCache - 包含加载时针对引用内容生成的派生数据文件。引用内容没有相应的缓存文件会导致加载时间显著延长。
  • Intermediate - 包含构建引擎或游戏时生成的临时文件。在游戏目录中,着色器存储在Intermediate目录中。
  • Saved - 包含自动保存、配置(.ini)文件和日志文件。此外,EngineSaved目录还包含崩溃日志、硬件信息和Swarm选项与数据。
  • Source - 包含引擎或游戏的所有源文件,包括引擎源代码、工具和游戏类等。
    • Engine - Engine目录中的源文件组织结构如下:
      • Developer - 编辑器和引擎共同使用的文件。
      • Editor - 仅供编辑器使用的文件。
      • Programs - 引擎或编辑器使用的外部工具。
      • Runtime - 仅供引擎使用的文件。
    • Game - 游戏项目源码,建议按模块的方式进行组织。

源码模块组织方式

游戏项目目录中的源文件按模块分组,一个模块一个目录。每个模块包含以下内容:

  • Classes - 包含所有项目头(.h)文件。
  • Private - 包含所有 .cpp 文件,包括游戏类实现文件和模块实现文件。
  • Public - 包含模块标头文件。

引擎Source模块

ba115699351111b3f81a468d61dde430.png
图 1-2 EngineSource

引擎Source目录下分为以下目录:

  • Developer - Editor&Programs会使用,但不能是Games
  • Editor - 只被Editor使用
  • Programs - 独立的Applitcations或者工具类
  • Runtime - Editor,Games,Programs都会使用
  • ThirdParty - 第三方库

模块依赖原则

  • Runtime 模块不能依赖 Editor或者Developer中的模块
  • Plug-in 模块不能依赖其他Plug-ins
afe7a122f80c45f4ea0c61956c3646e1.png
不同类型应用程序的模块使用样例

基础模块(新手)

  • Core - Fundamental core types & functions 基础数据类型和函数
  • CoreUObject - UObject实现
  • Engine - Game类以及引擎核心框架
  • OnlineSubsystem - Online & social networking features
  • Slate - Widget library & high-level UI features

其他几个有趣模块(进阶)

  • DesktopPlatform – Useful APIs for Windows, Mac & Linux
  • DetailCustomizations – Editor’s Details panel customizations
  • Launch – Main loop classes & functions
  • Messaging – Message passing sub-system
  • Sockets – Network socket implementations
  • Settings – Editor & Project Settings API
  • SlateCore – Fundamental UI functionality
  • TargetPlatform – Platform abstraction layer
  • UMG – Unreal Motion Graphics implementation
  • UnrealEd – Unreal Editor main frame & features
  • Analytics – Collects usage statistics from Editor & games
  • AssetRegistry – Database for assets in Unreal Editor
  • GameLiveStreaming – Twitch Streaming
  • HeadMountedDisplay – HMD Support API (Oculus, etc.)
  • JsonUtilities & XmlParser – Handle Json & XML files
  • SourceControl – API for custom source control providers

特定于引擎的目录

3b011966f4319c80db6899ad03a3c45d.png
图 1-3 Engine引擎目录

部分子目录特定于Engine目录。

  • Documentation - 包含引擎文档,包括源文件和发布的文件。
    • HTML - 发布的HTML文档文件。
    • Source - 源markdown文档文件。
  • Extras - 其他帮助和实用程序文件。
  • Plugins - 包含引擎中使用的插件。
  • Programs - 包含UE4根目录中存储的项目以及其他虚幻程序(如UnrealFrontend和UnrealHeaderTool)的配置文件和日志文件。
  • Shaders - 保存引擎的着色器源文件(.usf)。

游戏项目目录

ff41f13706842421a5450377457bec3b.png
图 1-4 游戏项目目录
  • Binaries - 包含可执行文件或编译期间创建的其他文件。
  • Config - 游戏的默认项目设置。
  • Content - 包含引擎或游戏的内容,包括资源包和贴图。
  • Plugins - 包含项目中使用的插件。
  • Intermediate - 包含UnrealBuildTool生成的文件,如Visual Studio项目文件。这些文件可以删除并重新构建。
  • Saved - 包含引擎生成的文件,如配置文件和日志。这些文件可以删除并重新构建。
  • Source - 包含游戏模块对象类文件。
  • EasyUE4.sln 项目vs工程文件。
  • EasyUE4.uproject 项目文件。
  • EasyUE4.vs.db vs分析源码后的数据缓存,可以理解为ctags文件。

Plugin插件目录

8285f2a40ff6c7db59b3ad656a229389.png
图 1-5 Plugin插件目录
  • Binaries - 包含可执行文件或编译期间创建的其他文件。
  • Content - 包含游戏内用到的插件资源目录。
  • Intermediate - 包含UnrealBuildTool生成的文件,如Visual Studio项目文件。这些文件可以删除并重新构建。
  • Resources - 插件额外资源目录,如插件图标。
  • ThirdParty - 插件依赖的三方库目录。
  • ScriptPlugin.uplugin 插件文件,包含这个文件的目录会被UE4识别为一个插件目录。

沙盒路径

当我们在编辑器状态下浏览资源时,显示的资源路径,通常是沙盒路径

3b426080d481ba48d74ac20cf277b744.png
图 1-6 沙盒路径

/Game/ThirdPerson/Meshes/LeftArm_StaticMesh
/Engine/Maps/Entry

其中 /Game 是一个虚拟路径,实际表示的是项目的 FPaths::ProjectContentDir() 。/Engine 也是一个虚拟路径,实际路径是引擎的 FPaths::EngineContentDir()。更多虚拟路径可以查阅源码[3]

K:UnrealEngineEngineSourceRuntimeCoreUObjectPrivateMiscPackageName.cpp

类 FLongPackagePathsSingleton 的定义。

内容浏览器视图选项勾选显示引擎内容操作如下所示:

95dca18a1e3fe326f4ea6a34a734bb2a.png
图 1-7 内容浏览器显示引擎内容
0be9c58514d0720f527a1088c8f3ee60.png
图 1-8 内容浏览器切换至引擎目录

路径获取和操作API

#include "BlankProgram.h"#include "RequiredProgramMainCPPInclude.h"
#include "Misc/Paths.h"DEFINE_LOG_CATEGORY_STATIC(LogBlankProgram, Log, All);
IMPLEMENT_APPLICATION(BlankProgram, "BlankProgram");INT32_MAIN_INT32_ARGC_TCHAR_ARGV()
{
GEngineLoop.PreInit(ArgC, ArgV);
UE_LOG(LogBlankProgram, Display, TEXT("Hello World"));// 常用路径获取接口
UE_LOG(LogBlankProgram, Display, TEXT("EngineDir: %s"), *FPaths::EngineDir());
UE_LOG(LogBlankProgram, Display, TEXT("EngineSavedDir: %s"), *FPaths::EngineSavedDir());
UE_LOG(LogBlankProgram, Display, TEXT("EngineIntermediateDir: %s"), *FPaths::EngineIntermediateDir());
UE_LOG(LogBlankProgram, Display, TEXT("ProjectDir: %s"), *FPaths::ProjectDir());
UE_LOG(LogBlankProgram, Display, TEXT("ProjectContentDir: %s"), *FPaths::ProjectContentDir());
UE_LOG(LogBlankProgram, Display, TEXT("ProjectConfigDir: %s"), *FPaths::ProjectConfigDir());
UE_LOG(LogBlankProgram, Display, TEXT("ProjectSavedDir: %s"), *FPaths::ProjectSavedDir());
UE_LOG(LogBlankProgram, Display, TEXT("ProjectIntermediateDir: %s"), *FPaths::ProjectIntermediateDir());FString TestFilename(TEXT("ParentDirectory/Directory/FileName.extion"));
FString Extension = FPaths::GetExtension(TestFilename);
FString BaseFilename = FPaths::GetBaseFilename(TestFilename);
FString CleanFilename = FPaths::GetCleanFilename(TestFilename);
FString Directory = FPaths::GetPath(TestFilename);
bool bFileExists = FPaths::FileExists(TestFilename);
bool bDirectoryExists = FPaths::DirectoryExists(Directory);UE_LOG(LogBlankProgram, Display, TEXT("TestFilename: %s"), *TestFilename);
// 获取文件扩展名
UE_LOG(LogBlankProgram, Display, TEXT("Extension: %s"), *Extension);
// 获取文件名,不带扩展名
UE_LOG(LogBlankProgram, Display, TEXT("BaseFilename: %s"), *BaseFilename);
// 获取文件名,带扩展名
UE_LOG(LogBlankProgram, Display, TEXT("CleanFilename: %s"), *CleanFilename);
// 获取路径文件夹,去除CleanFilename后的路径
UE_LOG(LogBlankProgram, Display, TEXT("Directory: %s"), *Directory);
// 检测文件是否存在
UE_LOG(LogBlankProgram, Display, TEXT("FileExists: %s"), bFileExists ? TEXT("True") : TEXT("False"));
// 检测文件夹是否存在
UE_LOG(LogBlankProgram, Display, TEXT("DirectoryExists: %s"), bDirectoryExists ? TEXT("True") : TEXT("False"));// 路径拼接
FString NewFilePath = FPaths::Combine(Directory, TEXT("NewFilePath.txt"));
// 简便写法
FString NewFilePathEasy = Directory / TEXT("NewFilePath.txt");
// 相对路径转换为绝对路径
FString FullPath = FPaths::ConvertRelativePathToFull(FPaths::EngineDir());
UE_LOG(LogBlankProgram, Display, TEXT("NewFilePath: %s"), *NewFilePath);
UE_LOG(LogBlankProgram, Display, TEXT("NewFilePathEasy: %s"), *NewFilePathEasy);
UE_LOG(LogBlankProgram, Display, TEXT("FullPath: %s"), *FullPath);return 0;
}

输出

LogBlankProgram: Display: Hello World
LogBlankProgram: Display: EngineDir: ../../../Engine/
LogBlankProgram: Display: EngineSavedDir: ../../../Engine/Saved/
LogBlankProgram: Display: EngineIntermediateDir: ../../../Engine/Intermediate/
LogBlankProgram: Display: ProjectDir: ../../../Engine/Programs/BlankProgram/
LogBlankProgram: Display: ProjectContentDir: ../../../Engine/Programs/BlankProgram/Content/
LogBlankProgram: Display: ProjectConfigDir: ../../../Engine/Programs/BlankProgram/Config/
LogBlankProgram: Display: ProjectSavedDir: ../../../Engine/Programs/BlankProgram/Saved/
LogBlankProgram: Display: ProjectIntermediateDir: ../../../Engine/Programs/BlankProgram/Intermediate/
LogBlankProgram: Display: TestFilename: ParentDirectory/Directory/FileName.extion
LogBlankProgram: Display: Extension: extion
LogBlankProgram: Display: BaseFilename: FileName
LogBlankProgram: Display: CleanFilename: FileName.extion
LogBlankProgram: Display: Directory: ParentDirectory/Directory
LogBlankProgram: Display: FileExists: False
LogBlankProgram: Display: DirectoryExists: False
LogBlankProgram: Display: NewFilePath: ParentDirectory/Directory/NewFilePath.txt
LogBlankProgram: Display: NewFilePathEasy: ParentDirectory/Directory/NewFilePath.txt
LogBlankProgram: Display: FullPath: K:/UnrealEngine/Engine/

参考

  1. ^目录结构 https://docs.unrealengine.com/zh-CN/Engine/Basics/DirectoryStructure/index.html
  2. ^FPaths https://docs.unrealengine.com/en-US/API/Runtime/Core/Misc/FPaths/index.html
  3. ^FPackageName https://docs.unrealengine.com/en-US/API/Runtime/CoreUObject/Misc/FPackageName/index.html



推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
author-avatar
书友40416624
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有