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

■ 20〜23日目のまとめ

今回は4日分をまとめて記録する。
※5/13、5/16、5/17は私用にて作業お休み。

20日目はScene_Mainの操作設計確定とUI骨格整備、21〜22日目は勢力情報パネルの本実装とデータ構造の大幅整備、23日目はコマンド設計の全体確定と外交情報パネルの本実装、各種バグ修正を実施した。

メインシーンの「見る」部分がほぼ出揃い、次はいよいよ「動かす」フェーズ管理の本実装に入る段階に来ている。


■ 20日目(5/12):操作設計確定・Panel_System新規作成

コマンド入力フェーズの操作設計確定

メインシーンの状態遷移と操作制御を確定した。

Idle状態では右ドラッグでマップスクロール、マウスホイールでズーム、拠点アイコンまたは勢力地図パーツの左クリックで地図情報パネル表示状態(ViewInfo)へ遷移する。それ以外への左クリック、または無操作10秒でUIパネル表示状態(CommandInput)へ自動遷移する。

右クリックは「短押し(0.2秒以内・離し時発火)」を遷移トリガーとし、右ドラッグと明示的に分離した。ViewInfo状態ではマップ操作を禁止し、情報閲覧に専念する設計とした。

Panel_System新規作成

セーブ・オプション・タイトルバック・ズームなどのシステムボタン群をManagerMainから独立させ、Panel_System.csとして切り出した。コールバック(Action)方式でManagerMainと連携する構成で、今後の状態制御が一元化しやすくなった。

ManagerMain改修

右クリック短押し判定を実装し、_rightDraggingフラグで押し時間を計測して離し時に発火する方式とした。MapContainer自体にButtonを設置するSetupMapClickHandler()を新設し、拠点・地図パーツ以外への左クリックをフォールバック処理する仕組みにした。これにより左クリックの吸い取り問題が解消した。

またBGM設計も確定した。プレイヤー保有拠点数に応じて5段階でBGMを切り替える方式で、使用素材はperitune.com(無料・商用利用可・ゲーム同梱可)を予定している。


■ 21〜22日目(5/14〜5/15):勢力情報パネル本実装・OfficerSaveData導入

Panel_FactionDetailInfo本実装

地図上の拠点または勢力地図パーツをクリックしたときに表示される勢力情報パネルを本実装した。表示項目は勢力名・勢力カラー・君主情報(顔小画像・名前)・各種ステータス(資金・兵数・国力・訓練度・民忠誠度・諜報力・名声・拠点数)・友好度・信頼度。

諜報レベルによる情報フィルタリングをGameUtility.GetIntelligenceLevel()として実装した。レベルに応じて閲覧できる情報が段階的に開放される。

  • レベル0:勢力名・拠点数のみ
  • レベル1:国力・君主情報(顔・名前)
  • レベル2:資金・兵数・民忠・名声
  • レベル3:全情報(訓練度・諜報力・外交情報)

プレイヤー自身の勢力はフィルタリングなし(レベル3扱い)。数値・記号専用のテキストはLocalizeTextを使用せずTextMeshProUGUI直接参照とする方針を今回から徹底している。

OfficerSaveData新設・全ファイル対応

武将データの管理構造を大幅に整理した。従来のSubordinateIds/CustomSubordinateIds(IDリスト2本)を廃止し、OfficerSaveDataクラスに統合した。MonarchId/CustomMonarchIdも廃止してOfficerSaveData Monarchに一本化した。

フィールド構成はOfficerId / CustomId / CurrentLoyalty / IsNormalの4つで、通常武将とカスタム武将を同一クラスで扱える。武将の解決はGameUtility.ResolveOfficer()経由で行う運用を徹底する。

対応ファイルはSaveDataGame.cs / GameUtility.cs / Panel_FactionDetailInfo.cs / ManagerStart.cs / DebugSaveDataCreator.csの5ファイル。構造変更に合わせてgame.jsonも再生成し、動作確認まで完了した。

Panel_FactionDetailInfoOfficer本実装

サブパネルとして武将一覧を表示するPanel_FactionDetailInfoOfficer.csを本実装した。表示枠は10枠固定(君主1名+配下最大9名)。

1枠を担当するOfficerSimpleInfo.csを新規作成した。表示項目は顔小画像・兵科アイコン・武将名・忠誠度・特技・武力/知力/魅力。君主の忠誠度は常に「—」で固定。配下の忠誠度は諜報レベル3以上またはプレイヤー勢力の場合に数値表示、それ以外は「???」でマスクする。


■ 23日目(5/18):コマンド設計確定・外交情報パネル本実装・バグ修正

コマンド設計確定

CommandType enumをGameEnums.csに追加し、全コマンド体系を確定した。

  • 内政系:開発 / 施し / 徴発
  • 軍事系:出陣 / 徴兵 / 募兵 / 訓練 / 迎撃
  • 外交系:同盟 / 親睦 / 要請 / 破棄
  • 人事系:捜索
  • 謀略系:諜報 / 計略 / 引抜
  • 援軍系:援軍出陣 / 援軍迎撃

解雇・褒賞はコマンドクラス管理外で即時処理、迎撃・援軍はWarクラスで別途管理する設計とした。要請コマンドは同盟勢力全員へ自動送信(個別指定不要)。出陣は経路指定方式(OriginBastionId+TargetBastionId)で戦争の一意特定を行う。

ランタイム用のOfficerCommand.csを新規作成し、セーブ用のOfficerCommandSaveDataをSaveDataGame.csに追加した。GameSaveSlot.PlayerCommandsでターン中断セーブに対応、GameSaveSlot.UnlockedSubordinateSlotsで開放済み配下枠数を永続管理する。

Panel_FactionDetailInfoDiplomacy本実装

外交情報サブパネルを本実装した。表示枠は9枠固定で敗北済み勢力を除外して表示する。

1枠を担当するDiplomacySimpleInfo.csを新規作成した。表示項目は勢力名・同盟有無・友好度(数値+段階テキスト)・信頼度(数値+段階テキスト)。このパネルは外交ボタン自体が諜報レベル3でのみ開放される前提のため、表示はレベル3固定とした。

信頼度の段階テキストを今回確定した。友好度とは別定義で以下の通り。

数値日本語英語
0〜19敵視Hostile
20〜39不信Suspicious
40〜59中立Neutral
60〜79好意Trusting
80〜99信頼Devoted
100信任Absolute

多言語対応改善

マスクテキストを言語依存のGetMaskText()メソッドに変更した。日本語は「???」、英語以降は半角「???」を返す。数値テキスト向けのマスクはMaskTextNumeric定数(半角「???」固定)に統一した。

Panel_Commands・Panel_CommandInterface実装

旧Panel_OfficerCommandCard.csをOfficerCommandCard.csに置き換えた。CardStateはEmpty / Locked / Idle / Doneの4種で、空席・ロック状態は顔画像欄に専用画像を表示する方式とした。

Panel_CommandInterface.csをモック実装した。ShowInput()(コマンド入力モード)とShowReadOnly()(閲覧専用モード)を実装し、onCloseコールバックに対応した。

バグ修正

今回は4件のバグを修正した。

  • ロードゲーム→タイトル→新規ゲームでロードデータが残留する問題:ManagerMain.Start()でNewGameData.Clear()が呼ばれていなかったのが原因。ロード・新規どちらのルートでも呼ぶよう修正した。
  • Panel_CommandInterface初期表示バグ:InitializeUI()でHideImmediate()の呼び出しが重複・漏れていたのが原因。
  • ViewCommandInterface状態から右クリックで戻れないバグ:Update冒頭のisViewCommandInterface変数が未定義だったのが原因。
  • Panel_CommandInterface閉じるボタンで状態遷移しないバグ:onCloseコールバック未実装・_onCardClick誤呼び出しが原因。Panel_Commands側にonCommandInterfaceCloseコールバックを追加し、ManagerMain側でViewCommands状態への遷移を統一した。

■ 現時点の開発状況

カテゴリ状況
データクラス全般✅ 完了
GameUtility✅ 完了
Scene_Initialize✅ 完了
Scene_Title✅ 完成
Scene_Start✅ 完了
Scene_Main(地図表示・スクロール・ズーム)✅ 完了
Scene_Main(勢力情報パネル)✅ 完了
Scene_Main(武将コマンドパネル)✅ 完了
Scene_Main(コマンド設計)✅ 確定
Scene_Main(フェーズ管理・コマンド入力)⬜ 未実装
Scene_Main(戦闘計算・AI)⬜ 未実装
Scene_End⬜ 未着手

■ 次回の作業予定

フェーズ管理の本実装に入る。1ターンを7フェーズで構成する設計はすでに確定しており、コマンド入力フェーズと結果表示フェーズの流れを繋ぐところから着手する予定。