蓝图可继承的 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 上,蓝图子类继承它、也可覆盖它。这套机制让"每个敌人都有基础攻击力,具体怪物可微调"天然成立:
AEnemyBase里EditDefaultsOnly的AttackPower = 10;BP_Orc的 Details 面板改成 25;- 运行时
Orc->AttackPower就是 25,没改的 Goblin 还是 10。
给蓝图"留口子"的三层设计
一个针对策划友好的 C++ 类通常长这样:
C++ 基类
├─ 规则函数(私有/保护,不可改) ApplyDamage()
├─ 可重载事件(BlueprintNativeEvent) OnDeath / OnHit
├─ 可调用工具(BlueprintCallable) ResetHealth / GiveXP
└─ 数据槽(EditDefaultsOnly) 数值、蒙太奇、音效引用
这个"骨架"做好了,策划加一个新怪物 = 建蓝图 + 填数值 + 连两个事件,五分钟完成。
本章小结
UCLASS(Blueprintable)让 C++ 类可被蓝图继承,是复用的主要手段。- C++ 基类管"框架行为",蓝图基类管"频繁调整的表现"。
- CDO +
EditDefaultsOnly实现"基类默认值、子类可覆盖"的配置流。 - 一个"骨架完整"的 C++ 类 = 私有规则 + 可重载事件 + 可调用工具 + 数据槽。
