【個人ゲーム開発24日目】戦術SLG制作

結果&ブリーフィングシーン演出完成

画面が「ゲームらしく」なってきた日

今日は演出強化に集中しました。
結果シーン・ブリーフィングシーンの両方をポリッシュして、それぞれ「完成」と言える状態まで持っていけました。
数値が勢いよくカウントアップされたり、要素が順番にスライドインしてきたり、
画面を見るたびに「これはゲームだ」という感覚が強くなっています。


■ 結果シーンの演出強化

カウントアップ演出の実装

これまで一瞬で表示されていた数値に、カウントアップ演出を追加しました。
ターン数 → 残ユニット数 → 残戦力値の順に順次カウントアップします。

工夫した点が一つあります。
ターン数やユニット数のカウント間隔は、実際の数値に比例して自動計算しています。
ターン数が5なら5回、ユニット数が3なら3回きっちりSEが鳴るイメージです。
一方、戦力値は桁が大きいので固定間隔でピロピロと鳴り続ける形にしました。
この使い分けが地味に効いています。

カウントアップにはSEも実装しました。
カウント中のピロ音と、完了時の確定音の2種類です。
SceneSEControllerのキー文字列で管理しているので、素材が揃ったらいつでも差し替えられます。

ランク画像のフェードイン演出

カウントアップが全部終わったタイミングで、ランク画像がドーンと登場します。
スケール大→等倍へ縮みながらフェードインするEaseOutQuadのアニメーションです。
テキストで「A」と出るより、ずっと達成感が出ますね。

勝敗表示のイメージ化

「MISSION COMPLETE」「MISSION FAILED」のテキスト表示を廃止して、
専用ラベル画像に切り替えました。
金属プレート風のデザインで、勝利時と敗北時で雰囲気が変わります。

完成した結果シーンはこんな感じです。

デバッグ機能の追加

戦闘結果データを得てからでないと動作確認できない、というのが地味に不便だったので、
ResultScene単体で再生したときに自動でダミーデータをセットする機能を追加しました。
#if UNITY_EDITOR で囲んでいるので、ビルド時には完全に消えます。
こういう小さな開発体験の改善が積み重なって効いてきます。


■ ブリーフィングシーンの演出強化

段階的登場演出の実装

これまで一瞬で全部表示されていたブリーフィング画面に、段階的な登場演出を追加しました。

  1. タイトル:上からスライドイン
  2. ステージイラスト:左からスライドイン → フェードイン
  3. ストーリーテキスト:右からスライドイン → フェードイン
  4. 戦力情報枠:フェードイン → カウントアップ
  5. ボタン類:出撃ボタンは右下から、戻るボタンは右上から斜めにスライドイン

左右から交互に入ってくる動きが、ちょっとした緊張感を演出しています。

戦力カウントアップ演出

ブリーフィング画面の戦力情報でもカウントアップを実装しました。
こちらは少し凝った仕様になっています。

敵味方を同時にカウントスタートして、戦力値に比例した時間でカウントが終わるという動きです。
つまり敵が強いステージほど、敵側の数字がなかなか止まらない。
「こいつら強いぞ…」という緊張感が自然と演出できます。
数字を調整してみたところ、初級ステージと最終ステージで
全然違う雰囲気になって良い感じです。

完成したブリーフィングシーンはこんな感じです。


■ バグ修正

Stage1のベストランクが表示されない

ステージ選択画面でStage1だけランクが「-」になるバグがありました。
原因はSystemSaveData.GetRank()内の判定ロジックです。

// 問題のあったコード
if (record.stageNum == 0) return "-";

FirstOrDefaultでレコードが見つからない場合、structのデフォルト値が返りstageNumが0になります。
ところがStage1のstageNumも0始まりで0なので、記録があっても「未記録」と判定されていました。
Stage2以降(stageNum 1〜)は影響なし、という実に分かりやすいインデックスのワナです。

// 修正後
if (!bestRecords.Exists(r => r.stageNum == stageNum)) return "-";

存在チェックを先に行う形に変更して解決しました。

ConfirmDialogがヒエラルキー非表示時に動作しない

編集中に邪魔なのでヒエラルキーでConfirmDialogプレハブを非表示にしておくと、
実行時にダイアログが表示されない問題がありました。
原因はプレハブのルートごと非アクティブにするとAwakeが呼ばれないため、
Instanceがnullのままになること。

解決策はシンプルで、ルートは常にアクティブにして、子オブジェクト(DialogContent)を非アクティブにする構成に変更しました。
他のパネル類が同じ構成で問題なく動いていたので、これに合わせた形です。


■ エンディングシーンの仮実装

結果・ブリーフィングが完成したので、エンディングシーンにも着手しました。
Animationによる仮実装を全面的にコルーチンスクロール方式に書き直しています。

エンドロールの内容はこんな構成を予定しています。

  • MISSION RESULTS:全ステージのベスト成績をセーブデータから自動取得
  • STAFF:制作者・BGM/SE提供元・AI活用(Claude/ChatGPT/Gemini)クレジット
  • SPECIAL THANKS
  • FIND US:ブログ・Steamページ等
  • Thank you for playing. ― FIN ―

スクロール完了後にタイトルへ戻るボタンが表示される仕様です。
デザインと内容の肉付けは後日行います。

AI活用についてクレジットに明記するのは、今の時代の誠実な作り方かなと思っています。


■ シーン完成状況

シーン状況
タイトル✅ 完成
ブリーフィング✅ 完成(本日)
戦術(メインゲームプレイ)🔧 実装中
結果✅ 完成(本日)
エンディング⚠️ 仮実装

執筆後記
今日は「演出を作る楽しさ」を久しぶりに味わえた気がします。
数値がカウントアップされる、要素が順番に登場する、
そういう小さな演出の積み重ねでゲームの「体験」が大きく変わりますね。
特にブリーフィングの戦力カウントアップは、
仕様を考えている段階から「絶対面白くなる」と確信していた部分で、
実際に動かしてみてその通りになったので満足しています。
残るは戦術シーンの仕上げとエンディングの肉付け。
デモ版完成まで、もうひと踏ん張りです。