跳转到内容

UE5 地图模组制作入门 (Dark Waters DLC)

原文信息

Getting Started with Ready or Not Mapping in UE5

发布于 2024年8月8日 · 更新于 2024年9月13日

作者:Delta

Ready or Not 目前由 非官方 的模组制作者提供模组支持。多亏了他们的付出,现在我们的模组能实现官方地图 80%~90% 的功能。 当然做地图也不是件简单事。

这篇指南会引导你一步一步学习制作 Ready Or Not 地图模组所需的基础步骤和知识,并且将教你制作属于你的第一张地图,然后放入游戏中运行。

如果你遇到麻烦需要帮助,不要犹豫,请加入我们的 RoN Custom Maps Discord!

目前我们提供一个模版项目,里面包括了所有你需要用到的游戏功能/蓝图:Installation

在关卡设计部分,绝大多数工作都是在虚幻引擎内完成的。你也可以用任何(合理的)方式来制作你的关卡。

请记住:我们目前没办法在虚幻引擎中直接测试游玩关卡,而且只能在游戏中测试。为了在游戏中测试你的关卡,需要把你的关卡打包成一个可以部署的 .PAK 文件。更多信息:烘焙 & 打包 & 安装

Ready or Not 开发流程

如果你想知道给 Ready or Not 制作地图的完整流程是什么样的,我录制了我制作 Hell Comes to the Hills 从头到尾的开发视频。

YouTube 播放列表: Ready or Not: Custom Map Development by Delta

  1. 下载并安装 Epic 启动器.。
  2. 打开启动器,点击左边栏的 虚幻引擎,然后点击上方工具栏的
  3. 引擎版本 中点击版本号旁边的 + 号,点击下拉菜单并选择 5.3.2,然后安装。
  1. 从 NexusMods 下载模版,然后把它解压到一个你喜欢的地方: Ready Or Not Community Mapping Framework
  2. 打开解压后的文件夹里面的 ReadyOrNot.uproject

如果你打开内容侧滑菜单(Ctrl + 空格),然后前往 Content > Mods > Template > Levels,就能看到这里有3个关卡:

  1. RoN_ExampleMap
    • 顾名思义,这是一个示例地图,里面展示了可以运用的游戏中的各种功能,包括:玩家生成,门,AI,光照,QSM 和环境音效。这个关卡是用来 学习和参考的,你可以在里面了解到一些功能怎么运作的,又该如何实现。
  2. RoN_ExampleMap_MissionSelect
    • 一个非常小的关卡,只有在游戏中警局里选择关卡时会展示。
  3. RoN_Template
    • 这是一个模版地图,可以在烘焙完后用在游戏里。如果你要制作新地图,可以把它当作一个模版来用。但是在接下来的内容中我们让然会完全从零开始讲解, 以便你更好理解一些地图的必要条件。

在我们继续之前,有必要了解一下虚幻引擎项目的文件夹结构。

虚幻引擎主要采用了一个叫 Content 的文件夹作为内容所在地,里面包含了所有游戏内容和地图。(其实也就是你在外面看到的 ...\ReadyOrNot\Content)。

当你安装一个 .PAK 文件时,实际上是在往 Content 里面添加或者覆盖资产。在这里做的任何修改都有很有可能会对安装的其他模组产生影响。 尤其是当我们很多人都在使用相同的 Marketplace 或者 Quixel/Megascans 资产的时候,这种情况尤为多见。

**更重要的是,**这种情况还可能导致游戏所需的核心蓝图产生冲突!

为了防止我们无意中触动到别人的资产而导致游戏冲突崩溃,你需要:

  1. Mods 文件夹下以你的名字新建一个自己的目录,然后把你的所有资产都放进去(包括第三方/Marketplace/Quixel/Megascans)。
  2. Mods > Template > Blueprints 文件夹拖动到你在步骤1中新建的文件夹中
  3. 在内容浏览器中,右键 Mods 文件夹,然后选择 “修复重定向器”
  4. 在步骤1新建的文件夹中,创建一个空文件夹,命名为 “ModLevelData”
    • 之后我们会把 Mission Select 和 Level Select 数据放在这里面

这个 Mods 文件夹的结构现在应该是这样的:

  • 文件夹Content/
    • 文件夹Mods/
      • 文件夹ModLevelData/
      • 文件夹Template/
      • 文件夹Tools/
      • 文件夹YourUserName/ 你的文件夹
        • 文件夹Blueprints/
        • 文件夹ModLevelData/
  1. 在继续之前:请一定确保你阅读了前面有关文件夹结构的内容。在你完成上述步骤前不要继续。

  2. 按照之前有关文件夹结构的操作,在内容浏览器里前往你的 ...\Mod\YourUsername 文件夹,然后新建一个关卡并打开。

    • 你给关卡的命名将会展示在游戏里
    • 但不要把它命名为 “House”,因为这是一个受限的命名空间,从而不会出现在游戏里。
  3. 打开之后,在工具栏点击蓝图按钮,然后点击 打开关卡蓝图 关卡蓝图位置

  4. 类设置 中,打开细节面板,将 父类 更改为 ReadyOrNotLevelScript

  5. 点击 编译,然后就可以保存并关闭窗口了

  6. 在工具栏里选择 窗口 > 放置 Actor

  7. 在新打开的 放置 Actor 窗口里,选择 几何体,几何体 然后拖放几个盒体来制作地板和几面墙,作为游玩的区域。

    • 如果漆黑一片,请按 Alt + 3 切换成 无光照模式
  8. 放置 Actor 窗口里,搜索并放置以下这些 Actor:

    • 1个 玩家出生点
      • 将会作为玩家和小队的出生点
    • 导航网格体边界体积
      • AI 需要这个才能运作。这个体积覆盖到的地方就是 AI 能行走的范围
    • Roster Scenario Spawner
      • 这个 Actor 用来生成任务目标等
  9. 在内容浏览器中,导航到 ...\Content\YourUserName\Blueprints,并拖动放置以下这些蓝图:

    • 2个 BP_AISpawn_Managed
      • 作为 AI 的生成点。我们稍后就会回过头来详细设置这个东西。
      • 另外,还要把它们从地面上移大约 50uu 高,因为如果与地板有重叠则 AI 不会生成。
      • 技术上来讲,AI 不是必须有的。但是如果没有 AI 地图会在进入时就自动结束,也就没法测试游玩了。
    • BP_SpawnManager_V3
      • 管理 AI 生成
    • BP_CoverGen
      • AI 需要这个才能在交火时真正动起来,在地图里面移动。

到目前你的关卡还没有任何光照。现在我们来设置一些基本的东西,以便在游玩测试时能看到物体。请添加下列 Actor:

  1. 在工具栏选择 窗口 > 环境光照混合器,然后在新的窗口依次点击:

    • 创建天空光照
      • 大纲 面板里选择它,并将可移动性设置为 静态
    • 创建大气光源 (我们的平行光)
      • 大纲 面板选择 DirectionalLight,并将可移动性设置为 固定
      • 保持选中,找到 级联阴影贴图 并将 动态阴影距离静态光照 设置为 4000,然后将 动态阴影级联数字 设置为 1
      • 这些值会最终呈现在游戏里
    • 创建天空大气
    • 创建高度雾
  2. 放置 Actor 窗口中搜索并拖动放置:

    • Lightmass Importance Volume 并调整大小覆盖整个可游玩区域
    • 1个 Sphere Reflection Probe 覆盖整个地图
      • 如果没有反射捕获,游戏中的模型/武器会看起来很扁平并且光照错误。

我们还未配置已经已经放置的2个 BP_AISpawns_Managed 蓝图,因此现在来将其设置为一个平民和一个嫌疑人:

  1. 选择一个 AISpawn,然后在 AISpawn > Spawn Array 下点击 + 按钮
  2. 展开新的数组元素,同时展开其下的 Spawned AI
    • 在这里选择要生成哪种 AI
  3. Data Table 更改为 AIDataTable_Gas,并将 Row Name 设置为 Civilian_Gas_Woman_01
  4. 选择另外一个 AISpawn,重复相同的步骤,但是把 Row Name 更改成 Suspect_01_Shotgun
  5. 检查这两个 AISpawns 的 Spawn AI 下的 Spawn with Tags 是否已经设置为 “group1”
    • Spawn with Tags 用于告诉 BP_SpawnManager_V3 属于哪个组,并允许其控制每个组具体要如何生成 AI。
    • 默认情况下应该是 “group1”
  6. 另外,检查每一个 AISpawn 在 Actor > Tags 底下是否有一个项 “Managed”
    • 如果没有这个 tag,Spawn Manager 将无法找到 AISpawn,进而无法生成 AI。
    • 默认情况下应该是 “Managed”

现在你的 AISpawn 的细节应该看起来和这个差不多:

AISpawn 细节示例

为了生成 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 适配地图中不同的场景
  • 如果你想要固定某个标签组生成的 AI 数量,请把 MinimumAmount & MaximumAmount 设置成同个数值。

  • 如果你想要在一个标签组内生成随机数量的 AI,请分别调整 MinimumAmount & MaximumAmount 的数值,并 打开 RandomizeWithinRange

  • 至此,剩下的部分可以全部保持默认

在你的地图里放置和编辑门其实很容易。

  1. 在内容浏览器中,导航到 ...\Content\Template\Blueprints,并放置一个 BP_Door_Spawner
  2. 你可以更改门的样式种类,在 默认 > Door Type 中从 Row Name 下拉菜单中选择想要的门的样式。

如果你一直照着上面的步骤做到这里,那么你大概率还没构建地图。构建地图可以修复几何体和体积、光照和反射以及路径的更改。 只要你想更新/预览地图的修改,就需要构建地图。

要构建地图,请在工具栏的 构建 菜单中选择要构建的内容:

  • 地图检查
    • 检查地图中是否存在错误
    • 通常进行任何其它构建之后都会进行检查,但是你也可以手动进行一次
  • 构建几何体
    • 这将在编辑后重新构建笔刷和体积
    • 最好在进行其它构建之前先构建几何体
  • 构建路径
    • 这会更新所有导航网格体,最好在构建几何体之后再构建路径。
  • 仅构建光照
    • 顾名思义,这将构建地图的光照。同时整个构建的 90% 的时间都将花费在这上面。
  • 构建反射捕获
    • 字面意思。如果你构建了光照,通常也会自动构建反射捕获。但如果你想节省时间、只更新反射,也可以使用这个。
  • 构建地形
    • 字面意思
  • 预计算静态可视性
    • 注:在 UE5.3.2 中,预计算静态可视性(PCV)算是坏了,你没办法在编辑器里直接预览,也没办法阻止报错。
    • 你可以在 项目设置 > 引擎设置 > 渲染 > 剔除 中关闭错误信息:禁用 对无预计算静态可视性进行警告.
    • 你仍然可以构建 PCV,数据也会保存下来,但是将无法验证它。你需要在世界设置中启用 预计算静态可视性 才能构建。
    • 通常会在构建光照后再构建 PCV。

我目前的一般步骤是:构建几何体 > 构建路径 > 构建光照。一旦构建完成,你需要点击 文件 > 保存所有

烘焙是一个把项目转换为可在其他机器上部署的内容的过程。我们只想烘焙那些对地图来说必要的内容,并且尽可能地减小文件大小。我们需要先进行如下设置:

  1. 前往 编辑 > 项目设置,在侧边栏选择 项目 > 打包

  2. 打包 下禁用 共享材质着色器代码

  3. 打包 > 打包版本中要包括的地图列表 下 应该可以看到 2 个条目,展示了 RoN_ExampleMapRoN_Template 的路径

    • 如果你没看到 打包版本中要包括的地图列表,可能需要展开 高级 类别。
  4. 现在删掉这 2 个条目。

  5. + 创建一个条目,在项目里选择你的地图的路径

  6. 再按 + 创建一个条目,但是这次选择你的地图的 BuildData 路径,它应该和你的地图在同个目录下

  7. 你无需再更改其他设置,现在应该看起来类似这样: 打包设置示例

  8. 在继续之前确保你保存所有

  9. 在工具栏选择 平台 > Windows > 烘焙内容 UE5 Cook Location

    • 初次烘焙可能因为需要编译所有着色器而花费更长时间,请耐心等候。
  10. 一旦烘焙完成,在 项目设置 > 打包 中重新启用 共享材质着色器代码

打包会将已烘焙的内容变成单个压缩后的文件,这样我们就可以放进游戏里并且分发给别人。

  1. 新建一个文件夹作为你进行打包工作的位置,命名无所谓但是我使用 Paking

    • 我也不会把这个文件夹放在项目文件夹里面
  2. 在这个文件夹里创建一个新的文件夹,用这种格式命名:pakchunk99-YOURMAPNAME

    • pakchunk 后面的 99 表示的是 PAK 文件的加载顺序。对于地图,我们一律使用 99
    • YOURMAPNAME 替换成你的地图名字。这个不会在游戏里展示出来,但是可以帮助别人辨认你的地图/模组。
  3. 前往 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
  4. 给这个 .bat 文件创建一个快捷方式,然后把快捷方式移动到你在步骤 1 创建的工作文件夹

  5. 导航到你的项目文件夹然后打开: ...\Saved\Cooked\Windows\ReadyOrNot只复制 Content 文件夹

  6. Content 文件夹粘贴到你的 pakchunk99-YOURMAPNAME 文件夹里

  7. pakchunk99-YOURMAPNAME 文件夹拖动到你的 .bat 快捷方式上,一个命令行窗口会弹出来,告诉你是否完成了。 如果成功了,在你的工作文件夹下应该会有一个新文件叫做 pakchunk99-YOURMAPNAME.pak

  8. 复制 pakchunk99-YOURMAPNAME.pak...\Common\Ready Or Not\ReadyOrNot\Content\Paks

  9. 你的地图现在应该就会出现在游戏里了

这是一个工作文件夹的示例: 工作文件夹示例

测试地图最简单的方式就是在打开游戏,然后在任务选择里选择你的地图。 如果能正常运作,第一次启动你的地图时会花几秒钟来生成世界数据,然后就能进地图了。

请确保你完成了如下步骤:

  • 使用最新版本的模板项目,链接在 这篇指南的上面
  • 你遵循了 上文提到的 打包方法
  • 只包含了来自 ...\Saved\Cooked\WindowsNoEditor\ReadyOrNotContent 文件夹
  • 禁用 共享材质着色器代码
  • 你放置了 必要的游戏组件 里提到的所有 Actor

如果你的地图仍然无法运行,你可能想在 Mapping Discord 上寻求帮助,链接在本指南上面

恭喜你!你完成了第一次 RoN 地图的版本迭代!

还剩下一些最终的重要步骤,当你想要测试更新而重新烘焙和打包你的文件的时候要注意:

  1. 在你重新烘焙地图过后,建议你删除原有的 pakchunk99-YOURMAPNAME 文件夹下的 Content 文件夹,而不是直接覆盖它。
    • 直接覆盖会留下没用的文件和设置,可能会破坏你的游玩测试。
  2. 在你启动游戏之前,先去 %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:https://fmodel.app/

下载映射文件:映射文件

  1. 如果是初次使用,点击 ADD UNDETECTED GAME 下的箭头,选择 ...\common\Ready Or Not\ReadyOrNot 目录 并点击 + 按钮。
  2. 选择 UE 版本为 GAME_UE5_3,然后按 OK
  3. 去设置里找到 General > Advanced,启用 Local Mapping File,将 Mapping File Path 设置为刚下载的映射文件 (这可以让你在 FModel 里直接预览已烘焙内容)。
    • 可选:在 Settings > Models > Mesh Format,更改为 glTF 2.0 (binary),以便导出静态网格体
    • 留意你的导出目录位置
  4. 在 Archives 标签页,选择所有游戏的 .pak 文件,点击 Load
  5. 在 Folders 标签页,导航到 Content 文件夹,右键选择 Export Folder's Packages Raw Data (.uasset)。 这会保存所有的已烘焙内容,并且将花费一点时间。

一旦完成,进入下一步。

  1. 继续之前先关闭示例项目。
  2. 导航到 FModel 导出已烘焙资产的地方,然后复制 Content 文件夹(如果磁盘空间有限就剪切)到你项目的 Content 文件夹。
    • 这包含了着色器缓存。
  3. **如果提示,不要覆盖任何文件!**跳过这些文件就好。如果你覆盖了,你就得从头开始创建一个新的示例项目了。

游戏的所有资产现在应该都可以使用了,包括材质,贴图和粒子效果!

如果你想听到 QSM 或者环境声,遵循如下步骤:

  1. 导航到 ..\common\Ready Or Not\ReadyOrNot\Content\FMOD,复制 Desktop 文件夹。
  2. 导航到你的项目的 ...\Content\FMOD 文件夹,然后把 Desktop 文件夹粘贴在这里

我们还有别的指南,涵盖了一些地图制作更深入的方面,如下: