蓝图层:技能表现与配置

C++ 骨架搭好后,加一个新技能全过程不超过 5 分钟。以"火球术"为例:

第 1 步:新建数据资产

内容浏览器右键 → Miscellaneous → Data Asset → 选 SkillAsset → 命名 SA_Fireball:

  • Cooldown: 3.0
  • ManaCost: 15
  • BaseDamage: 35
  • SkillVisualClass: BP_Skill_Fireball(软引用)

第 2 步:做表现蓝图

新建 BP_Skill_Fireball,父类是 C++ 的 ASkillVisualBase。连两个事件:

Event OnCastStart
   → Play Montage(前摇动画,带 Notify)
Event OnCastHit(Anim Notify 触发)
   → Spawn Niagara(NS_Fireball_Hit,挂在武器插槽)
   → Play Sound(Fire_Explosion)
   → 调用组件的 ApplySkillDamage()  ← C++ 结算
Event OnCastEnd
   → 销毁自己 / 播后摇

第 3 步:装备

角色蓝图的 SkillComponent 的 EquippedSkills 数组里加入 SA_Fireball。完事——没有一行 C++ 代码是新写的。

这套结构的红利

改动需求 谁来做 需要程序参与吗
火球伤害 35 → 50 策划改 SA_Fireball 否
火球特效换个颜色 美术换 Niagara 否
火球前摇快 0.2s 美术改蒙太奇 否
加一个新技能"冰锥" 策划+美术(各建一个资产+蓝图) 否
冷却支持"减 CD 属性" 程序改 SkillComponent 是(一处,全局生效)

一个例外:纯弹道技能

"火球要飞行、命中才炸"这种需要移动与碰撞的,更适合做成 ProjectileMovementComponent + Sphere Collision 的 Actor(表现蓝图里挂在基类下)。飞行与命中判定交给引擎的移动组件(第 4 章的 Tick 替代),别自己在 Tick 里写移动。

蓝图层要注意的三条纪律

  1. 不在蓝图里写伤害数字(数值只在数据资产里);
  2. 不在蓝图里做伤害结算(结算走 C++ 的 IDamageable 接口);
  3. 蓝图只做"播什么"(蒙太奇、特效、音效、插各自的组件)。

本章小结

  • 加新技能 = 建数据资产 + 建表现蓝图 + 装备,全程不动 C++。
  • 需求改动被路由到正确的角色:数值→策划、表现→美术、框架→程序。
  • 弹道类用 ProjectileMovementComponent,别自己 Tick 写移动。