3、关卡基础:创建与保存关卡、理解关卡蓝图、设置默认关卡与持久关卡

好,咱们进入第三讲。说实话,关卡是Unreal里所有影视内容的「舞台」。你做的角色、灯光、摄像机,最后都得装进这个容器里。我见过不少新手一上来就急着摆资产,结果做到一半发现关卡设置有问题,又得从头来。嗯,咱们先把地基打牢。

3.1 创建与保存关卡

创建关卡其实很简单。在Content Browser里右键,选「Level」就行。但我个人习惯用快捷键——先打开你要继承的关卡,然后File → Save Current As。为什么?因为很多模板设置(比如Post Process、Lighting Scenario)能直接带过来。

保存时有个坑:关卡文件一定要放在Content目录下。我曾经有个项目,美术同事把关卡存到了桌面,结果引擎死活加载不出来。找了半天才发现路径不对。Unreal的引用机制是基于相对路径的,你放错地方,所有引用都会断。

注意:关卡文件名不要用中文,也不要用空格。用下划线或驼峰命名。比如 Seq_Chapter03 就比 第三章节 最终版 靠谱得多。

3.2 理解关卡蓝图

关卡蓝图,说白了就是「这个关卡的全局脚本」。它不属于任何Actor,但能控制关卡里的一切。你想想看,如果你想在过场动画开始时触发一个事件,或者播放一段音效,关卡蓝图就是最直接的地方。

打开方式:点击顶部菜单的Blueprints → Open Level Blueprint。或者更快的,直接按Ctrl + B(在选中关卡时)。

我常用的几个场景:

  • 开场初始化:在Event BeginPlay里设置摄像机初始位置、禁用玩家输入。
  • 关卡流加载:用Load Stream Level节点动态加载子关卡,避免一次性加载太多资源。
  • 全局变量:比如当前播放到第几个镜头,或者某个角色的对话状态。

举个例子,一个简单的开场逻辑:

Event BeginPlay
    → Set Input Mode (UI Only)
    → Set Cinematic Mode (True)
    → Play Sound (开场音乐)
    → Delay (2秒)
    → Open Level (主关卡)

你看,就这么几个节点,就能控制整个过场的启动流程。我在做《暗夜追踪》那个项目时,就是用关卡蓝图来控制所有章节的切换逻辑,比在每一个Actor上写脚本要清爽得多。

小技巧:关卡蓝图里尽量只放「调度逻辑」,别放「具体实现」。比如播放音效,你可以在关卡蓝图里调用一个音效管理器的函数,而不是直接拖一个Sound Wave节点。这样后期修改音效时,不用翻遍整个蓝图。

3.3 设置默认关卡与持久关卡

这部分容易搞混。我简单解释一下:

  • 默认关卡:游戏启动时第一个加载的关卡。在Project Settings → Maps & Modes → Default Maps里设置。
  • 持久关卡:一直存在的关卡,不会被卸载。通常用来放全局灯光、大气系统、或者UI框架。

为什么要区分?因为影视级过场动画往往需要切换场景。比如主角从室内走到室外,你不可能把整个室内场景一直留在内存里。这时候,持久关卡里放「永远不变的东西」(比如全局光照、天空球),而子关卡里放「会切换的场景」。

设置方法:

  1. World Settings面板里,找到Persistent Level
  2. 把你想作为持久关卡的Level拖到Persistent Level的插槽里。
  3. 其他关卡作为Streaming Levels,通过蓝图或C++动态加载/卸载。

我曾经犯过一个错:把角色蓝图放在了子关卡里,结果切换关卡时角色直接被销毁了。后来才意识到,角色应该放在持久关卡里,或者用Move Actor to Level节点迁移过去。嗯,这个坑你们记住就好。

类型 用途 加载方式 典型内容
持久关卡 全局基础设施 始终加载 天空球、全局光照、玩家角色、UI
子关卡 场景内容 动态加载/卸载 室内场景、室外场景、道具
默认关卡 启动入口 游戏开始时加载 主菜单、开场关卡

最后说一句:持久关卡不是越多越好。我见过有人把整个城市都放在持久关卡里,结果内存直接爆了。持久关卡只放「必须一直存在」的东西,其他的交给流加载。这才是专业做法。

好,这一讲就到这里。下一讲咱们聊聊关卡流加载的具体实现,包括如何用蓝图控制加载进度、如何避免加载卡顿。到时候见。