目标
一般情况下,Actor保存于关卡文件中。
但是,如果将Actor的 packaging mode 设置为 External:
则此Actor就会存储在另一个文件而非关卡文件中。
本篇目标是:
- 观察此功能的基础行为
- 观察外部文件的路径名规则
“在外部存储Actor”功能的基础行为
对于一般的Actor(默认packaging mode 为 Internal)。修改此Actor会标脏关卡,Save All时会提示保存此关卡:
而对于 packaging mode 设置为 External 的Actor,修改此Actor不会标脏关卡,Save All时可见其文件并非关卡文件,而是另一个文件:
这个文件在UE编辑器的ContentBrowser里看不到,但可以在文件夹中找到:
Actor存储的外部文件路径名规则
当 packaging mode 设置为 External 时,引擎会创建对应的package保存Actor。创建package的代码在:Source\Runtime\Engine\Private\Level.cpp 中的 ULevel::CreateActorPackage 函数中。可以在设置External 的时候触发这里的断点:
而其中 ActorPackageName
即为外部文件的路径名。
观察这里的逻辑:
首先,它与Actor的GUID有关。这里是使用 Base36Encoded
的格式将GUID转换为了字符串。 Base36Encoded
格式的逻辑可在 FGuid::ToString 函数中找到:
逻辑类似于将GUID的四个32位的数字视为一个2^128的数字,然后将其转换为36进制的数字。(因为10个数字+26个字母等于36)。
而最后得到的文件的路径名按照顺序由以下部分拼接而成:
- Content路径 /
- 关卡路径 /
- GUID转字符串的第1、2个字符 /
- GUID转字符串的第3、4个字符 /
- GUID转字符串的第5到末尾的字符