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

テストプレーしながら一歩進んでは戻る日

概ね基本的な実装が完了し、ユニットや地形チップなど素材もある程度揃ったのでステージ用マップの編集や敵味方ユニットの配置など楽しいフェーズも少しづつしています。

その結果、テストプレー→気になる点やバグ発見→いろいろ対応を検討するという流れで一歩進んでは戻るみたいな感じになってます(笑)

Unityのタイルマップにて作成した地形チップをパレット登録してマップをデザインします。画面は最初のステージなので少し小さいサイズです。地形チップはまだ接続部分とか作ってないので昔のゲームのようにマスとマスがきっちり分かれる感じの見た目(笑)

それから次はステージデータの編集です。
ここではステージ登場するユニットを登録します。種類や座標など。ただ座標は数値で見てもどこらへんかわかりにくいので位置編集用のツールを作りました。なのでここではとにかく登録するだけで座標はあとから触ります。

作ったマップ(プレハブ)とステージデータをエディターツールにセットして以下の画面のようにユニットシンボルを表示させます。ドラッグ&ドロップで動かせるので直感的でいいですね。ついでに拠点座標も触れるようにしてます。

作ったステージはテストプレーして、敵が味方ユニットに到達するタイミングや有利な交戦場所など細かく調整して、評価用のターン数など検討しています。


■ 本日の開発状況

1. 敵AI移動ロジックの改善

テストプレーで一番気になったのがこれでした。

山岳など通行不可マスに隣接した位置に敵ユニットがいると、攻撃範囲に入るまでその場から全く動かなくなる問題が発生していました。

原因:
移動先の選定に直線距離(ヘックスグリッド上の最短距離)を使っていたため、障害物を考慮した経路選択が行われていませんでした。山岳を迂回するには一時的にターゲットから遠ざかる必要がありますが、「直線距離が縮まらない移動はしない」というロジックになっていたので動かなかったわけです。

対応:
経路探索(A*)を使って実際の移動コストベースで最近傍プレイヤーを選定する方式に変更しました。具体的には移動力を999に設定したGetPath()で障害物を迂回した経路を取得し、その経路を実際の移動力の範囲内で辿るという方式です。

あわせて敵AI全体の処理をコルーチン化し、1ユニットごとにフレームを譲ることでプチフリーズも解消しています。

また移動範囲外の接近探索には、ZOC(Zone of Control)判定を省略した軽量版の経路探索メソッドを新規に追加しています。移動範囲外の接近に厳密なZOC計算は不要なので、処理負荷を大幅に削減できました。

AIパターンと拠点移動の仕様も整理しました:

パターン動作
Aggressive常時移動・拠点攻略あり
TimedAggressive設定ターン経過後に行動開始
Defensive攻撃範囲に敵が入ったらトリガー発動
GroupTrigger同グループのトリガー発動後に行動
Stationaryいかなる状況でも移動しない(固定野砲など)

Stationaryは大抵、固定野砲や敵拠点上の重戦車に設定する想定です。


2. カメラズーム機能の実装

広めのマップになるとカメラスクロールだけでは全体把握がしんどいと感じたので、ズーム機能を追加しました。

仕様:

  • 5段階ズーム:50% / 75% / 100% / 150% / 200%
  • 操作:マウスホイール+右パネル下部の+−ボタン
  • ズームアウト制限:マップが画面内に収まった時点でそれ以上のズームアウトを禁止

50%まで引くとマップ全体がある程度把握できるので、戦況確認がかなり楽になりました。

実装で一番ハマったのはCanvasの扱いです。本プロジェクトはCanvasがすべてScreen Space – Cameraモードのため、カメラのOrthographicSizeを変えるとCanvasのPlaneDistanceも連動して調整しないとUIが崩れます。この対応に想定外に時間がかかりました。

また50%ズームアウト時にマップが画面に収まる場合はカメラを固定位置に設定するのですが、右パネル・下パネルを考慮した位置オフセットの計算も必要で、解像度が変わっても正しく動くようにピクセル→ワールド座標変換を使って実装しています。


3. Debugログのビルド無効化

Unity上ではデバッグ用のログを大量に仕込んでいましたが、Debug.Log()はビルドにもそのまま含まれてパフォーマンスに影響します。

ゲーム起動時に必ず実行されるInitializeシーンで、エディタ以外のビルドではDebugログを無効化する処理を追加しました。

#if !UNITY_EDITOR
    Debug.unityLogger.logEnabled = false;
#endif

シンプルですが、リリース前に忘れずやっておきたい対応です。


■ 進捗メモと今後の課題

【現在の進捗状況】

  • 敵AI移動: 経路距離ベースの移動に対応 ✅
  • カメラズーム: 5段階ズーム実装 ✅
  • 地形チップ: 平地・荒野・荒れ地・茂み・山岳(試作)対応済み
  • 次回予定: 地形チップ量産継続、ブリーフィングシーンデザイン着手

執筆後記
テストプレーを始めると「ここが気になる」「あそこも直したい」が次々出てきてキリがないですね(笑)
ただプレイフィールはゲームの第一印象を決める最重要要素だと思っているので、地味でも手触り感の改善は優先度高めで対応しています。
敵AIが障害物を迂回して動くようになっただけで、ゲームとしての説得力がぐっと上がった気がします。