UE5 地图模组制作入门 (Dark Waters DLC)
Ready or Not 目前由 非官方 的模组制作者提供模组支持。多亏了他们的付出,现在我们的模组能实现官方地图 80%~90% 的功能。 当然做地图也不是件简单事。
这篇指南会引导你一步一步学习制作 Ready Or Not 地图模组所需的基础步骤和知识,并且将教你制作属于你的第一张地图,然后放入游戏中运行。
如果你遇到麻烦需要帮助,不要犹豫,请加入我们的 RoN Custom Maps Discord!
RoN 地图制作流程
Section titled “RoN 地图制作流程”目前我们提供一个模版项目,里面包括了所有你需要用到的游戏功能/蓝图:Installation。
在关卡设计部分,绝大多数工作都是在虚幻引擎内完成的。你也可以用任何(合理的)方式来制作你的关卡。
请记住:我们目前没办法在虚幻引擎中直接测试游玩关卡,而且只能在游戏中测试。为了在游戏中测试你的关卡,需要把你的关卡打包成一个可以部署的
.PAK
文件。更多信息:烘焙 & 打包 & 安装
如果你想知道给 Ready or Not 制作地图的完整流程是什么样的,我录制了我制作 Hell Comes to the Hills 从头到尾的开发视频。
YouTube 播放列表: Ready or Not: Custom Map Development by Delta
- 下载并安装 Epic 启动器.。
- 打开启动器,点击左边栏的
虚幻引擎
,然后点击上方工具栏的库
。 - 在
引擎版本
中点击版本号旁边的+
号,点击下拉菜单并选择5.3.2
,然后安装。
- 从 NexusMods 下载模版,然后把它解压到一个你喜欢的地方: Ready Or Not Community Mapping Framework
- 打开解压后的文件夹里面的
ReadyOrNot.uproject
。
如果你打开内容侧滑菜单(Ctrl + 空格),然后前往 Content > Mods > Template > Levels
,就能看到这里有3个关卡:
- RoN_ExampleMap
- 顾名思义,这是一个示例地图,里面展示了可以运用的游戏中的各种功能,包括:玩家生成,门,AI,光照,QSM 和环境音效。这个关卡是用来 学习和参考的,你可以在里面了解到一些功能怎么运作的,又该如何实现。
- RoN_ExampleMap_MissionSelect
- 一个非常小的关卡,只有在游戏中警局里选择关卡时会展示。
- RoN_Template
- 这是一个模版地图,可以在烘焙完后用在游戏里。如果你要制作新地图,可以把它当作一个模版来用。但是在接下来的内容中我们让然会完全从零开始讲解, 以便你更好理解一些地图的必要条件。
你的第一张地图
Section titled “你的第一张地图”在我们继续之前,有必要了解一下虚幻引擎项目的文件夹结构。
虚幻引擎主要采用了一个叫 Content
的文件夹作为内容所在地,里面包含了所有游戏内容和地图。(其实也就是你在外面看到的
...\ReadyOrNot\Content
)。
当你安装一个 .PAK
文件时,实际上是在往 Content
里面添加或者覆盖资产。在这里做的任何修改都有很有可能会对安装的其他模组产生影响。
尤其是当我们很多人都在使用相同的 Marketplace 或者 Quixel/Megascans 资产的时候,这种情况尤为多见。
**更重要的是,**这种情况还可能导致游戏所需的核心蓝图产生冲突!
为了防止我们无意中触动到别人的资产而导致游戏冲突崩溃,你需要:
- 在
Mods
文件夹下以你的名字新建一个自己的目录,然后把你的所有资产都放进去(包括第三方/Marketplace/Quixel/Megascans)。 - 把 Mods > Template >
Blueprints
文件夹拖动到你在步骤1中新建的文件夹中 - 在内容浏览器中,右键
Mods
文件夹,然后选择 “修复重定向器” - 在步骤1新建的文件夹中,创建一个空文件夹,命名为 “ModLevelData”
- 之后我们会把 Mission Select 和 Level Select 数据放在这里面
这个 Mods
文件夹的结构现在应该是这样的:
文件夹Content/
文件夹Mods/
文件夹ModLevelData/
- …
文件夹Template/
- …
文件夹Tools/
- …
文件夹YourUserName/ 你的文件夹
文件夹Blueprints/
- …
文件夹ModLevelData/
- …
必要的游戏组件
Section titled “必要的游戏组件”-
在继续之前:请一定确保你阅读了前面有关文件夹结构的内容。在你完成上述步骤前不要继续。
-
按照之前有关文件夹结构的操作,在内容浏览器里前往你的
...\Mod\YourUsername
文件夹,然后新建一个关卡并打开。- 你给关卡的命名将会展示在游戏里
- 但不要把它命名为 “House”,因为这是一个受限的命名空间,从而不会出现在游戏里。
-
打开之后,在工具栏点击蓝图按钮,然后点击
打开关卡蓝图
-
在
类设置
中,打开细节面板,将父类
更改为ReadyOrNotLevelScript
-
点击
编译
,然后就可以保存并关闭窗口了 -
在工具栏里选择 窗口 > 放置 Actor
-
在新打开的 放置 Actor 窗口里,选择 几何体,
然后拖放几个盒体来制作地板和几面墙,作为游玩的区域。
- 如果漆黑一片,请按
Alt + 3
切换成无光照模式
- 如果漆黑一片,请按
-
在 放置 Actor 窗口里,搜索并放置以下这些 Actor:
- 1个 玩家出生点
- 将会作为玩家和小队的出生点
- 导航网格体边界体积
- AI 需要这个才能运作。这个体积覆盖到的地方就是 AI 能行走的范围
- Roster Scenario Spawner
- 这个 Actor 用来生成任务目标等
- 1个 玩家出生点
-
在内容浏览器中,导航到
...\Content\YourUserName\Blueprints
,并拖动放置以下这些蓝图:- 2个 BP_AISpawn_Managed
- 作为 AI 的生成点。我们稍后就会回过头来详细设置这个东西。
- 另外,还要把它们从地面上移大约 50uu 高,因为如果与地板有重叠则 AI 不会生成。
- 技术上来讲,AI 不是必须有的。但是如果没有 AI 地图会在进入时就自动结束,也就没法测试游玩了。
- BP_SpawnManager_V3
- 管理 AI 生成
- BP_CoverGen
- AI 需要这个才能在交火时真正动起来,在地图里面移动。
- 2个 BP_AISpawn_Managed
到目前你的关卡还没有任何光照。现在我们来设置一些基本的东西,以便在游玩测试时能看到物体。请添加下列 Actor:
-
在工具栏选择 窗口 > 环境光照混合器,然后在新的窗口依次点击:
- 创建天空光照
- 在 大纲 面板里选择它,并将可移动性设置为
静态
- 在 大纲 面板里选择它,并将可移动性设置为
- 创建大气光源 (我们的平行光)
- 在 大纲 面板选择
DirectionalLight
,并将可移动性设置为固定
- 保持选中,找到 级联阴影贴图 并将
动态阴影距离静态光照
设置为4000
,然后将动态阴影级联数字
设置为1
- 这些值会最终呈现在游戏里
- 在 大纲 面板选择
- 创建天空大气
- 创建高度雾
- 创建天空光照
-
在 放置 Actor 窗口中搜索并拖动放置:
- Lightmass Importance Volume 并调整大小覆盖整个可游玩区域
- 1个 Sphere Reflection Probe 覆盖整个地图
- 如果没有反射捕获,游戏中的模型/武器会看起来很扁平并且光照错误。
AI Spawn
Section titled “AI Spawn”我们还未配置已经已经放置的2个 BP_AISpawns_Managed
蓝图,因此现在来将其设置为一个平民和一个嫌疑人:
- 选择一个 AISpawn,然后在 AISpawn > Spawn Array 下点击
+
按钮 - 展开新的数组元素,同时展开其下的
Spawned AI
- 在这里选择要生成哪种 AI
- 将
Data Table
更改为AIDataTable_Gas
,并将Row Name
设置为Civilian_Gas_Woman_01
- 选择另外一个 AISpawn,重复相同的步骤,但是把
Row Name
更改成Suspect_01_Shotgun
- 检查这两个 AISpawns 的
Spawn AI
下的Spawn with Tags
是否已经设置为 “group1”Spawn with Tags
用于告诉BP_SpawnManager_V3
属于哪个组,并允许其控制每个组具体要如何生成 AI。- 默认情况下应该是 “group1”
- 另外,检查每一个 AISpawn 在 Actor > Tags 底下是否有一个项 “Managed”
- 如果没有这个 tag,Spawn Manager 将无法找到 AISpawn,进而无法生成 AI。
- 默认情况下应该是 “Managed”
现在你的 AISpawn 的细节应该看起来和这个差不多:
Spawn Manager
Section titled “Spawn Manager”为了生成 AI,BP_SpawnManager_V3 是必需的。默认情况下它控制标签 “group1” 的 AISpawn。你可以在 Spawn Manager 的 默认 > AISpawn Configs 找到这一项。
你可以自由地添加和更改这些 tag,以便满足你的关卡需求。有几个注意事项:
-
你可以放置多个有不同 AIDataTable 和/或 Row Values 的 AISpawn,即使他们有相同的 tag 也完全没问题。(毕竟我们刚刚就是这么干的)
- 示例: 注意这2个 AISpawn 虽然分别是
Civilian_Gas_Woman_01
&Suspect_01_Shotgun
,但是它们都用同一个 tag “group1” - 借助这个方法,你可以让 AI 适配地图中不同的场景
- 示例: 注意这2个 AISpawn 虽然分别是
-
如果你想要固定某个标签组生成的 AI 数量,请把
MinimumAmount
&MaximumAmount
设置成同个数值。 -
如果你想要在一个标签组内生成随机数量的 AI,请分别调整
MinimumAmount
&MaximumAmount
的数值,并 打开RandomizeWithinRange
-
至此,剩下的部分可以全部保持默认
在你的地图里放置和编辑门其实很容易。
- 在内容浏览器中,导航到
...\Content\Template\Blueprints
,并放置一个BP_Door_Spawner
- 你可以更改门的样式种类,在 默认 > Door Type 中从
Row Name
下拉菜单中选择想要的门的样式。
构建 / 烘焙
Section titled “构建 / 烘焙”如果你一直照着上面的步骤做到这里,那么你大概率还没构建地图。构建地图可以修复几何体和体积、光照和反射以及路径的更改。 只要你想更新/预览地图的修改,就需要构建地图。
要构建地图,请在工具栏的 构建
菜单中选择要构建的内容:
- 地图检查
- 检查地图中是否存在错误
- 通常进行任何其它构建之后都会进行检查,但是你也可以手动进行一次
- 构建几何体
- 这将在编辑后重新构建笔刷和体积
- 最好在进行其它构建之前先构建几何体
- 构建路径
- 这会更新所有导航网格体,最好在构建几何体之后再构建路径。
- 仅构建光照
- 顾名思义,这将构建地图的光照。同时整个构建的 90% 的时间都将花费在这上面。
- 构建反射捕获
- 字面意思。如果你构建了光照,通常也会自动构建反射捕获。但如果你想节省时间、只更新反射,也可以使用这个。
- 构建地形
- 字面意思
- 预计算静态可视性
- 注:在 UE5.3.2 中,预计算静态可视性(PCV)算是坏了,你没办法在编辑器里直接预览,也没办法阻止报错。
- 你可以在 项目设置 > 引擎设置 > 渲染 > 剔除 中关闭错误信息:禁用
对无预计算静态可视性进行警告
. - 你仍然可以构建 PCV,数据也会保存下来,但是将无法验证它。你需要在世界设置中启用
预计算静态可视性
才能构建。 - 通常会在构建光照后再构建 PCV。
我目前的一般步骤是:构建几何体 > 构建路径 > 构建光照。一旦构建完成,你需要点击 文件 > 保存所有
烘焙是一个把项目转换为可在其他机器上部署的内容的过程。我们只想烘焙那些对地图来说必要的内容,并且尽可能地减小文件大小。我们需要先进行如下设置:
-
前往
编辑 > 项目设置
,在侧边栏选择项目 > 打包
-
在
打包
下禁用共享材质着色器代码
-
在
打包 > 打包版本中要包括的地图列表
下 应该可以看到 2 个条目,展示了 RoN_ExampleMap 和 RoN_Template 的路径- 如果你没看到
打包版本中要包括的地图列表
,可能需要展开高级
类别。
- 如果你没看到
-
现在删掉这 2 个条目。
-
按
+
创建一个条目,在项目里选择你的地图的路径 -
再按
+
创建一个条目,但是这次选择你的地图的 BuildData 路径,它应该和你的地图在同个目录下 -
你无需再更改其他设置,现在应该看起来类似这样:
-
在继续之前确保你保存所有
-
在工具栏选择
平台 > Windows > 烘焙内容
- 初次烘焙可能因为需要编译所有着色器而花费更长时间,请耐心等候。
-
一旦烘焙完成,在
项目设置 > 打包
中重新启用共享材质着色器代码
打包 & 安装你的地图
Section titled “打包 & 安装你的地图”打包会将已烘焙的内容变成单个压缩后的文件,这样我们就可以放进游戏里并且分发给别人。
-
新建一个文件夹作为你进行打包工作的位置,命名无所谓但是我使用
Paking
。- 我也不会把这个文件夹放在项目文件夹里面
-
在这个文件夹里创建一个新的文件夹,用这种格式命名:
pakchunk99-YOURMAPNAME
pakchunk
后面的99
表示的是 PAK 文件的加载顺序。对于地图,我们一律使用99
。- 把
YOURMAPNAME
替换成你的地图名字。这个不会在游戏里展示出来,但是可以帮助别人辨认你的地图/模组。
-
前往
C:\Program Files\Epic Games\UE_5.3\Engine\Binaries\Win64
然后在里面创建一个.bat
文件,写入以下内容:packaging.bat @setlocal ENABLEDELAYEDEXPANSION@if "%~1"=="" goto skip@setlocal enableextensions@pushd %~1(for /R %%f in (*) do @set "filePath=%%f" & set "relativePath=!filePath:%~1=!" & @echo "%%f" "../../../ReadyOrNot!relativePath!")>"%~dp0/filelist.txt"@pushd %~dp0::-compresslevel=4 for Normal, -compresslevel=-4 for uncompressed hyperfast paking.\UnrealPak.exe "%~1.pak" -create=filelist.txt -compress -compressionformats=Oodle -compressmethod=Kraken -compresslevel=4@popd@pause:skip -
给这个 .bat 文件创建一个快捷方式,然后把快捷方式移动到你在步骤 1 创建的工作文件夹
-
导航到你的项目文件夹然后打开:
...\Saved\Cooked\Windows\ReadyOrNot
,只复制Content
文件夹 -
把
Content
文件夹粘贴到你的pakchunk99-YOURMAPNAME
文件夹里 -
把
pakchunk99-YOURMAPNAME
文件夹拖动到你的 .bat 快捷方式上,一个命令行窗口会弹出来,告诉你是否完成了。 如果成功了,在你的工作文件夹下应该会有一个新文件叫做pakchunk99-YOURMAPNAME.pak
-
复制
pakchunk99-YOURMAPNAME.pak
到...\Common\Ready Or Not\ReadyOrNot\Content\Paks
-
你的地图现在应该就会出现在游戏里了
这是一个工作文件夹的示例:
测试你的地图
Section titled “测试你的地图”测试地图最简单的方式就是在打开游戏,然后在任务选择里选择你的地图。 如果能正常运作,第一次启动你的地图时会花几秒钟来生成世界数据,然后就能进地图了。
地图无法加载的常见问题
Section titled “地图无法加载的常见问题”请确保你完成了如下步骤:
- 使用最新版本的模板项目,链接在 这篇指南的上面
- 你遵循了 上文提到的 打包方法
- 只包含了来自
...\Saved\Cooked\WindowsNoEditor\ReadyOrNot
的Content
文件夹 - 禁用
共享材质着色器代码
- 你放置了 必要的游戏组件 里提到的所有 Actor
如果你的地图仍然无法运行,你可能想在 Mapping Discord 上寻求帮助,链接在本指南上面
在游玩测试之后更新地图
Section titled “在游玩测试之后更新地图”恭喜你!你完成了第一次 RoN 地图的版本迭代!
还剩下一些最终的重要步骤,当你想要测试更新而重新烘焙和打包你的文件的时候要注意:
- 在你重新烘焙地图过后,建议你删除原有的
pakchunk99-YOURMAPNAME
文件夹下的Content
文件夹,而不是直接覆盖它。- 直接覆盖会留下没用的文件和设置,可能会破坏你的游玩测试。
- 在你启动游戏之前,先去
%USERPROFILE%\AppData\Local\ReadyOrNot\Saved\SaveGames
删除 WorldGen.sav 文件,文件名字应该 和你的地图一样(例如,Hell Comes to the Hills 的看起来类似Hell_Comes_to_the_Hills_WorldGen_40173.sav
)- 这个步骤非常重要! 每次游戏初次加载你的地图时,它会生成世界数据并保存下来,以便加快下次的游玩。但是,游戏并不知道你的地图被更新了, 所以你很可能会在新地图上用了过期的数据,从而导致一些 bug 的产生。
- WorldGen 包含了一些信息,比如门的位置和连接,房间的大小和布局,聚集点,导航,隐藏的点位和掩体,还有一些我们目前不知道的东西。 所以最好在每次更新迭代后删除原有的旧数据。
使用 Ready or Not 的游戏资产和内容
Section titled “使用 Ready or Not 的游戏资产和内容”FModel 安装
Section titled “FModel 安装”下载 FModel:https://fmodel.app/
下载映射文件:映射文件
- 如果是初次使用,点击
ADD UNDETECTED GAME
下的箭头,选择...\common\Ready Or Not\ReadyOrNot
目录 并点击+
按钮。 - 选择 UE 版本为
GAME_UE5_3
,然后按 OK - 去设置里找到 General > Advanced,启用
Local Mapping File
,将Mapping File Path
设置为刚下载的映射文件 (这可以让你在 FModel 里直接预览已烘焙内容)。- 可选:在 Settings > Models > Mesh Format,更改为
glTF 2.0 (binary)
,以便导出静态网格体 - 留意你的导出目录位置
- 可选:在 Settings > Models > Mesh Format,更改为
- 在 Archives 标签页,选择所有游戏的 .pak 文件,点击 Load
- 在 Folders 标签页,导航到
Content
文件夹,右键选择Export Folder's Packages Raw Data (.uasset)
。 这会保存所有的已烘焙内容,并且将花费一点时间。
一旦完成,进入下一步。
将已烘焙内容复制到你的项目
Section titled “将已烘焙内容复制到你的项目”- 继续之前先关闭示例项目。
- 导航到 FModel 导出已烘焙资产的地方,然后复制
Content
文件夹(如果磁盘空间有限就剪切)到你项目的 Content 文件夹。- 这包含了着色器缓存。
- **如果提示,不要覆盖任何文件!**跳过这些文件就好。如果你覆盖了,你就得从头开始创建一个新的示例项目了。
游戏的所有资产现在应该都可以使用了,包括材质,贴图和粒子效果!
可选:导入 FMOD 事件
Section titled “可选:导入 FMOD 事件”如果你想听到 QSM 或者环境声,遵循如下步骤:
- 导航到
..\common\Ready Or Not\ReadyOrNot\Content\FMOD
,复制Desktop
文件夹。 - 导航到你的项目的
...\Content\FMOD
文件夹,然后把Desktop
文件夹粘贴在这里
接下来做什么?
Section titled “接下来做什么?”我们还有别的指南,涵盖了一些地图制作更深入的方面,如下:
- Setting up Audio and Working with QSM
- Setting up Music Events for Levels
- Mission Select (ModLevelData) - 敬请期待
- Map Optimization - 敬请期待