蓝图是虚幻引擎 5 的可视化脚本系统,通过节点图而非传统代码实现游戏逻辑。其优势包括:
无需编程经验:美术师、设计师可直接参与逻辑开发。
快速迭代:可视化界面降低调试成本,支持热重载。
与 C++ 无缝集成:可继承 C++ 类并扩展功能,或直接调用 C++ 函数。
完整功能覆盖:支持事件处理、变量管理、AI 行为树、动画蓝图等。
事件图表是蓝图的核心执行逻辑,基于 事件驱动 机制:
事件触发:如 Event BeginPlay( Actor 生成时触发)、Event Tick(每帧触发)。
节点执行:事件触发后,按节点连接顺序从左到右、从上到下执行。
数据流与控制流:
公开变量(Public Variables):
在源蓝图中标记变量为 Public,在目标蓝图中通过 Get Reference to Actor + Variable 节点访问。
事件调度器(Event Dispatchers):
在源蓝图中定义事件,目标蓝图通过 Bind to Event 监听并响应。
GameInstance 或 Singleton:
将共享数据存储在全局单例对象(如 GameInstance)中,通过 Get Game Instance 节点访问。
角色移动:
使用 Character Movement 组件(默认包含在 Character 类中)。
通过 Input Axis 绑定移动输入(如 Move Forward/Backward)。
使用 Add Movement Input 节点将输入转换为移动。
跳跃:
通过 Input Action 绑定跳跃键(如 Space)。
使用 Jump/Stop Jumping 节点控制跳跃行为。
示例蓝图片段:
Event Tick → Get Character Movement → Set Max Walk Speed → [值]
Event Jump → Get Character Movement → Jump
减少节点复杂度:
将复杂逻辑拆分为子函数(Function)或宏(Macro),减少单帧计算量。
控制事件触发频率:
避免在 Event Tick 中执行耗时操作,改用定时器(Timer)或条件触发。
使用 Tick Enabled 动态启用 / 禁用组件更新。
内存管理:
及时释放不再使用的对象引用(如通过 Clear 节点清理数组)。
使用 Weak Reference 避免循环引用导致的内存泄漏。
调试工具:
使用 Performance Monitor 分析蓝图执行耗时,重点优化高成本节点(如复杂计算、射线检测)。
方法 1:使用 Branch + 变量判断(简单状态)
Event Tick → Get Current State → Branch → [根据状态执行不同逻辑]
方法 2:使用 状态机节点(State Machine)
在蓝图中添加 State Machine 组件。
定义状态(如 Idle、Walking、Running)和转换条件。
在各状态中实现独立逻辑(如动画、移动速度)。
加载资源:
使用 Async Load Asset 节点异步加载资源,通过 Completed 输出引脚处理加载完成事件。
Async Load Asset → [资源路径] → On Completed → [使用加载的资源]
网络请求:
通过 HTTP Request 节点发送请求,通过 Response Received 事件处理返回数据。
HTTP Request → Set URL → Send → On Response Received → [解析数据]
创建粒子系统:
使用 Particle System Component,并设置 Collision 属性为 Query Only 或 Block All。
物理交互:
通过 Event Hit 或 Event Particle Collision 捕获碰撞事件,然后使用 Add Force 或 Apply Damage 等节点实现物理响应。
Event Particle Collision → Get Hit Actor → Add Force → [方向/强度]
检查被引用的蓝图或类是否存在、是否被正确命名。
若引用的是 C++ 类,确保类已编译且头文件正确包含。
使用 Refresh Node 按钮刷新节点引用,或删除并重新创建引用节点。
使用 Print String 节点输出调试信息,确认执行路径。
在 Event Graph 中右键点击节点,选择 Breakpoint 添加断点,使用调试工具(如 Debugger)逐行执行。
检查节点间的连线是否正确,特别是控制流(如 Branch 的 True/False 输出)。
从蓝图调用 C++:
在 C++ 类中声明 UFUNCTION(BlueprintCallable) 标记的函数,在蓝图中通过 Call Function 节点调用。
从 C++ 触发蓝图事件:
在 C++ 中声明 DECLARE_DYNAMIC_MULTICAST_DELEGATE,并在蓝图中绑定事件处理函数。