第2章 界面认知与核心工作流:从编辑器漫游到第一个蓝图
第2章 界面认知与核心工作流:从编辑器漫游到第一个蓝图
上一章我们了解了Unreal Engine 5的发展脉络,完成了引擎的下载与安装,并成功启动了编辑器。当你第一次看到UE5的默认界面时,可能会感到有些不知所措——密密麻麻的按钮、分门别类的面板、陌生的术语。这种感觉非常正常,每一位开发者都经历过这个阶段。
本章的目的,就是带你完成从“初次见面”到“熟练上手”的跨越。我们将深入拆解UE5编辑器的每一个核心面板,理解它们的设计意图和协作关系。更重要的是,我们将在这一章迈出可视化编程的第一步——创建你的第一个蓝图类。通过这个实践,你不仅会熟悉蓝图编辑器的基本操作,还会初步建立起“面向对象”的思维模型,为后续章节的系统学习打下坚实的基础。
同时,我们也会引入C++编程的视角,让你看到同样的逻辑在代码层面是如何实现的。这种“双轨并行”的学习方式,能帮助你更全面地理解UE5的设计哲学。
2.1 初识编辑器:布局与核心面板
当你新建或打开一个项目后,呈现在你面前的就是UE5的主界面。这个界面并非一成不变,你可以根据工作习惯自由拖拽、重组各个面板。但无论怎么变化,几个核心功能区域始终扮演着关键角色。
2.1.1 主菜单栏:项目的控制中心
位于窗口最顶部的是主菜单栏。它集合了与项目、文件、编辑、窗口、帮助等相关的所有全局性操作。
- File(文件): 这里可以进行新建/打开/保存关卡、新建C++类、打包项目等操作。当你准备把游戏发布给玩家时,最常用的就是“Package Project”功能。
- Edit(编辑): 包含编辑器偏好设置(Editor Preferences)和项目设置(Project Settings)。前者影响的是你个人使用编辑器的方式(如快捷键、界面语言),后者则影响整个游戏项目的运行机制(如输入映射、物理碰撞、渲染选项)。
- Window(窗口): 如果你不小心关闭了某个面板,可以在这里重新打开。你也可以通过它加载各种专业工具,如行为树编辑器、动画蓝图编辑器等。
2.1.2 Modes(模式)面板:工具的切换器
Modes面板位于主界面的左上角,通常以侧边栏的形式存在。它提供了几种主要的编辑模式,每种模式下,视口(Viewport)的操作逻辑和可用工具都会有所不同。
- Select(选择): 默认模式,用于在场景中选择、移动、旋转、缩放Actor(关卡中的任何物体都可以称为Actor)。
- Landscape(地形): 用于创建和雕刻大规模的地形系统。
- Foliage(植被): 用于在地形或静态网格体上批量绘制植物、石头等自然元素。
- Modeling(建模): UE5内置的建模模式,允许你在编辑器中直接创建和修改简单的几何体,甚至进行一些复杂的网格编辑,无需切换到外部建模软件。
2.1.3 Viewport(视口):你的游戏世界之窗
Viewport是编辑器中最核心的区域,它实时渲染你的游戏世界,你在这里进行的所有调整(移动物体、改变材质、调整光照)都能立刻看到效果。
- 导航操作: 在视口中按住鼠标右键并移动,可以旋转视角(环顾四周);按住鼠标右键的同时按下W/A/S/D键,可以像玩FPS游戏一样“飞”着浏览场景;滚动鼠标滚轮可以拉近或拉远视角。熟练掌握这些导航操作是进行关卡设计的基础。
- 视口模式: 视口左上角有一排工具按钮。你可以在这里选择不同的视图模式,如“光照”(Lit,显示最终光照效果)、“线框”(Wireframe)、“无光照”(Unlit)等。在调试材质或光照时,这些模式非常有用。
2.1.4 Content Browser(内容浏览器):项目的资源仓库
Content Browser通常是界面底部最大的那个面板。它是你项目中所有资源的中央管理器——静态网格体、材质、纹理、蓝图、动画、音效……一切都在这里。
- 文件夹结构: 合理组织Content Browser的文件夹结构是项目成功的关键。建议从一开始就按照功能或类型创建清晰的文件夹,例如
Characters、Props、Maps、Materials、Blueprints等。 - 资产操作: 你可以在这里对资源进行导入、导出、复制、移动、重命名、删除等操作。双击一个资源(如材质、蓝图)会打开其对应的编辑器。
2.1.5 World Outliner(世界大纲):场景的清单
World Outliner通常位于界面的右上角。它以树状列表的形式,显示了当前关卡中所有的Actor。
- 层次结构: 你可以将一个Actor拖拽到另一个Actor上,使其成为后者的子物体。子物体会跟随父物体一起移动、旋转。例如,将一把枪模型拖拽到角色模型上,枪就会成为角色的一部分。
- 可见性与锁定: 每个Actor旁边都有眼睛和小锁图标。点击眼睛可以暂时隐藏该Actor,方便你编辑被它遮挡的部分;点击小锁可以锁定该Actor,防止在视口中被误操作。
2.1.6 参数设置面板(Details):属性的编辑器
Details面板(有时也称为“细节”面板)通常位于World Outliner的下方。当你在Viewport或World Outliner中选中一个Actor时,Details面板就会显示这个Actor的所有可编辑属性。
- 变换(Transform): 显示并允许你精确修改Actor的位置(Location)、旋转(Rotation)和缩放(Scale)。
- 组件(Components): 显示构成这个Actor的所有组件(如网格体、光源、碰撞体)。
- 各类属性: 根据Actor类型的不同,Details面板会展示各种不同的属性。例如,一个光源Actor会让你调整亮度、颜色、衰减半径;一个静态网格体Actor则会让你改变使用的材质。
理解这六大核心面板,你就掌握了驾驭UE5编辑器的基本能力。它们之间通过“选中”和“编辑”的逻辑紧密协作:在World Outliner或Viewport中选中一个物体,在Details面板中修改它的属性,在Content Browser中查找和拖拽资源,在Viewport中观察最终效果。
2.2 步入蓝图:可视化编程思维
对于没有编程基础的读者来说,蓝图(Blueprint)是进入游戏逻辑开发的最佳入口。蓝图是UE5中的一种可视化脚本系统。你无需编写一行代码,而是通过连接节点、设置属性的方式,创造出复杂的游戏行为。
可以将蓝图想象成一个电子电路图。节点(Nodes)就是各种电子元件(开关、灯泡、电池),连接线(Wires)就是导线。你通过导线连接不同的元件,构建出一个能完成特定功能的电路。在蓝图中,一个“事件节点”(如“当游戏开始时”)连接到一个“函数调用节点”(如“打印一段文字”),就构成了最简单的逻辑。
2.2.1 蓝图的核心类型
蓝图并非只有一种,根据其用途可以分为几种主要类型:
- 关卡蓝图(Level Blueprint): 每个关卡都有一个专属的关卡蓝图。它作用于整个关卡层面,负责处理这个关卡内的全局事件和交互。例如,当玩家进入某个区域时触发一段过场动画,或者当所有敌人被消灭时打开一扇大门。
- 类蓝图(Blueprint Class): 这是最常用、最重要的蓝图类型。它定义了一种全新的“类”,你可以将其视为一种物体的“蓝图”或“设计图”。基于这个设计图,你可以在关卡中创建出任意多个实例。例如,你可以创建一个“BP_Button”(按钮)的类蓝图,定义它的外观、按下时的逻辑等,然后在关卡中放置几十个不同的按钮实例,它们都会拥有相同的行为。
- 控件蓝图(Widget Blueprint): 用于创建用户界面(UI),如游戏菜单、血条、对话框、背包界面等。
- 动画蓝图(Animation Blueprint): 专门用于控制角色的动画状态机,决定角色何时行走、奔跑、跳跃、开火。
本书后续章节将重点围绕类蓝图展开。
2.2.2 实践:创建你的第一个蓝图类
让我们通过一个简单的例子,来体验一下蓝图的工作流程。我们将创建一个可以开关的电灯。
第一步:创建蓝图类
- 在Content Browser的空白区域右键单击,从弹出的菜单中选择 Blueprint Class。
- 系统会弹出一个窗口,让你选择一个父类(Parent Class)。父类决定了你的新蓝图将继承哪些基础功能。我们这里选择 Actor,因为Actor是能够被放置到关卡中的最基本类型。
- 为新蓝图命名为
BP_LightSwitch(遵循“BP_前缀”的命名规范)。
第二步:打开蓝图编辑器
双击 BP_LightSwitch 打开蓝图编辑器。你会看到一个分为多个面板的新窗口。
- Components面板(左上): 这里用于添加和构建构成这个Actor的组件。
- MyBlueprint面板(左下): 这里列出了这个蓝图拥有的所有变量、函数、宏等。
- Viewport面板(中上): 显示由当前组件构成的可视化表现。
- EventGraph面板(中下): 这里是进行可视化编程的主要区域,我们通过拖拽和连接节点来编写逻辑。
第三步:构建组件
- 在Components面板中,点击 + Add 按钮。
- 搜索并添加一个 Point Light 组件(点光源)。现在,Viewport中应该出现了一个小灯泡的图标。
- 再次点击 + Add,添加一个 Static Mesh 组件(静态网格体)。我们将用这个组件来表示灯的“外壳”。
- 在Viewport中选中
StaticMesh组件。在Details面板中,找到 Static Mesh 栏目,点击下拉框,选择一个简单的球体或圆柱体(可以在 Starter Content 中找到Shape_Sphere)。 - 在Components面板中,将
PointLight组件拖拽到StaticMesh组件上,使其成为StaticMesh的子物体。然后调整PointLight的位置,让它看起来像是从灯壳里发出来的光。
第四步:编写逻辑
- 切换到 EventGraph 面板。
- 我们的目标是:当玩家走进灯泡并按下某个键(如E键)时,开关灯光。为了简化,我们先实现一个最简单的功能:当游戏开始时,灯泡自动开关一次。
- 在EventGraph中空白处右键,弹出上下文菜单。搜索并添加 Event BeginPlay 节点(游戏开始时触发的事件)。
- 再从右键菜单中搜索并添加一个 Toggle 节点。你需要找的是关于
PointLight组件的节点。从Event BeginPlay的输出引脚拖出一条连线,松手后在弹出的菜单中搜索Toggle,选择 Toggle Visibility 或 Toggle Enabled。为了直观,我们选择 Toggle Visibility(切换可见性),这样灯泡就会亮起和熄灭。 - 但
Toggle Visibility节点需要一个目标(即它要作用于哪个组件)。将鼠标放在PointLight组件的引脚上(通常是一个深色的小圆点),拖出一条线,连接到Toggle Visibility的Target引脚。或者,你也可以直接从Event BeginPlay节点连线后,在搜索菜单中选择PointLight->Toggle Visibility,系统会自动为你连好。
现在,你已经完成了第一个蓝图逻辑。点击编译按钮,保存蓝图。
第五步:测试
将 BP_LightSwitch 从Content Browser拖拽到游戏关卡中。点击工具栏的“Play”按钮运行游戏。你会看到,当游戏开始时,灯泡(如果Visible是默认开启的)会瞬间熄灭?这是因为 Toggle Visibility 会反转当前的可见性状态。如果想实现明确的“开启”或“关闭”,可以使用 Set Visibility 节点。
通过这五个步骤,你不仅创建了一个可交互的Actor,还亲身体验了蓝图编辑器的核心工作流:组件构建 + 事件驱动 + 节点连接。
2.3 C++编程准备:从零开始的代码世界
虽然蓝图功能强大,但C++在性能、复杂逻辑封装、以及实现引擎底层功能方面仍不可替代。在深入蓝图之前,有必要先了解一下如何将C++集成到你的项目中。
2.3.1 创建第一个C++类
- 在UE5编辑器中,点击顶部菜单栏的 Tools -> New C++ Class。
- 同样会弹出选择父类的窗口。我们这里也选择 Actor 作为父类。
- 为新类命名,例如
MyCppLightSwitch。你可以选择将类文件放在项目的Source目录下的特定文件夹中,保持默认即可。 - 点击 Create Class。Visual Studio(或你设置的代码编辑器)会自动打开,并生成好类的头文件(.h)和源文件(.cpp)。
2.3.2 代码结构与Allman风格
Unreal Engine的C++代码有着自己独特的风格和规范,大量使用了宏和反射系统。我们以 MyCppLightSwitch.h 为例,进行初步解读。
// MyCppLightSwitch.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyCppLightSwitch.generated.h"
/**
*
*/
UCLASS()
class YOURPROJECTNAME_API AMyCppLightSwitch : public AActor
{
GENERATED_BODY()
public:
// 构造函数:设置此actor的默认属性
AMyCppLightSwitch();
protected:
// 当游戏开始时或当该actor被生成时调用
virtual void BeginPlay() override;
public:
// 每帧调用
virtual void Tick(float DeltaTime) override;
// === 在这里声明我们将在.cpp中使用的组件 ===
// 声明一个指向点光源组件的指针
UPROPERTY(VisibleAnywhere, Category = "Components")
class UPointLightComponent* PointLight;
// 声明一个指向静态网格体组件的指针
UPROPERTY(VisibleAnywhere, Category = "Components")
class UStaticMeshComponent* LightMesh;
};
代码风格说明:
- 本文遵循Allman风格,即大括号独占一行。这在C++社区中是一种常见的缩进风格,强调代码结构的清晰度。
- 类名(
AMyCppLightSwitch)、函数名(BeginPlay、Tick)和方法名使用帕斯卡命名法(每个单词首字母大写)。 - 变量名(
PointLight、LightMesh)使用驼峰命名法(首单词小写,后续单词首字母大写)。 UPROPERTY是UE的反射宏,用于告诉引擎这个变量需要被垃圾回收、可以被序列化或在编辑器中可见。VisibleAnywhere意味着这个变量可以在编辑器任何地方看到但不能修改,Category用于在编辑器细节面板中对属性进行分类。
接下来,在 MyCppLightSwitch.cpp 中实现构造函数:
// MyCppLightSwitch.cpp
#include "MyCppLightSwitch.h"
#include "Components/PointLightComponent.h"
#include "Components/StaticMeshComponent.h"
#include "UObject/ConstructorHelpers.h"
// 构造函数
AMyCppLightSwitch::AMyCppLightSwitch()
{
// 设置此actor调用Tick()函数。如果不需要,可以关闭以提升性能。
PrimaryActorTick.bCanEverTick = true;
// 创建点光源组件并将其设置为根组件
PointLight = CreateDefaultSubobject<UPointLightComponent>(TEXT("PointLight"));
RootComponent = PointLight;
// 创建静态网格体组件,并附加到根组件上
LightMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("LightMesh"));
LightMesh->SetupAttachment(RootComponent);
// 尝试加载一个静态网格体资产(使用StarterContent中的球体)
static ConstructorHelpers::FObjectFinder<UStaticMesh> SphereMeshAsset(TEXT("/Game/StarterContent/Shapes/Shape_Sphere.Shape_Sphere"));
if (SphereMeshAsset.Succeeded())
{
LightMesh->SetStaticMesh(SphereMeshAsset.Object);
// 调整网格体的位置和大小以适应光源
LightMesh->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f));
LightMesh->SetWorldScale3D(FVector(0.5f));
}
}
// 当游戏开始时调用
void AMyCppLightSwitch::BeginPlay()
{
Super::BeginPlay();
// 在这里添加游戏开始时的逻辑
}
// 每帧调用
void AMyCppLightSwitch::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
// 在这里添加每帧更新的逻辑
}
将项目编译运行后,你同样可以将 MyCppLightSwitch 拖入关卡。它的外观和行为暂时和之前的 BP_LightSwitch 一样(只显示了一个静态网格体和一个光源)。我们将在后续章节为它添加逻辑。
2.3.3 蓝图与C++的协同
MyCppLightSwitch 这个C++类,其实就是一个“天然的”蓝图父类。当你编译完C++代码后,在UE5编辑器中,你可以右键点击这个类,选择 Create Blueprint Class based on AMyCppLightSwitch。这样创建出的蓝图类,将继承C++类中定义的所有组件和基础逻辑,同时你可以在蓝图中继续添加更复杂的可视化脚本。
这种 C++ 构建地基,蓝图 构建上层逻辑 的开发模式,是大型UE5项目的标准实践。C++负责性能敏感的模块和稳定的框架,而蓝图则赋予设计师和策划快速迭代和调整游戏性的能力。
2.4 实践项目:搭建你的第一个测试场景
理论知识需要实践的检验。让我们综合运用本章所学,搭建一个简单的测试场景,为后续的学习做好准备。
场景构思:一个简单的室内空间,中央有一个工作台,工作台上摆放着我们刚刚创建的 BP_LightSwitch 和 MyCppLightSwitch(或者基于它创建的蓝图)。场景四周有墙壁,地面上有简单的材质。
操作步骤:
- 新建关卡:点击 File -> New Level,选择
Basic模板。 - 清理场景:删除场景中原有的所有Actor(通常包括一个地面、一个定向光和一个玩家起始点)。
- 搭建地面:从 Content Browser 的 Starter Content > Props 中,找到
SM_Floor或其他合适的模型,拖入场景。将其放置在原点 (0,0,0)。 - 搭建墙壁:同样从 Starter Content > Props 中,找到
SM_Wall等模型,围绕地面搭建一个简单的房间。或者,你也可以使用 Modeling Mode(点击左侧Modes面板切换到Modeling模式)创建简单的立方体,调整大小和材质,作为墙壁。 - 放置工作台:从 Starter Content > Props 中,找到
SM_Table或其他模型,放置在房间中央。 - 添加灯光和玩家:
- 从Modes面板的Basic栏中,拖一个 Point Light 或 Directional Light 到场景中,照亮房间。
- 拖一个 Player Start 到场景中,设置玩家的初始位置。
- 放置我们的实验对象:将之前创建的
BP_LightSwitch和MyCppLightSwitch(或者它的蓝图子类)从Content Browser拖拽到工作台上。 - 应用材质:选中地面或墙壁,在Details面板中找到Mesh组件下的 Materials 栏目,点击Element 0的下拉框,从Starter Content > Materials中选择一个喜欢的材质(如
M_Brick_Clay_New),赋予它简单的颜色。
运行游戏,你可以在房间里自由走动(如果绑定了默认的Pawn),观察工作台上的两个灯泡。它们目前静静地立在那里,等待着你赋予它们生命。
2.5 本章小结
在这一章中,我们完成了一次从界面到核心工作流的快速巡礼。你不仅学会了如何操作UE5的各个关键面板,还亲手创建了第一个蓝图类,并初次尝试了C++代码的编写。更重要的是,你建立起了组件化构建、事件驱动编程、以及蓝图与C++协同工作的基本概念。
记住,学习UE5就像学习一门新的语言,从认识字母(界面)、到拼写单词(创建蓝图类)、再到造句(连接节点)。这一章为你打下了坚实的基础。在接下来的第3章“变量与核心节点:构建游戏逻辑的基石”中,我们将深入蓝图的核心,系统地学习变量、函数、流程控制等知识,正式开始书写你自己的游戏逻辑。
通过本章的练习,你应该能够:
- 熟悉UE5编辑器的六大核心面板及其用途。
- 理解什么是蓝图,并能创建一个简单的包含组件的类蓝图。
- 在蓝图中连接基本的“事件”与“操作”节点。
- 了解如何创建基础的C++ Actor类,并理解其与蓝图的关系。
- 运用所学知识搭建一个简单的测试关卡。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)