蓝图可继承的 C++ 基类

混合开发里"复用"的主要手段是让具体蓝图继承一个 C++ 基类。做法是给 UCLASS 加 Blueprintable:

UCLASS(Blueprintable)      // 允许蓝图继承此类
class AMyEnemy : public ACharacter
{
    GENERATED_BODY()

public:
    // 蓝图可重载的行为模板
    UFUNCTION(BlueprintNativeEvent, Category="AI")
    void OnSpawn();

    // 暴露的属性
    UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Stats")
    float AttackPower;
};

在内容浏览器里"新建蓝图类",选 MyEnemy 作父类,就能做出 BP_Goblin、BP_Orc……每个子蓝图填自己的数值与表现,公共规则在 C++ 基类一份。

与"蓝图继承蓝图"的取舍

C++ 基类 蓝图基类
性能 原生方法调用,快 虚函数走 VM,慢
修改后 需要编译(可能重启) 秒级生效
适合 稳定的框架行为 频繁调整的表现层

经验:框架层用 C++ 基类,表现层用蓝图基类。例如"所有敌人共享的 AI 规则"放 AEnemyBase(C++);"所有近战武器共享的通用表现"放 BP_WeaponMeleeBase(蓝图)。

CDO 与 EditDefaultsOnly 的配合

CDO(Class Default Object)是每个类的一个"默认实例"。EditDefaultsOnly 属性存在 CDO 上,蓝图子类继承它、也可覆盖它。这套机制让"每个敌人都有基础攻击力,具体怪物可微调"天然成立:

  1. AEnemyBase 里 EditDefaultsOnly 的 AttackPower = 10;
  2. BP_Orc 的 Details 面板改成 25;
  3. 运行时 Orc->AttackPower 就是 25,没改的 Goblin 还是 10。

给蓝图"留口子"的三层设计

一个针对策划友好的 C++ 类通常长这样:

C++ 基类
 ├─ 规则函数(私有/保护,不可改)      ApplyDamage()
 ├─ 可重载事件(BlueprintNativeEvent)  OnDeath / OnHit
 ├─ 可调用工具(BlueprintCallable)     ResetHealth / GiveXP
 └─ 数据槽(EditDefaultsOnly)          数值、蒙太奇、音效引用

这个"骨架"做好了,策划加一个新怪物 = 建蓝图 + 填数值 + 连两个事件,五分钟完成。

本章小结

  • UCLASS(Blueprintable) 让 C++ 类可被蓝图继承,是复用的主要手段。
  • C++ 基类管"框架行为",蓝图基类管"频繁调整的表现"。
  • CDO + EditDefaultsOnly 实现"基类默认值、子类可覆盖"的配置流。
  • 一个"骨架完整"的 C++ 类 = 私有规则 + 可重载事件 + 可调用工具 + 数据槽。