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

■ 12〜17日目のまとめ

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

前回まででScene_Titleの基本実装は終わっていたが、各画面のデザインが仮素材のままだった。今回はそこを仕上げ、タイトルシーンを一旦完成とした。あわせてScene_Startの機能実装を本格的に進め、君主選択制御・武将変更パネルまで動くようになった。

結構、Claudeの提案に振り回される展開も多く、手戻りに近い無駄な工程もあったのでAIをディレクションする能力を高めるべきと反省する局面が多かった。前提条件にいつの間にか認識齟齬があったり、複雑化するほど丁寧な要件指定が必要と痛感した。
小さく閉じた機能設計精度は高いが規模が大きくなって複雑化してくると業務系アプリケーションではあまり問題ないのかもしれないが、ゲームのような独自性が高いアプリケーションだとAIの推論が的外れになる事も多いですね。


■ 12日目(5/3):バグ修正・多言語化対応・各種画面実装

LocalizeHelperの削除と多言語化設計の統一

大規模な対応となった。それまで使っていたLocalizeHelper.cs(日本語・英語の2言語決め打ちでテキストを返すユーティリティ)を全廃した。

理由は拡張性。bool isJapaneseの二択設計では将来的に中国語やドイツ語を追加できない。代わりにSystemLanguage型のswitch式を使う方針に統一した。この変更が影響したファイルは14本・34箇所にのぼった。

LocalizeText.SetDynamicText()への統一も同時に行い、TextMeshProUGUIには必ずLocalizeTextをアタッチするプロジェクト標準を確立した。

コレクション画面(Panel_Collection)実装

タイトルシーンの武将図鑑画面を実装した。

全132名をID順にNo.1〜No.132で表示する。24名/ページ(横8×縦3)・最大6ページのページング構成。CollectionCard.csをPrefab化してCommonフォルダに配置し、登録済み/未登録(?????表示)の2状態を持つ設計にした。

カードをクリックするとPanel_OfficerDetailが開き、立ち絵・能力値・兵科・特技・経歴などの詳細を確認できる。

カスタム武将登録画面(Panel_ForgeOfficer / Panel_CustomOfficerEdit)実装

「My Officers」から起動するカスタム武将登録機能を実装した。

画像を取り込むとSHA256ハッシュ値を生成し、そのハッシュをシードとしてパラメータを自動生成する。同じ画像からは必ず同じ結果が得られる設計になっている。

自動生成の内容:

項目方式
能力値(武力/知力/魅力)正規分布(Box-Muller法・平均60・標準偏差15)
初期忠誠均等分布(60〜90)
ボーナスポイント均等分布(10〜30)
兵科重み付き抽選(均等5種)
特技シード固定抽選(42種)

特技に兵科縛りがある6種(騎馬突撃・弓の名手・槍衾・剣聖・魔法集中・魔法陣)については、特技抽選後にUnitTypeを強制上書きする処理を入れている。

ボーナスポイントは各能力値に±ボタンで振り分けられる。元の生成値より下には下げられない制約あり。

確定後は変更不可・削除のみ可能という設計で確定した。

LoadGame画面実装

タイトルシーンのデータ読込画面を実装した。

オートセーブ1枠+手動3枠の計4スロット構成。各スロットにはシナリオ名・難易度・現在ターン(年・季節換算)・勢力名を表示する。エリア戦(青)・全土戦(赤)で背景色を色分けし、データなしスロットはグレーで読込ボタンを無効化する。

ターン数の変換は以下の通り。

エリア戦:最大40ターン(10年)
全土戦:最大80ターン(20年)
上限超過:「期限切れ」表示

■ 13日目(5/4):SlidePanelBase実装・パネル演出の共通化

SlidePanelBase

各パネルのスライドイン・スライドアウト演出を提供する共通基底クラスを作成した。

スライド方向(上下左右)・時間・距離はInspectorで設定可能。オプションでCanvasGroupによるフェードイン・アウトにも対応している。公開APIはShow() / Hide() / ShowImmediate() / HideImmediate() / SetInteractable()の5種。

この回から全パネルが継承対象となり、現時点では以下が対応済み。

Panel_Scenario / Panel_Difficulty / Panel_LoadGame / Panel_Collection / Panel_OfficerDetail / Panel_ForgeOfficer / Panel_CustomOfficerEdit / Panel_ImageImport / Panel_Option / Panel_Dialog / Panel_FactionInfo / Panel_FactionConfirm / Panel_FactionEdit / Panel_OfficerSelect

Panel_OptionとPanel_Dialogの配置方針変更

旧方針のDontDestroyOnLoad・Singletonパターンを廃止した。各シーンに直接Prefabを配置し、SerializeFieldで直接参照する方式に変更した。

ManagerOption・ManagerDialogという名称もPanel_Option・Panel_Dialogにリネームし、命名規則(Panel_*プレフィックス)に統一した。


■ 14日目(5/6):カスタム武将画面の修正・操作制御整備

ScrollView修正とCanvasGroup操作制御

カスタム武将一覧のScrollViewで、カードがContent配下ではなくScrollView直下に追加されて重なって表示される不具合を修正した。SerializeFieldのアサイン漏れが原因だった。

操作制御の方針をこの回で確定した。パネルが開いている間は他パネルの操作を一切不可とする。親子パネルが重なる場合はCanvasGroupのinteractable制御を使う。SetInteractable()をSlidePanelBaseの公開メソッドとして追加した。

最終更新日時機能

CustomOfficerDataにLastModifiedAtフィールドを追加した。ISO 8601形式で保持し、表示時は言語に応じたフォーマットで出力する。

日本語:yyyy/MM/dd HH:mm
英語:MMM dd, yyyy HH:mm

■ 15日目(5/7):CollectionCard・CustomOfficerEdit改修

CollectionCard改修

未登録カードの飾り枠が実行時に消える不具合を修正した。Sprite Frame Secretが未アサインのままspriteにnullが入っていたのが原因だった。

未登録用素材を分離した。変更前は顔・兵科共通の_spriteSecretを1枚使っていたが、_spriteSecretFace(顔用)と_spriteSecretUnitIcon(兵科用)に分離した。

ステータス表示(武力/知力/魅力)も追加した。登録済みは実数値、未登録は「??」表示。兵科アイコンカラーは#C8A84B(ゴールド)で統一した。

Panel_CustomOfficerEdit改修

兵科アイコン画像表示と特技説明文表示を追加した。特技説明文はGameEnumExtensions.GetDescription()で取得し、ClearParamDisplay / ApplyGeneratedData / LoadEditTargetの各タイミングで更新する。

GameEnumExtensionsにUnitType重み付き抽選メソッドGetWeightedUnitType(int seed)を追加した。スキル縛りなし時の兵科抽選に使用する。


■ 16〜17日目(5/8〜5/9):タイトルUI完成・スタートシーン本格実装

タイトルシーン3画面のデザイン確定

この段階でタイトルシーンを一旦完成とした。

ロード画面はセーブスロットの背景を色設定からSprite差し替え方式に変更した。エリア戦(青系)・全土戦(赤系)・データなし(グレー系)で別素材を使う。パネル上部に「Select Save Data」タイトルラベルを追加した。

シナリオ選択画面はエリア戦ボタンを青・全土戦ボタンを赤の別Spriteで色分けした。文字のシャドウはTMPのマテリアル制約をShadow用テキストオブジェクトの並置で回避した。

難易度選択画面はEasy(緑)・Normal(青)・Hard(赤)の横並びアイコンボタンに変更した。

ツールチップ実装

ホバーでテキストを表示するTooltipUI.cs・TooltipTrigger.csを新規作成した。

言語テキストはSystemLanguageエントリ方式で管理しており、言語追加時はInspectorにエントリを追加するだけで対応できる。CanvasGroupのinteractable=false時は表示しない制御を入れており、操作無効状態でのホバーにも対応している。

拠点データ拡充

エリア戦の拠点数が少なすぎると感じたため、各エリアに追加した。

エリア全国版拠点エリア専用追加合計
Area1(北部山地)104(B111〜B114)14
Area2(東海地方)84(B209〜B212)12
Area3(南部平野)125(B313〜B317)17

全拠点IDの管理を2桁(B)から3桁(B*)に統一した。BastionDataImporter.csのフォーマット指定をD2→D3に修正し、既存アセットもUnityエディタ上でリネームした。

接続設計はPythonスクリプトで地図上に可視化して確認した。一方通行チェックも全エリア・全土戦で実施済み。

勢力データ拡充

拠点増加に合わせて各シナリオの勢力数を増やした。

シナリオ追加勢力
S01アイゼンガルド辺境伯領 / ヴァルドレン王国
S02ティレニア海洋同盟 / コーラル諸島連邦
S03ヴェルディア王国 / サンフィールド伯爵領 / テラヴェルデ共和国

各勢力の識別カラーは既存15勢力と被らないよう選定した。

武将12名追加

コレクション画面が6ページきっちり埋まるよう武将を12名追加した。CSVインポートとシナリオ反映を確認済み。

スタートシーン:パネルのSlidePanelBase移行

Panel_FactionInfo・Panel_FactionConfirm・Panel_FactionEditをSlidePanelBase継承クラスに変換した。

SlidePanelBaseにSetSlideDirection()を追加し、パネルの左右スライド方向を動的に変更できるようにした。ただし今回のPanel_FactionInfoは固定方向(右)に統一し、コードからの動的制御をやめてInspector設定に一本化した。

ManagerStart.InitializeUI()でgameObject.SetActive(true)後にHideImmediate()を呼ぶ方式をManagerTitleから踏襲した。Hierarchyのアクティブ・非アクティブ状態に動作が左右されないよう徹底している。

Overlayによる操作ブロック方式を廃止し、CanvasGroupのSetInteractable()に完全移行した。StartSceneStateにFactionEdit状態を追加して全状態での制御を一元化した。

君主選択制御

スタートシーンの主要機能となる君主選択の可否制御を実装した。

条件選択可能な君主
全土戦unlockedOfficerIdsに登録されている君主
エリア戦・初回全国シナリオに登録されている君主
エリア戦・クリア後そのエリアシナリオの全君主

選択不可の勢力は城アイコンを暗色で表示し、地図上から視覚的に判別できるようにした。Panel_FactionConfirmでは選択不可時にStart等のボタンをinteractable=falseにし、理由を示すメッセージを表示する。全土戦とエリア戦でメッセージ内容を出し分けている。

勢力データはScenarioDataのマスタを直接書き換えず、ManagerStart起動時にFactionScenarioData.Clone()で複製したものを使う設計にした。

Panel_OfficerSelect 新規実装

全土戦の君主・配下変更用武将選択パネルを実装した。

CollectionCardを横8枚・縦スクロールで一覧表示する。コレクション武将→カスタム武将の順で続けて並べる設計のため切り替えボタンは不要になった。

フィルタ機能として兵科ボタン・能力値スライダー(武力/知力/魅力)・特技ドロップダウンを実装した。特技ドロップダウンはEnumのValueが飛び番(1〜6の後が11〜)になっているため、_skillEnumValuesリストでindex↔Value対応表を持つ方式にした。

カードをクリックすると即確定・パネルを閉じる。

IOfficerインターフェース導入

OfficerDataとCustomOfficerDataの共通化のためIOfficer.csを新規作成した。

GetName() / GetBiography()
Strength / Intelligence / Charisma / DefaultLoyalty
UnitType / SpecialSkill / Personality / Rarity
GetFaceSprite() / GetStandingSprite()
IsCustom

両クラスに明示的インターフェース実装で追加した。フィールドのプロパティ化はScriptableObjectのシリアライズを破壊するため禁止とし、IOfficer.Strength => Strengthの形で実装した。

これによりOfficerCard.Setup()・Panel_OfficerSelect・Panel_FactionConfirmの武将一時変更データをすべてIOfficer型で統一できた。メインシーンでの戦闘計算・AI処理でも型分岐が不要になる見込み。

Panel_FactionConfirmの武将一時変更設計

確定パネル上での武将変更は、開始ボタンを押すまで一時データとして扱う設計にした。

_tempMonarch(IOfficer):君主の一時変更
_tempSubordinates(IOfficer[]):配下の一時変更

Show()時にnullリセット、リセットボタンでnullに戻す。実データ(_factionListのClone)はキャンセルしても書き換わらない。開始ボタン押下時にGetTempMonarch() / GetTempSubordinates()で確定データを取得してGameStartDataを生成する設計になる。

カスタム武将の在野登録フラグ追加

CustomOfficerDataにIsWanderingInNational(bool)フィールドを追加した。

全土戦でカスタム武将を在野武将として登場させるかどうかを制御するフラグ。Panel_CustomOfficerEditにトグルを追加して編集可能にした。

武将選択画面ではこのフラグに関係なく全カスタム武将が選択対象になる。ゲーム開始後、選択されなかったカスタム武将のうちIsWanderingInNational=trueのものが在野武将として登場する。

スーパーゲ制デー(5/9)

毎月第2土曜日のスーパーゲ制デーに合わせてXに開発進捗動画を投稿した。

タグ(#スーパーゲ制デー)は長文投稿の折りたたまれた範囲に入ると検索インデックスに乗らないことを確認した。タグは投稿冒頭に配置するか、別リプライにタグのみ投稿する方式が確実。
Xに関してはフォロワーを増やす為だけの活動はアカウント品質低下を招くと判断し、内容のあるPOSTを心掛けて地道に展開したいと思う。実際、相互しますで増えたフォロワーはPOST内容に興味が無さそうでインプレッション率(POSTのインプレッション数/フォロワー数)の悪化しか招かない結果に(笑)
しかし、POSTに反応が増えてくるとやる気がアップしますね。


■ 現時点の開発状況

カテゴリ状況
データクラス全般✅ 完了
IOfficerインターフェース✅ 新規完了
GameStartData✅ 新規完了(実装は次回)
Scene_Initialize✅ 完了
Scene_Title✅ 一旦完成
Scene_Start(UI・操作制御)✅ 完了
Scene_Start(君主選択制御)✅ 完了
Scene_Start(武将変更パネル)🔶 デザイン調整中
Scene_Start(ゲーム開始処理)🔶 未実装
Scene_Main⬜ 未着手

■ 次回の作業予定

Panel_OfficerSelectのデザイン仕上げ後、Scene_Mainの実装に入る。

GameStartData.CreateFromScenario()の実装・OnClickStart()の本実装から始め、マップ表示・ターン制御・コマンド実装と進める予定。

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

■ 10〜11日目のまとめ

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

10日目はScene_Startの基本実装が中心。勢力選択から確定まで一通りのUIフローが動くようになった。11日目はそこに機能を追加しつつ、データ設計の抜け漏れを潰した。


■ 10日目:Scene_Start 基本実装

勢力選択・確定フロー

Scene_Startのメインとなる画面遷移を実装した。

世界地図上の拠点アイコンをクリックするとPanel_FactionInfoが表示され、勢力の基本情報を確認できる。そこから「選択」を押すとPanel_FactionConfirmに遷移し、君主・配下武将のカード表示、各種変更ボタンが並ぶ確定ウィンドウになる。

拠点表示モードと勢力図モードの切り替えも実装済み。勢力図モードはalphaHitTestMinimumThresholdで透過部分のクリック判定を除外している。

状態管理

6状態のEnumで一元管理している。

Idle / FactionInfo / FactionConfirm / OfficerSelect / FaceImageSelect / ErrorDialog

状態によって操作可否を切り替える設計で、後の機能追加時にも拡張しやすい構造にした。

OfficerCard Prefab

武将カードUIをPrefab化してCommonに配置した。勢力確定ウィンドウと武将選択ダイアログで共用する。顔絵・名前・兵科・特技・三能力値を表示する。


■ 11日目:機能追加とデータ設計

配下武将変更ボタン

Panel_FactionConfirmの配下武将カード下部にボタンを配置した。

ScrollViewの配下カード列と並列にPanel_SubChangeButtonsを置き、配下数に応じてボタンをInstantiateする方式にした。LayoutGroupの動的生成でいくつか試行錯誤があったが、ラッパー構造は使わず並列配置で解決した。後でデザインボタンに差し替える予定なので、ボタンはPrefab(OfficerChangeButton)から生成する設計にしている。

君主画像差し替え機能

顔変更ボタンから起動する画像取り込みウィンドウを実装した。

Panel_ImageImportはCommon配置のPrefabで、カスタム武将登録でも流用できる設計にしている。OSのファイル選択ダイアログにはStandaloneFileBrowserを使用した。取り込んだ画像は512×768にリサイズし、上部384×384を顔絵として自動切り出しする。

対応フォーマット:PNG / JPG / JPEG
最大ファイルサイズ:10MB
出力サイズ(立ち絵):512×768
出力サイズ(顔絵):384×384(上部中央クロップ)

画像処理はImageImporter.csとして共通化した。

勢力名・君主名の編集機能

Panel_FactionEditを新規作成した。勢力確定ウィンドウの「勢力編集」ボタンから開き、勢力名と君主名をその場で変更できる。

文字数制限は以下で確定した。

項目日本語英語
武将名15文字19文字
勢力名10文字25文字

この制限値は武将登録画面でも共通仕様となる。

SaveDataRecord の新規設計

アプリ通算の実績データクラスを新規に設計・実装した。

これまでセーブデータはSaveDataSystem(設定)とSaveDataGame(プレイ進行)の2種類だったが、コレクション解放状況やカスタム武将管理のためにSaveDataRecordを追加した。SaveDataCustomOfficerとして別管理を検討していたが、ファイルを増やしたくないという方針からSaveDataRecordに統合した。

フィールド内容
areaClearRecordsエリア戦クリア記録(シナリオIDごと)
nationalClearCount全国版クリア回数
unlockedOfficerIdsコレクション解放済み武将IDリスト
customOfficerSlotCountカスタム武将スロット上限
customOfficers登録済みカスタム武将リスト

バージョンマイグレーション機構も組み込んだ。アップデートでフィールドを追加した場合は、ロード時に旧バージョンのデータを自動補完する。

ManagerSaveData の拡張

SaveDataSystem・SaveDataRecordの両方を同じ初期化フローで管理するように整理した。初回起動判定はisInitializedフラグで行い、ファイルパスの参照はManagerSaveData内に集約している。

ユーティリティメソッドも追加した。

IsNationalScenarioUnlocked()  // 全国版解放判定
IsAreaCleared(scenarioId)     // 指定シナリオのクリア判定
CalcCustomOfficerSlotCount()  // スロット上限の算出

Scene_Title:状態管理の刷新

TitleSceneState EnumをManagerTitle.csに導入した。これまでboolを複数管理していたが、Enumに一元化して各ボタンイベントに状態チェックを入れた。状態の階層構造は以下の通り。

Opening → WaitingInput → MainMenu(起点)
                              ├ ScenarioSelect → DifficultySelect → StartScene遷移
                              ├ Collection
                              ├ ForgeOfficer
                              ├ LoadGame
                              └ Option

同一レベル間の平行移動はなし、戻るは常に1レベル上へ、という設計で統一している。

Panel_Scenario.cs 新規作成

シナリオ選択パネルの専用スクリプトを作成した。シナリオ名のテキスト表示(LocalizeText使用)と、全国版ボタンの有効/無効制御を実装している。全国版かどうかの判定はIsNationalScenarioフラグで行い、シナリオIDのマジックナンバーは使用していない。キャンセルボタンも追加した。

今回からパネルごとに専用スクリプト1本という方針を確立した。


■ 現時点の開発状況

カテゴリ状況
データクラス全般✅ 完了
SaveDataRecord✅ 新規完了
Scene_Initialize✅ 完了
Scene_Title(基本)✅ 完了
Scene_Title(Collection・ForgeOfficer・LoadGame)🔶 未実装
Scene_Start(基本UI)✅ 完了
Scene_Start(武将選択・遷移)🔶 未実装
Scene_Main⬜ 未着手

■ 次回の作業予定

タイトルシーンの残実装(Collection・ForgeOfficer・LoadGame)を優先して進める。Scene_Startのスタートボタン遷移はその後。

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

「凝った。」

当初、1週間くらいでそこそこ動くものを作れると思っていた。

作り始めたら、土台が気になった。
データ構造が気になった。
セーブの設計が気になった。
9日経って、まだタイトル画面しか動いていない。

でも後悔はしていない。


■ この8日間でやったこと

前回の記事(開発1日目)から約8日が経過した。
大きく3つのフェーズに分けて進めてきた。

  • フェーズ1(2〜4日目):素材調達とデータ設計
  • フェーズ2(5〜7日目):データ基盤の実装と自動化
  • フェーズ3(8〜9日目):仕様の言語化と画面実装の開始

順番に書いていく。


■ フェーズ1:素材とデータ設計

武将立ち絵102体

本作には102名の武将が登場する。全員分の立ち絵を生成AIを駆使して生成した。
プロンプトは3000文字くらい、英単語も400Wordsほど。調整に数日使った。塗り方にはかなり拘った。

スタイルは「semi-painted watercolor illustration style」に統一。自作の絵を参照画像として渡しスタイルを再現させる手法(塗りや顔などの作画)が安定することがわかった。生成した画像はUnity上で512×768にリサイズして使用する。顔絵(384×384)は立ち絵の上部中央をクリッピングして自動生成する仕組みにした。

世界地図の処理

地形有地図と白地図の2種類を用意し、Pythonで処理した。

白地図のボロノイ分割処理でB01〜B30の30枚のリージョンスプライトを自動生成したが、流石に形状がカクカクだったので結局手作業で地形より30個の白地図用ピースを作成した。地形有地図・白地図ともに海部分をflood fillで透過処理している。地形有地図の上に白地図30ピースを半透明で重ねる実装方針とした。


■ フェーズ2:データ基盤の実装と自動化

前のゲーム(鋼鉄の交響曲)で仕様変更や調整によるスパゲッティコード化に苦しんだ。
今回は最初から「土台に時間をかける」と決めていた。

ScriptableObjectとCSVインポーター

OfficerDataBastionDataをScriptableObjectとして設計し、CSVからの一括インポーターをEditorスクリプトで実装した。

KingdomChronicle/Import Officer Data
KingdomChronicle/Import Bastion Data
KingdomChronicle/Import Scenario Data

メニューから実行するだけで全データが自動登録される。武将102件・拠点30件・シナリオ4本のインポートが完了している。

Spriteの自動アサイン

武将立ち絵・顔絵・拠点スプライトの自動アサインもインポーター内に実装した。

武将立ち絵:CR_{ID:D3}       例:CR_001
武将顔絵 :CR_{ID:D3}_Face  例:CR_001_Face
拠点領域 :B{ID:D2}         例:B01

ISpriteEditorDataProviderを使ってSpriteのRectをプログラムから登録している。UnityはY軸が左下原点なのでRect計算時に注意が必要だった。一度ミスした。

セーブデータ設計

セーブデータは3層構造で設計した。

内容
SystemData設定系(音量・言語等)
SaveDataRecordプレイ記録(コレクション・クリア数)
SaveDataCustomOfficerカスタム武将データ
SaveDataGameゲーム進行データ(4スロット)

カスタム武将については、元データ削除後もゲームが破綻しないよう、スロット内にスナップショットを複製する設計にした。

ScenarioDatabaseを途中で削除した

当初シナリオデータを管理するScenarioDatabaseを作っていたが、途中で削除した。

シナリオは4本固定だ。102件の武将・30件の拠点と違い、IDで大量のデータを索引する必要がない。Resources.Load<ScenarioData>("Data/Scenarios/S01")で直接ロードする方が実装がシンプルになる。

「とりあえず作る」より「本当に必要かを問い直す」。
そういう判断を意識するようにしている。


■ フェーズ3:仕様の言語化と画面実装

実装より先に、仕様を言語化して確定させた。
曖昧なまま実装すると、後で大量の手戻りが発生する。

戦争発生パターン(4種)

パターン概要
1vs1侵攻戦・迎撃戦・遭遇戦
同時多発同一勢力が複数戦争に同時関与・戦力は完全分離
三つ巴補正値=他全勢力との1vs1補正値の平均・最大戦力値の勢力が勝利
援軍侵攻側は要請コマンド必須・迎撃側は自動通知

訓練度の参照タイミングは「コマンドを入力した時点の値」に確定した。出陣後に訓練しても戦力値には反映されない。

三すくみの補正倍率

有利兵科に対して×1.5の武力補正を適用する。

これにより武力60の弓兵が武力90の槍兵と同等の戦力値になる。単一兵科の高武力集中は弱点になり、混成編成が戦略的に有利という設計だ。騎馬が見た目上武力寄りのキャラ(騎士系)になりやすいので、槍と弓の高武力確保が必須戦略になる。

ターンサイクル

1. ターン開始フェーズ
   戦争結果反映・収入・イベント
   → ここまでの情報が次フェーズで見える

2. プレイヤーコマンド入力フェーズ
   入力時点の値で全パラメータ確定

3. AIコマンド入力フェーズ(非表示)
   次ターンの1で結果が開示される

AIは後出しになるため構造的に有利。この優位をどこまで活かすかを難易度設定と連動させる。以下の仕様は仮で最終的な難易度はテストプレーで調整する。

Easy  :AI資源収入 ×1.0(プレイヤーと同等)
Normal:AI資源収入 ×1.2
Hard  :AI資源収入 ×1.5

タイトルシーンのモック実装

仕様が固まったところで画面実装に着手した。

演出フローをManagerTitle.csに実装している。

黒フェードイン → 背景フェードイン → ロゴフェードイン
→ PUSH ANY KEY 点滅 → キー入力
→ パネル右スライドイン + ロゴ左移動 + ボタン上スライドイン

NewGameフローはNewGameDataという静的クラスでScenarioIdDifficultyを一時保持してシーン遷移する設計にした。ManagerSceneTransitionを汚さずに済む。


■ 現時点の開発状況

カテゴリ状況
武将データ(102名)✅ 完了
拠点データ(30件)✅ 完了
シナリオデータ(4本)✅ 完了
セーブデータ設計✅ 完了
タイトルシーン✅ モック完了
スタートシーン⬜ 次回着手
メインシーン⬜ 未着手
戦闘計算式⬜ 仕様詰め中

執筆後記

「1週間くらいで作れると思ってた」は、いつも嘘になる。

でも今回は悔しくない。
土台をちゃんと作ったから、これからが速くなるはずだ。

スタートシーンが動いたら、一気にゲームらしくなる。
それを楽しみに、次のセッションへ。