GetWrappedLaunchDir()

启动时的工作目录,因为马上要把工作目录改为下面所说的exe所在目录,所以会先把当前的缓存起来

FPlatformProcess::BaseDir()

这个是最基本的,就是当前exe文件所在目录。

也是最早被计算的一个目录,因为是所有依赖项的根结点,凡是要把相对路径转成全路径的,都是基于这个目录

可以用【-BaseFromWorkingDir】来把BaseDir指向当前工作目录

FPaths::EngineDir()

引擎目录,用来定位很多擎内置资源。

默认的值是../../../Engine/,而基准目录就是上面的BaseDir

因为在发布后的目录结构里,游戏目录和引擎目录是平级的顶层子目录,exe文件会放在【游戏目录/Binaries/Win64/】下面,退三层后刚好找到Engine

但是,这个目录可以用【GForeignEngineDir】来重载,前提是按默认的方法没找到引擎目录(在引擎目录下没有Binaries子目录),同时在GForeignEngineDir下有Binaries

这也是开发阶段的默认配置,因为此时游戏还未打包,游戏目录与引擎目录不在一起,这时就只能通过GForeignEngineDir来定位引擎了

而此时GForeignEngineDir的实际值是什么呢?其实它是通过编译时传入的宏来定义的:

#if PLATFORM_DESKTOP
#ifdef UE_ENGINE_DIRECTORY
#define IMPLEMENT_FOREIGN_ENGINE_DIR() const TCHAR *GForeignEngineDir = TEXT( PREPROCESSOR_TO_STRING(UE_ENGINE_DIRECTORY) );
#else
#define IMPLEMENT_FOREIGN_ENGINE_DIR() const TCHAR *GForeignEngineDir = nullptr;
#endif
#else
#define IMPLEMENT_FOREIGN_ENGINE_DIR()
#endif

其中UE_ENGINE_DIRECTORY在UEBuildTarget.cs里有设定:

string EnginePath = Utils.CleanDirectorySeparators(Utils.MakePathRelativeTo(ProjectFileGenerator.EngineRelativePath, Path.GetDirectoryName(OutputFilePath)), '/');
if (EnginePath.EndsWith("/") == false)
{
EnginePath += "/";
}
GlobalCompileEnvironment.Config.Definitions.Add("UE_ENGINE_DIRECTORY=" + EnginePath);

而IMPLEMENT_FOREIGN_ENGINE_DIR这个宏的调用出现在UE4Game.cpp里:

#if IS_MONOLITHIC
PER_MODULE_BOILERPLATE
bool GIsGameAgnosticExe = true;
TCHAR GInternalGameName[] = TEXT("");
IMPLEMENT_DEBUGGAME()
IMPLEMENT_FOREIGN_ENGINE_DIR()
#endif

FPaths::RootDir()

根目录,但其实是从引擎目录反推出来的,也就是找到【/Engine】这一段去掉后上一层

但是如果引擎目录里没有/Engine这一段怎么办(上面说过可以重载为一个自定义的)?

FPaths::GameDir()

游戏目录,默认是与引擎目录同级的,以游戏名命名的目录,但是也可以通过【OverrideGameDir】重载

本来是很简单,可是看代码推导过程极其复杂,而且结果也好难理解,明明已经得到最精简的绝对路径了,可最后返回的竟然还是一个充满../的相对路径,还绕来绕去好几层

+ FPaths::GameContentDir returned L"../../../UnrealEngine/../hz413/Content/" FString &

这几个比较“顶级”的目录,各有各的计算逻辑。

除此之外,其它的一些目录就比较简单了,基本上都是在EngineDir和GameDir里加上相应名字的子目录,

如GameContentDir、GameConfigDir、GameSavedDir、GameIntermediateDir等等,每一种也有一个Engine的对应版。

ue4 FPaths各目录的更多相关文章

  1. ue4 svn备份目录

    http://blog.csdn.net/sh15285118586/article/details/55737480 UE4工程文件备份目录有:Config.Content.Plugins.Sour ...

  2. 修改UE4的deriveddatacache目录位置,扩大C盘空间

    按照默认安装目录,UE4会装在C盘 C:\Program Files\Epic Games\UE_4.15 DerivedDataCache缓存目录在 C:\Users\你的用户名\AppData\L ...

  3. 《Inside UE4》目录

    <Inside UE4>目录 InsideUE4 UE4无疑是非常优秀的世界上最顶尖的引擎之一,性能和效果都非常出众,编辑器工作流也非常的出色,更难得宝贵的是完全的开源让我们有机会去从中吸 ...

  4. 【UE4 C++】简单获取名称、状态、时间、帧数、路径与FPaths

    基于UKismetSystemLibrary 获取各类名称 // Returns the actual object name. UFUNCTION(BlueprintPure, Category = ...

  5. 如何使用的Ue4自带的SQLiteSupport

    在UE4.6版本加入的模块.可以让开发者使用SQLite数据库.SQlite是个轻量型的本地数据库. 我下面就来介绍一下如何使用这个模块. 第一步:下载SQLite源代码以及SQLite GUI管理工 ...

  6. UE4使用第三方库读写xml文件

    原文链接:http://gad.qq.com/article/detail/7181031 本文首发腾讯GAD开发者平台,未经允许,不得转载 在游戏开发过程中,读写xml几乎已经成为不可或缺的功能,但 ...

  7. 详解UE4静态库与动态库的导入与使用

    转自:http://blog.csdn.net/u012999985/article/details/71554628 一.基本内容概述   最近做项目时经常看到build.cs文件,就想研究一下UE ...

  8. UE4使用Dll

    Part1. 创建和编译Dll VS中创建Visual C++ > Win32 Console Application 工程模板,选择Dll,并勾上”Empty Project”. 在Solut ...

  9. UE4 Pak 相关知识总结

    转载自:https://arcecho.github.io/2017/07/02/UE4-Pak-%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86%E6%80%BB%E7%BB ...

随机推荐

  1. What is Agile

    Agile is a set of Values, Principles and Practices, that will change your behavior to will create gr ...

  2. python常用库

    本文由 伯乐在线 - 艾凌风 翻译,Namco 校稿.未经许可,禁止转载!英文出处:vinta.欢迎加入翻译组. Awesome Python ,这又是一个 Awesome XXX 系列的资源整理,由 ...

  3. R12_专题知识总结提炼-AR模块

    应收模块简介 应收模块是用来为企业提供应收款管理的模块. 当企业销售一笔商品或者发生其他影响收入和现金的业务的时候,需要在应收模块记账. 本文档以R12为例,11i可参考,只针对简单业务情况考虑,将应 ...

  4. springmvc 中controller与jsp传值

    参考:springmvc 中controller与jsp传值 springMVC:将controller中数据传递到jsp页面 jsp中,死活拿不到controller中的变量. 花了半天,网上列出各 ...

  5. python基础知识---正则

    一.python正则简介 python的re模块,让python能够支持perl正则 perl正则的字符集("."  "[abc]"   "(abc) ...

  6. GPL 和BSD和Apache

    开源许可证GPL.BSD.MIT.Mozilla.Apache和LGPL的区别<ignore_js_op> 以下是上述协议的简单介绍:BSD开源协议BSD开源协议是一个给于使用者很大自由的 ...

  7. JS中的get & set

    之前在看<Javascript 高级程序设计>一书中遇到过getter和setter,但因当时难于理解,且觉得用处较小,没有细看,今日突然遇到了一种使用get&set读写对象属性的 ...

  8. css 隐藏超长的文本!!!

    overflow:hidden; text-overflow:ellipsis;white-space: nowrap; 一起使用!

  9. 循序渐进Python3(十二) --0--  web之框架

    web框架的本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #coding:utf ...

  10. Java Classloader详解

    一.Java中的class加载机制有以下三个特性: 1.全盘负责制  “全盘负责”是指当一个ClassLoader装载一个类时,除非显示地使用另一个ClassLoader,则该类所依赖及引用的类也由这 ...