蓝图与 C++ 的边界

自动关联目录:蓝图与 C++ 的边界

官方依据:Blueprints Visual Scripting(已核实):Blueprint 是完整的脚本系统,用于定义 OO 类或对象;C++ 实现中的 Blueprint 专用标记让程序员能创建可被设计者扩展的基线系统。

1. 定位

"这段逻辑写蓝图还是写 C++"是 UE 项目里最早、影响最久的一个决定。

一句话定位:不是二选一,而是分层——C++ 提供基线与可反射的接口,蓝图在其上做扩展与调整。官方那句"程序员创建基线系统、设计者扩展"就是这个意思。

2. 判断标准

维度倾向 C++倾向蓝图
迭代速度慢(要编译)快(改完即测)
热路径每帧高频调用 → C++事件驱动、低频 → 蓝图
复杂度复杂算法、数据结构流程编排、状态切换
谁维护程序员设计者/美术
调试断点、栈、asan可视化、但难定位底层问题
合并冲突文本,可 diff二进制,冲突难解
重构工具支持好弱

三条实用规则:

  1. 每帧跑的、成规模计算的 → C++(蓝图每帧 Tick 的开销明显)
  2. 需要频繁改的、参数与流程 → 蓝图
  3. 需要暴露给非程序员调的 → 蓝图,但底层实现放 C++

3. 推荐的协作模式

C++ 层(基线)
   ├─ 数据结构与算法
   ├─ 性能敏感的逻辑
   └─ 用 UFUNCTION/UPROPERTY 暴露可扩展点
              │
蓝图层(扩展)
   ├─ 继承 C++ 基类
   ├─ 覆写 BlueprintImplementableEvent / BlueprintNativeEvent
   └─ 调整参数与流程

这就是官方说的"baseline systems that can be extended by designers",具体手段见 蓝图与 C++ 互调。

4. 常见的错误决定

错误后果
把整个游戏逻辑写进蓝图后期性能与维护都失控
所有东西都写 C++迭代慢,设计者无法参与
蓝图里做重算法慢,且难调试
蓝图频繁 Tick每帧成本(见 蓝图性能与优化)
C++ 与蓝图职责不清两边都有逻辑,改一处漏一处

5. 代价与权衡

设计收益代价什么时候不该用
C++ 做基线性能与可维护性迭代慢还在探索阶段的玩法不该先写 C++
蓝图做扩展迭代快、非程序员可参与性能与合并冲突稳定下来的热路径应下沉到 C++
全蓝图起步最快后期债长周期项目不该
全 C++最可控迭代慢需要设计者频繁调参时不行

6. 踩坑与排查

坑现象怎么验证
蓝图里写了重算法帧率掉看蓝图耗时;下沉到 C++
蓝图大量 TickGame 线程高减少 Tick,改事件驱动
多人改同一蓝图合并冲突拆分蓝图,或把常量移到数据资产
逻辑散在两边改一处漏一处明确分层,写入口点
早期全蓝图后期无法优化早期就规划哪些是热路径

参考