# Unreal 干嘛要弄出个蓝图？


## ***前言***

*在虚幻引擎（Unreal Engine）的社区里，有一个话题永远能引发热议：“我是不是应该只学 C++？”或者“只用蓝图能做大作吗？”*

*很多初学者甚至经验丰富的开发者都会把 C++ 和蓝图看作对立关系。但事实上，Epic Games 设计蓝图的初衷，并非为了取代 C++，而是为了构建一种**双向驱动的混合架构**。*

*今天我们就来深入探讨：虚幻为什么要出蓝图？它们各自的优劣在哪？以及，官方最推荐的“金字塔”合作模式是什么。*

## ***虚幻为什么要出蓝图***

*在 UE3 时代，虚幻使用一种叫 UnrealScript 的脚本语言。虽然它也是代码，但它面临着两个尴尬：对于程序员来说不够快，对于设计师来说门槛又太高。*

*蓝图（Blueprints Visual Scripting）诞生的核心目的有三点：*

1. *降低学习门槛*

   *让美术、关卡设计师、音效师能够直接参与逻辑实现。如果一个设计师想改一下开门的速度，他不需要去求程序员改代码再等半小时编译，他可以自己连线。*

   *降低了程序的工作压力，因为有很多业务逻辑可以让策划去试，去写*

   *并且可以做到宣传推广作用，让小白也可以更容易的做自己喜欢的游戏*

2. *极致的编译速度*

   *C++ 的编译时间是开发者的噩梦。蓝图支持实时修改、立即生效。这种“所见即所得”的特性，让策划的效率提升了数倍。*

3. *视觉化的思维表达*

   *人类的大脑处理流程图的速度远快于处理几千行纯文本。对于像 AI 行为树、UI 逻辑、动态效果触发这类“事件驱动”的逻辑，连线图比代码更直观*

*（拓展）在UE6，Unreal会用 Verse 这个语言，但是他的旨意是保持不错的性能并且同时降低开发者的学习门槛*

## ***Cpp VS 蓝图***

*这是性能差距的根本来源。*

- *C++（原生码）：当你点击编译 C++ 时，编译器（如 MSVC）会将代码直接翻译成 机器指令。当你运行游戏时，CPU 直接读取这些指令并执行。比如一个加法运算，CPU 只需要一个时钟周期就能完成。*
- *蓝图（字节码）：蓝图编译后生成的是 虚幻字节码（Unreal Bytecode）。当游戏运行时，CPU 并不是直接读蓝图，而是运行着一个 “蓝图虚拟机（Blueprint VM）” 的程序。虚拟机读取字节码，查表找到对应的 C++ 函数，然后再执行。*

*比喻：*

- *C++ 就像是你直接用母语和别人交流，即说即懂。*
- *蓝图 就像是你带着一个同声传译。虽然对方也能听懂，但每说一句话，翻译官都要查字典、组织语言，这中间的转换开销就是性能损耗的来源。*

*蓝图最吃性能的地方，不是节点内部的逻辑，而是节点与节点之间的连接。*

*蓝图的本质：每一个蓝图节点（如 GetActorLocation）本质上都是一个被包装好的 C++ 函数。*

*切换开销：从虚拟机状态切换到 C++ 状态执行函数，再切换回虚拟机查找下一个节点，这个过程被称为“上下文切换”。*

*累积效应：如果你在蓝图里写了一个复杂的计算，用了 50 个节点。那么 CPU 就要进行 50 次虚拟机到 C++ 的往返跳跃。对于 C++ 来说，这 50 行代码只是它流水线上的一个瞬间；但对于蓝图，这 50 次跳跃产生的开销远比计算本身要大。*

| *维度*     | *C++*                                                        | *蓝图*                                                       |
| ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| *性能*     | *极强。原生机器码执行，适合复杂算法、每帧高频计算（Tick）*。 | *一般。运行在虚拟机上，比 C++ 慢 10-100 倍。适合触发式、低频逻辑。* |
| *开发效率* | *慢。涉及修改头文件时需要漫长的编译等待。*                   | *极快。支持运行时热修改，即时反馈。*                         |
| *可维护性* | *高。纯文本格式，Git 对比/合并极其清晰；重构工具多；架构严谨。* | *低。二进制格式，版本管理工具难以对比；复杂后易变“面条代码”。* |
| *上手门槛* | *高。需要理解内存管理、指针、以及虚幻复杂的宏系统（UHT）。*  | *低。节点化操作，不需要背语法。*                             |

## ***使用场景***

*Epic 官方和资深开发者最推荐的合作模式，通常被称为“C++ 搭建骨架，蓝图填充血肉”。*

*c++ 负责底层*

- *基础父类：定义角色的基类、属性系统（GAS）、核心接口。*
- *复杂运算：涉及大量循环、数学计算、寻路逻辑。*
- *数据结构：定义 UDataAsset 和 UStruct，确保数据的底层安全性。*
- *网络同步：RPC 调用和属性复制（Replication）在 C++ 中更稳健、性能更高。*

*蓝图负责“轻活”与“细节”*

- *子类化扩展：C++ 写好 BaseCharacter，蓝图继承它并配置不同的模型、材质、音效。*
- *表现层逻辑：播放特效、触发粒子、UI 界面逻辑、关卡内的简单机关。*
- *数值微调：策划通过蓝图细节面板调整走速、血量，无需触碰代码。*

*总结一下，就是表现层都在蓝图写。对于数据，咱们都在c++中去写。策划需要的功能，程序在c++写好函数，给策划在蓝图提供使用。*

## ***什么时候需要从蓝图重构成Cpp***

1. *性能瓶颈：比如通过分析器发现某个蓝图节点的Tick吃了很多cpu时间*
2. *逻辑爆炸：一个蓝图屏幕已经装不下了，看的密密麻麻*
3. *多人协作困难：多个人需要同时修改一份文件，合并不了*
4. *底层需求：需要调用第三方库*

