蓝图
约 2051 字大约 7 分钟
2025-06-03
什么是蓝图?
蓝图(Blueprint)是虚幻引擎的可视化脚本系统,允许开发者使用基于节点的界面创建游戏玩法,而无需编写传统的代码。蓝图系统功能强大,几乎可以实现C++能完成的所有功能。
蓝图的优势
- 可视化编程:直观的节点连接方式,便于理解逻辑流程
- 快速原型:可以快速搭建和测试游戏玩法
- 实时调试:支持断点调试和实时变量监控
- 团队协作:非程序员也能参与逻辑开发
- 热更新:运行时可以修改蓝图逻辑
蓝图类型
1. 关卡蓝图(Level Blueprint)
- 控制特定关卡的逻辑
- 处理关卡事件(开始游戏、玩家进入区域等)
- 一般用于关卡特有的功能
2. 类蓝图(Class Blueprint)
- 基于Actor类创建的蓝图
- 可以创建可重复使用的对象
- 包含组件、变量、函数和事件
3. 数据资产蓝图(Data Asset Blueprint)
- 用于存储和管理数据
- 不包含可执行逻辑
- 适合配置文件和设置
4. 函数库蓝图(Function Library Blueprint)
- 包含可在其他蓝图中调用的函数
- 用于创建可重用的功能
- 类似于编程中的工具类
5. 接口蓝图(Interface Blueprint)
- 定义函数签名的合约
- 允许不同类的蓝图实现相同的接口
- 实现多态性
6. 宏库蓝图(Macro Library Blueprint)
- 包含可重用的节点组合
- 比函数更灵活,可以有多个执行输出
蓝图编辑器界面
主要组件
工具栏(Toolbar)
- 编译、保存、查找等常用功能
- 调试控制按钮
视口(Viewport)(仅类蓝图)
- 3D预览窗口
- 可以查看和调整组件
组件(Components)(仅类蓝图)
- 显示蓝图的组件层级
- 可以添加、删除、重排组件
我的蓝图(My Blueprint)
- 显示蓝图的所有元素
- 变量、函数、事件、宏等
图表(Graph)
- 主要的节点编辑区域
- 可以有多个图表(事件图表、函数图表等)
细节(Details)
- 显示选中节点或组件的属性
- 可以设置默认值和配置
基本概念
节点(Nodes)
事件节点(Event Nodes)
- 响应特定事件的起始点
- 常见事件:BeginPlay、Tick、碰撞事件等
- 红色的执行输出引脚
函数节点(Function Nodes)
- 执行特定功能的节点
- 可以有输入和输出参数
- 蓝色表示对象引用,其他颜色表示不同数据类型
变量节点(Variable Nodes)
- Get:获取变量值
- Set:设置变量值
- 变量类型用不同颜色表示
引脚(Pins)
执行引脚(Execution Pins)
- 白色的执行流引脚
- 控制代码执行顺序
- 从左到右:输入执行、输出执行
数据引脚(Data Pins)
- 传递数据值
- 不同颜色代表不同数据类型
- 布尔值(红色)、整数(青色)、浮点数(绿色)、字符串(洋红色)、对象引用(蓝色)
连线(Wires)
- 连接节点之间的引脚
- 执行连线:控制执行流程
- 数据连线:传递数据值
- 可以拖拽重新连接
变量系统
变量类型
基本数据类型
- Boolean(布尔值)
- Integer(整数)
- Float(浮点数)
- String(字符串)
- Name(名称)
- Text(文本)
复合数据类型
- Vector(向量)
- Rotator(旋转器)
- Transform(变换)
- Color(颜色)
对象类型
- Object Reference(对象引用)
- Class Reference(类引用)
- Soft Object Reference(软引用)
集合类型
- Array(数组)
- Set(集合)
- Map(映射)
变量属性
实例可编辑(Instance Editable)
- 在细节面板中可以编辑
- 每个实例可以有不同的值
蓝图只读(Blueprint Read Only)
- 在蓝图中只能读取,不能修改
公开到电影序列(Expose to Cinematics)
- 可以在Sequencer中进行动画
私有(Private)
- 只能在当前蓝图中访问
函数和事件
函数(Functions)
创建函数
- 在"我的蓝图"面板中点击"+"按钮
- 选择"函数"
- 设置函数名称和参数
函数特点
- 有明确的输入和输出
- 可以有返回值
- 支持局部变量
- 可以被其他蓝图调用
事件(Events)
自定义事件
- 可以从其他地方调用
- 支持参数传递
- 用于解耦代码逻辑
内置事件
- BeginPlay:对象开始时触发
- Tick:每帧都会触发
- EndPlay:对象结束时触发
- 碰撞事件:OnHit、OnOverlap等
- 输入事件:键盘、鼠标、手柄输入
实践教程:创建简单的交互对象
目标
创建一个可以点击的宝箱,点击后播放动画并给玩家物品。
步骤
1. 创建蓝图类
- 在内容浏览器中右键
- 选择"蓝图类"
- 选择"Actor"作为父类
- 命名为"BP_InteractiveChest"
2. 添加组件
- 添加"Static Mesh"组件作为宝箱模型
- 添加"Box Collision"组件作为碰撞检测
- 设置碰撞组件大小包围宝箱
3. 创建变量
- bIsOpened (Boolean) - 宝箱是否已开启
- ItemName (String) - 物品名称
- ItemCount (Integer) - 物品数量
4. 实现交互逻辑
添加事件
- 在碰撞组件上添加"OnComponentBeginOverlap"事件
- 检查重叠的Actor是否为玩家
- 显示交互提示
添加输入事件
- 添加"E"键输入事件
- 检查玩家是否在交互范围内
- 检查宝箱是否已经开启
开启宝箱逻辑
1. 设置bIsOpened为True
2. 播放开启动画
3. 播放音效
4. 给玩家添加物品
5. 隐藏交互提示
5. 蓝图节点示例
Event BeginPlay
└── Set bIsOpened (False)
└── Set ItemName ("金币")
└── Set ItemCount (100)
OnComponentBeginOverlap
└── Branch (Other Actor == Player?)
├── True: Show Interaction UI
└── False: (Do Nothing)
Input Action E
└── Branch (Player in Range?)
├── True:
│ └── Branch (Not bIsOpened?)
│ ├── True:
│ │ ├── Set bIsOpened (True)
│ │ ├── Play Animation
│ │ ├── Play Sound
│ │ └── Give Item to Player
│ └── False: Print "Already Opened"
└── False: (Do Nothing)
调试技巧
断点调试
- 在节点上右键选择"添加断点"
- 运行游戏时会暂停在断点处
- 可以查看变量值和执行流程
打印调试
- 使用"Print String"节点输出调试信息
- 可以显示在屏幕上或输出日志
变量监视
- 在"我的蓝图"面板中可以监视变量值
- 运行时实时显示变量变化
性能优化
事件图表优化
- 避免在Tick事件中进行重复计算
- 使用定时器代替频繁的Tick检查
- 合理使用事件分发器
变量优化
- 选择合适的数据类型
- 避免不必要的类型转换
- 使用对象池减少创建销毁开销
蓝图编译优化
- 避免循环引用
- 减少蓝图之间的强依赖
- 使用接口提高解耦性
最佳实践
命名规范
- 蓝图类:BP_ClassName
- 变量:bIsActive, PlayerHealth, CurrentLevel
- 函数:GetPlayerHealth, SetWeaponDamage
- 事件:OnPlayerDeath, OnLevelComplete
代码组织
- 使用注释节点说明复杂逻辑
- 将功能拆分成小函数
- 使用折叠图表整理相关节点
- 保持图表整洁,避免连线交叉
架构设计
- 使用组件化思想设计蓝图
- 通过接口实现不同类的通信
- 使用事件分发器解耦系统
- 合理使用继承关系
进阶主题
蓝图通信
- 直接引用:直接调用其他蓝图的函数
- 类型转换:将通用类型转换为特定类型
- 接口:定义通用的函数签名
- 事件分发器:广播事件给多个监听者
- 蓝图函数库:创建全局可用的工具函数
数据驱动设计
- 使用数据表格存储配置数据
- 创建数据资产蓝图
- 使用结构体组织复杂数据
- 实现可配置的游戏机制
与C++集成
- 在C++中暴露函数给蓝图
- 创建可以在蓝图中继承的C++类
- 使用蓝图可调用函数(UFUNCTION)
- 理解蓝图编译过程
总结:蓝图系统是虚幻引擎的核心特性之一,掌握蓝图可以让你快速实现游戏功能。从简单的交互开始,逐步学习复杂的系统设计,多实践是掌握蓝图的关键。