143の改善でゲームが生まれ変わった — AIゲーム開発のQuality Loopシステム
Spell Cascade(itch.io公開中のブラウザゲーム)をv0.3.4からv0.8.3まで引き上げた際に、143の個別改善を段階的に積み上げるQuality Loopという手法を使った。その設計と代表的な実装例を紹介する。
Quality Loopとは
「動くものを作る → 品質を数値で測る → 改善を1つ入れる → 再計測」を繰り返すプロセス。
1ループ = 1つの改善(コード変更 + 動作確認 + 数値記録)
これを143回繰り返した。
4つのLoop(改善の分類)
| Loop | 改善数 | テーマ |
|---|---|---|
| Loop 1 | 改善1-20 | 宮崎英高式基礎固め(読める情報、読めない情報の整理) |
| Loop 2 | 改善21-50 | Steam-grade Polish(ヒットストップ、シェイク、SE連動) |
:::details 初心者向け: ヒットストップ・シェイクとは
ヒットストップは、攻撃が当たった瞬間にゲーム画面が一瞬だけ止まる演出。格闘ゲームやアクションゲームで「手応え」を感じさせる定番テクニック。シェイクは画面を小刻みに振動させる演出で、爆発や大ダメージの衝撃を体感させる。どちらも0.03〜0.1秒程度のごく短い演出だが、あるのとないのでは気持ちよさが全く違う。
:::
| Loop 3 | 改善77-100 | VFXシステム構築(パーティクル、リング、フラッシュ) |
:::details 初心者向け: VFX・パーティクルとは
VFX(Visual Effects)はゲーム中の視覚効果全般のこと。パーティクルは小さな粒子をたくさん飛ばして火花・煙・爆発などを表現する仕組み。花火を思い浮かべるとわかりやすい。1つ1つの火花は単純だが、大量に組み合わせることで華やかな演出になる。
:::
| Loop 4 | 改善101-143 | ジュース感最終強化(コンボ演出、ボスエフェクト、弾道) |
代表的な実装3選
改善130: コンボブレーク時のシェイク
コンボが途切れた「喪失感」を画面振動で体感させる。
# 改善130: 高コンボブレーク時のシェイク(15連続以上が途切れた瞬間の喪失感を体感させる)
if count >= 15 and is_instance_valid(tower):
tower.shake(3.5)
elif count >= 8 and is_instance_valid(tower):
tower.shake(2.0)
設計の考え方: コンボ数に応じてシェイク強度を変える。15コンボ以上の喪失は「大きく揺れる」、8コンボは「軽く揺れる」。情報量の重さと振動強度が比例する。
改善133: 高XP敵の大デスリング
強敵を倒した時の「達成感」を空間的な広がりで表現する。
# 改善133: 高XP敵(tank/boss等)の大きなデスリング(「強敵を倒した」を空間で表現)
if is_instance_valid(enemy) and "xp_value" in enemy and enemy.xp_value >= 3:
var big_ring := Polygon2D.new()
# ...
big_ring.color = Color(1.0, 0.6, 0.15, 0.85) # 橙: 強敵撃破の達成感
var brt := big_ring.create_tween() # Tweenについては下の解説を参照
brt.set_parallel(true)
brt.tween_property(big_ring, "scale", Vector2(5.5, 5.5), 0.4)
brt.tween_property(big_ring, "modulate:a", 0.0, 0.4)
:::details 初心者向け: Tween(トゥイーン)とは
ある値を指定した時間をかけて滑らかに変化させる仕組み。アニメーションの基本技術だ。例えば「0.4秒かけてリングを5.5倍に拡大しながら透明にする」をコード2行で実現できる。手でアニメーションの各コマを作る必要がなく、開始値と終了値を指定するだけで中間の動きを自動補間してくれる。
:::
設計の考え方: 通常の敵(白いデスリング・小)と高XP敵(橙のデスリング・大)で差別化。色と大きさが「この敵は強かった」という情報を伝える。
ヒットストップ: コンボに応じた停止感の変化
var hitstop_dur := 0.03
if combo_count >= 30:
hitstop_dur = 0.06 # 高コンボ: より重い停止感
elif combo_count >= 10:
hitstop_dur = 0.045
_do_hitstop(hitstop_dur)
設計の考え方: ヒットストップは0.03〜0.06秒の微差だが、体感的な「重さ」に明確な差が出る。コンボが高いほど重い停止感 = 攻撃の「価値」が上がる演出。
Run Desire スコアの変化
品質計測に使用した指標「Run Desire」(もう一度やりたい度)の変化。レストランの「もう一度来たいですか?」アンケートのゲーム版だと思えばいい:
| バージョン | Run Desire | 状態 |
|---|---|---|
| v0.3.3 | 0.48 | WARN |
| v0.3.4 | 0.79-0.94 | GOOD〜EXCELLENT |
143の改善を積み上げた後の計測では、この数値がさらに改善されている。
まとめ
- 「大きなリファクタ」より「1つの改善を143回」の方が確実に品質が上がる
- 各改善に理由をコメントで残す(
# 改善130: ...形式) - 品質は主観だが、計測可能な代理指標(Run Desire等)で客観化できる
品質ゲートの設計については、dev.toの記事 → Why Your AI Agent Needs a Quality Gate (Not Just Tests)
Spell Cascade(ブラウザで遊べるSpell Cascadeはこちら): https://yurukusa.itch.io/spell-cascade
Claude Codeのトークン消費、把握できていますか?
143回の改善ができたのは、AIの動きを可視化する仕組みがあったから。トークンがどこで消えているか分からないまま使い続けていませんか?
Claude Codeを本番品質にする — hook設計・運用ガイド(第3章まで無料)
関連記事
- Claude Codeを108時間無人で走らせて起きた全事故と、そこから作った安全装置
- Anthropic公式「Skills完全ガイド」 — CLAUDE.mdとSkillsの設計パターン
- 非エンジニアがPython+Pygameでローグライクを作った全記録