调试与迭代技巧
骨架能跑只是开始,迭代效率决定它用得爽不爽。
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 生效",迭代最快。
