【開発[#2] 30日目】戦略SLG


■ 24〜30日目のまとめ

今回は7日分をまとめて記録する。

前回(23日目)でメインシーンの「見る」部分がほぼ出揃った。今回はそこから「動かす」へ向けた地ならしの期間となった。コマンド確認パネル群の実装、Panel_CommandInterfaceの本実装と仕上げ、武将・勢力情報表示の拡充、状態レベル設計の大きな見直し、数値変動演出システムの新規導入、多言語化の不具合対応、そしてコマンドボタンのデザイン適用までを進めた。

最優先課題であるフェーズ管理の本実装は次回へ持ち越しとなったが、その前に「フェーズ管理に集中できる土台」を整えることに注力した7日間だった。


■ 24日目(5/19):コマンド確認パネル群の設計確定・モック実装

確認パネルを7種に分離

コマンドを実行する前に表示する確認パネルを、入力要素の組み合わせごとに7種類へ分離する方針を確定した。1枚に共通化しようとすると無理が出る組み合わせがあり、また作業単位を細かく分けたかったためである。

  • Panel_CommandConfirm:OK/Cancelのみ
  • Panel_CommandConfirmGold:資金INPUT + OK/Cancel
  • Panel_CommandConfirmFaction:勢力SELECT + OK/Cancel
  • Panel_CommandConfirmGoldFaction:資金INPUT + 勢力SELECT + OK/Cancel
  • Panel_CommandConfirmOfficer:他勢力武将SELECT + OK/Cancel
  • Panel_CommandConfirmMarch:経路SELECT + 兵数INPUT + OK/Cancel
  • Panel_CommandConfirmReinforce:迎撃/援軍SELECT済 + 兵数INPUT + OK/Cancel

7種すべてをSlidePanelBase継承でモック実装し、Show(コールバック)とHide()のみ実装した。本実装は後回しとした。

ManagerMain対応

7つの確認パネルのSerializeFieldを追加し、InitializeUI()でまとめて初期化する仕組みを入れた。確認パネルの表示・非表示を一元管理するOpenConfirmPanel()/CloseConfirmPanel()を追加し、ViewCommandConfirm状態から右クリック短押しでConfirmパネルを閉じてViewCommandInterface状態へ戻る導線も整えた。

コマンド挙動仕様の確定

通常コマンド・解雇・褒賞それぞれのOK/Cancel時の挙動を確定した。特に褒賞は「OKで忠誠度を即変更(資金10消費・入力なし)、パネルは閉じずそのまま」「コマンド入力済でも褒賞未実行なら実行可能」という特殊仕様を明文化した。Done済カードをクリックしたときはShowReadOnly()で閲覧専用表示を出す方針とした。

BGM方針の変更とACE-Step環境構築

BGM素材を外部配布素材から、ACE-Step V1.5によるオリジナル生成へ切り替えることにした。ローカル環境(v15-turbo / RTX3090)を構築し、生成フローの習得を始めている。自前生成にすることで、ゲームの世界観に合った曲を狙って作れるようにするのが目的である。


■ 27日目(5/25):Panel_CommandInterface本実装・SaveData保存フロー

※5/20〜5/24はACE-Step作業にてゲーム制作はお休み。

コマンド名解決の集約

OfficerCommandCardとPanel_CommandInterfaceに重複していたコマンド名取得処理を、GameEnumExtensions.csのCommandType.GetName()拡張メソッドへ集約した。各ファイルの個別実装を削除し、呼び出しを統一した。

Panel_CommandConfirm本実装

確認パネルのメッセージ領域をメイン・サブの2本構成に変更し、Awake()でのボタン接続を実装した。確認メッセージの定義(各コマンド/解雇/褒賞)もGameEnumExtensions.csに追加し、言語分岐はすべてSystemLanguage enumで処理している。

Panel_CommandInterface本実装

コマンド入力パネルを本実装した。武将データとOfficerSaveDataの解決、ボタン群の表示、君主判定による解雇・褒賞ボタンの制御、コマンド種別ごとの確認パネル振り分け、サブパネル開閉時のinteractable制御までを通した。

コマンド確定→セーブデータ保存フロー

コマンド確定時にOfficerCommandSaveDataを生成し、GameSaveSlot.PlayerCommandsへ追加する流れを実装した。パネルを開き直したときはPlayerCommandsからコマンド一覧を復元して表示する設計とした。これによりターン途中での中断セーブに対応できる。

解雇・褒賞の即時処理

解雇は配下リストから武将を外して在野(WanderingOfficers)へ戻す処理を実装した。褒賞は資金10を消費して忠誠度を上昇させ、HasReceivedRewardThisTurnフラグで「1ターンに同じ武将へは1度まで」の制限をかけた。褒賞の忠誠度上昇量は「((君主の魅力÷10)+10)×乱数0.9〜1.1」で算出する。

反省点

この日は修正→デグレード→修正のループが多発した。既存コードを十分に確認せず修正を出したことが主因で、細切れの修正が積み重なってどこまで適用済みか把握しづらくなった。次回以降は「修正前に影響範囲を明示し、GOが出てからコードを出す」運用を徹底することにした。


■ 28日目(5/26):Panel_CommandInterface残バグ修正

前日の反省を踏まえ、まずは残っていたバグを慎重に潰した。

行動済み(コマンド入力済み)の武将をクリックして開く閲覧専用パネルで、コマンドボタンが全部消えてしまう不具合を修正した。原因はボタン群そのものを非表示にしていたことで、「ボタンは表示したまま、操作だけ無効化する」方式へ変更した。例外として褒賞ボタンだけは、その武将がまだ褒賞を受けていなければ有効化する。

あわせて、褒賞は「行動済みにならない」コマンド(設計書準拠)であるため、閲覧専用表示中でも褒賞だけは実行できるよう制御を見直した。設計書の最新版と突き合わせ、褒賞が行動を消費しない仕様であることも再確認している。


■ 29日目(5/27):情報表示拡充・状態レベル改訂・数値変動演出

この日は分量が多い。順に記録する。

Panel_CommandInterfaceの情報表示拡充

コマンドを入力する際、実行する武将の能力や現在の勢力状況が一目で分かるよう、情報表示を追加した。

武将情報の表示は、既存の共用部品OfficerSimpleInfoを流用する形に一本化した。当初はパネルに直接フィールドを置いて実装していたが、同じものを2か所で持つ無駄を避けるため、また将来の結果表示フェーズで再利用するために、OfficerSimpleInfoへ委譲する方針へ切り替えた。OfficerSimpleInfoのメソッドの引数は変えなかったため、同じ部品を使っている外交向けの武将一覧パネルには一切影響が出ていない。

勢力情報は最終的に8項目を表示することにした。国力・資金・兵数・訓練度・民忠・諜報力に加え、名声と拠点数を追加した。名声は出陣可能な兵数の判断材料に、拠点数は配下枠の解放(あと1拠点で枠が増える、など)の判断材料になるため、見えていて損のない情報と判断した。

状態レベル設計の改訂

これまでシステムボタン群(オプション/ゲーム終了/地図切替/タイトルへ戻る/ズーム)は、コマンド入力状態(レベル1)でのみ表示・操作可能としていた。今回これを見直し、Idle状態(レベル0)で操作できるよう変更した。

新しい構成では、Idleではシステムボタンが画面右からスライドインして操作可能、各種パネルを開いている間(レベル1)はスライドアウトして無効になる。これにより「パネルを開いたままオプションを開く」経路がなくなり、状態管理がすっきりした。地図切替とズームだけは状態を変えずIdleのまま実行できるようにしている。あわせて、無操作10秒で自動的にコマンドパネルが開く挙動は廃止した。

もともと過去にマウス操作のバッティングを避けるためIdleの操作を絞っていた経緯があったが、システムボタンを透明パネル上にまとめて右へ寄せる構成にしたことで、競合なく実現できた。

多言語化の不具合対応

オプションで言語を切り替えたとき、表示中のパネルや地図上の拠点名が即座に切り替わらない問題に対処した。

原因は、武将名や拠点名のように動的に流し込んでいるテキストが、言語変更時の一括更新の対象外になっていたことである(静的に設定したボタン名などは正しく切り替わっていた)。

パネル側は、前述の状態レベル改訂によって「オプションを開けるのはIdleのときだけ=オプション表示中に他のパネルは開いていない」状態が保証されるようになったため、複雑な再描画の仕組みを入れずに済んだ。問題そのものを設計で消した形である。

地図の拠点名については、オプションパネルを閉じたタイミングで全拠点の名前を現在の言語で再解決する処理を入れた。これでOK・キャンセルのどちらで閉じても、拠点名が正しい言語で表示される。

数値変動演出システムの新規導入

数値が「すっ」と変わるだけでは変化が分かりにくいため、汎用の数値変動演出コンポーネント(ChangeValueText)を新規に作成した。

このコンポーネントは、数値のカウントアップ/カウントダウン(1→2→3…と数字が動く)、上昇なら「↑」下降なら「↓」と変動量を示すポップ表示(移動しながらフェード)、そしてアイコンと数値の色分け(上昇=緑/下降=赤)を行う。重要な設計として、演出中に表示される途中の数値はあくまで見た目だけのもので、ゲームデータには一切書き戻さない。データの確定と演出を明確に切り分けている。

まずは褒賞で変動する忠誠度と資金に適用した。褒賞を実行すると、データを確定させたうえで効果音を鳴らし、忠誠度と資金がアニメーションしながら変化する。

効果音キーの定数化とコマンドボタンのデザイン

効果音のキーをシーンごとの定数クラス(SEKeysMain)にまとめ、文字列の直書きをやめてタイプミスを防ぐ構成にした。BGM用の定数クラス(BGMKeysMain)も器だけ用意した(拠点数によるBGM切り替えは仕様確定済み・実装はこれから)。

コマンドボタンのデザインも、Unityデフォルトの仮デザインから、羊皮紙に金枠を添えたゲームの世界観に合うものへ差し替えた。ボタン画像はChatGPTで背景透過・ラベルなしで生成し(ラベルは多言語対応のため別管理)、通常・ホバー・押下・無効の状態差は色味の調整で表現している。

バグ修正

状態レベル改訂に伴い、特定の状況でシステムボタンのスライド処理がエラーを出すようになったため修正した。非表示状態のパネルに対して閉じる処理を呼んでいたのが原因で、不要になっていた1行を削除して解消した。


■ 30日目(5/28):動作確認・進捗整理

29日目までに実装した内容の動作確認を行った。数値変動演出の矢印アイコンの色分け、システムボタンのスライド処理のエラー修正、いずれも問題なく動作することを確認した。あわせてタスク全体の棚卸しを行った。

以下、開発中の画面。少しづつですが、着実に実装を進めています。


■ 現時点の開発状況

カテゴリ状況
データクラス全般✅ 完了
GameUtility✅ 完了
Scene_Initialize✅ 完了
Scene_Title✅ 完成
Scene_Start✅ 完了
Scene_Main(地図表示・スクロール・ズーム)✅ 完了
Scene_Main(勢力情報パネル)✅ 完了
Scene_Main(武将コマンドパネル)✅ 完了
Scene_Main(コマンド設計)✅ 確定
Scene_Main(コマンド確認パネル群)✅ 実装
Scene_Main(Panel_CommandInterface)✅ 完了
Scene_Main(数値変動演出)✅ 完了
Scene_Main(状態レベル設計改訂)✅ 完了
Scene_Main(フェーズ管理・コマンド入力)⬜ 未実装
Scene_Main(戦闘計算・AI)⬜ 未実装
Scene_End⬜ 未着手
コレクション画面・武将登録画面⬜ 未着手

■ 次回の作業予定

いよいよフェーズ管理の本実装に入る。1ターンを7フェーズで構成する設計はすでに確定しており、今回その前段としてコマンド入力まわり・情報表示・状態管理を固めたので、ようやく腰を据えて取り組める段階になった。

メインシーンの状態管理(レベル状態)と、1ターン内のフェーズ進行は別の概念であるため、まずはその整理から着手する予定である。あわせて、褒賞のターン1回制限フラグをターン終了時にリセットする処理も、フェーズ管理の中で対応していく。