调试与迭代技巧

骨架能跑只是开始,迭代效率决定它用得爽不爽。

1. 用 CallInEditor 做测试按钮

在 SkillComponent 里:

UFUNCTION(BlueprintCallable, CallInEditor, Category="Debug")
void ForceResetCooldowns();   // Details 面板出现按钮

策划测试技能连招时不用等冷却,点一下按钮即可。

2. 用 Blueprint 命令行调试

编辑器运行时按 ~ 可以执行自定义 ExecuteConsoleCommand,但更常用的是:

  • stat Blueprint — 看蓝图 VM 开销;
  • stat Game — 看 Tick 与游戏线程;
  • showdebug ability(GAS 体系)/ 自定义 showdebug(在 C++ 里用 ShowFFlag 注册)。

3. 临时可视化

在 C++ 里写 DrawDebugString / DrawDebugSphere(用 CVariate 开关控制),技能范围、伤害半径直接画在场景里,策划调数值时所见即所得。

4. 日志

UE_LOG(LogSkillSystem, Log, TEXT("Cast %s, dmg=%.1f"), *Asset->GetName(), Asset->BaseDamage);

LogSkillSystem 是自定义 Category(DECLARE_LOG_CATEGORY_EXTERN)。运行时用 -LogCmds="log SkillSystem Verbose" 过滤输出。养成日志带上下文的习惯(哪个技能、哪个对象、什么数值)。

5. 网络调试

多人游戏里技能最常见的 bug 是"只在施法者本地生效"。排查流程:

"只有我能看到火球" ──→ 生成表现蓝图的地方是否在 Server 执行?
                     → SpawnActor 应在 Server,表现由 Replication 或 Client RPC 下发
"我打了朋友但没伤害" ──→ 伤害结算是否在 Server?(Server 权威)

回忆第 3 章末尾:规则在 C++ 的大量好处之一,就是网络化时改动集中。

6. 一个小巧的迭代习惯

策划调数值时,让编辑器保持运行(PIE),数据资产修改后重启 PIE 就生效(资产会重新加载)。这个"改数据 → 重启 PIE → 看"的循环,比"改蓝图 → 编译 → 看"还要快,因为 DataAsset 不需要编译蓝图。

本章小结

  • 调试三件套:CallInEditor 测试按钮、stat/showdebug 命令、DrawDebug 可视化。
  • 自定义日志 Category + 上下文信息,定位问题效率翻倍。
  • 网络化常见 bug 的排查路径:先问"这段逻辑在 Server 还是 Client"。
  • DataAsset 数值可"运行中改、重启 PIE 生效",迭代最快。