目录

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. 底层需求:需要调用第三方库