【個人ゲーム開発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が障害物を迂回して動くようになっただけで、ゲームとしての説得力がぐっと上がった気がします。

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

バグ修正・機能追加・地形チップ量産、2日間の記録

今回も2日分をまとめてお届けします。

4月2日はひたすらピクセルアート作業、4月3日はバグ修正・機能追加・マップチップの描画問題解決と、かなりボリュームのある内容になりました。


■ 4月2日の開発状況

戦闘用スプライト 全25種完了

本日の作業のほぼ全てをここに費やしました(笑)

AI生成した元ネタ画像を元に、1種あたり1〜2時間かけて手動でピクセル調整を行い、全25種のピクセル単位調整が完了しました。

ユニット構成は歩兵・バイク・装甲車・各種戦車(軽・中・重)・自走砲・野砲など25種。

作業報告書にすると数行で終わりますが、丸1日ぶっ通しの集中作業でした(笑)
ヤクトパンターを模した以下は結構お気に入りです。


■ 4月3日の開発状況

1. ZOCバグ修正(Pathfinding.cs)

移動力3のユニットが、本来敵のZOC(Zone of Control)の都合で到達できないはずの地点まで移動できてしまうバグを修正しました。

原因はZOCマスに到達した後もキューに積んでいたため、探索が続いてしまっていたことです。

ZOCマスへの到達時はキューに積まずそこで探索を止める方式に修正し、あわせてGetPath()でZOCマスが目標地点の場合に経路確定できなかったバグも同時に修正しています。

ついでに重複していたロジックをヘルパーメソッドに統合するリファクタリングも実施しました。

2. 移動キャンセル時のスプライト戻し漏れ修正(UnitController.cs)

ユニットを移動させた後にキャンセルすると、スプライトが移動用の上面図(TopView)のままになるバグを修正しました。

UndoMove()でIdleアニメーションを再開する処理が抜けていたのが原因で、1行追加するだけで解決しています。

3. 戦闘画面の描画順修正(BattleManager.cs)

大型ユニットのスプライトが表示順によって重なって見えてしまう問題を修正しました。

スポーン後に全ユニットをY座標でソートしてSiblingIndexを設定する方式に変更し、手前のユニットが常に上に描画されるようになっています。

4. ランダムタイル機能追加(TileMappingDatabase.cs / MapManager.cs)

マップチップに「ランダム表示」フラグを追加しました。

これまでマップ作成時に手動でチップを選びながら配置してランダム感を出していましたが、フラグをONにしておくだけでステージロード時に登録チップの中からランダムに1枚が選ばれて表示されるようになります。

同じ地形でも毎回微妙に見た目が変わるので、マップに自然なばらつきが出ます。手間がごそっと省けたのでかなり助かっています。

5. スプライトPivot一括変更ツール作成(SpritePivotTool.cs)

縦長チップ(立体オブジェクトが正方形からはみ出すタイプ)に対応するため、スプライトのPivotを自動計算して一括設定するエディタツールを作成しました。

  • 正方形チップ(82×82px)→ Center(0.5, 0.5)を自動設定
  • 縦長チップ(82×Npx)→ Y = 41 ÷ 実際の高さ で正方形基準のCenter相当位置を自動計算

Unityのスプライトエディターでは複数スプライトのPivot一括変更ができないため、エディタスクリプトで解決しています。

6. マップチップの描画順問題を解決

今日一番の大仕事でした。

縦長チップ(山岳など)を縦に並べると、上のマスのチップが下のマスのはみ出し部分を上書きしてしまう問題が発生していました。

調査の結果、同じスプライト同士が隣接するとUnityのバッチ処理で描画順が不定になることが原因と判明。以下の設定変更で解決しています。

  • Tilemap Renderer の Mode を Individual に変更
  • Project Settings → Graphics → Transparency Sort Mode を Custom Axis(X:0, Y:1, Z:0)に変更

この設定でY座標が低いマス(手前)ほど後から描画されるようになり、俯瞰視点として正しい描画順が実現しました。

副作用としてユニットスプライトがTilemapの下に潜り込む問題が発生しましたが、ユニットPrefabのSpriteRendererのOrder in Layerを調整することで解決しています。

この対応によって、山岳など立体感のある縦長チップを縦に並べても奥行き感が正しく表示されるようになりました。マップに厚みと説得力が出てきます。

7. 地形チップ作成・登録

茂みチップを作成しました。平地ベースに低木オブジェクトを合成する方式で、20種前後のバリエーションを用意しています。

また山岳チップの試作と動作確認も実施。上述の描画順問題が解決したことで、縦長の山岳チップも安心して量産できる目処が立ちました。

現在のTileMappingDatabase登録状況はこちらです。

地形ステータス
平地(明緑・暗緑)登録完了
荒野(明茶・暗茶)登録完了
荒れ地(明茶・暗茶)登録完了
茂み登録作業中
林・森林・深森・山岳・山脈ほか作成中

すごーく地道な作業です。
まだ異なる地形同士の接続部分について考えていないのになかなか遅々として作業が進みません。道路とかどうしよう(笑)
ただ工夫として、以下の平野の地形チップですが、濃淡で10種づつ用意しています。で、基本チップを配置したら10種の中からランダムでマップへ配置されるので、手作業によるランダム配置とかやらずに済むよう仕組みを入れました。


■ 進捗メモと今後の課題

【現在の進捗状況】

  • 戦闘用スプライト: 全25種完了 ✅
  • 地形チップ: 平地・荒野・荒れ地・茂み対応済み、残り林系・山岳系など
  • 次回予定: 林・森林・深森・山岳チップ作成、ブリーフィングシーンデザイン着手

執筆後記 マップチップの描画順問題は地味にずっと気になっていたので、解決できたのが今日一番の収穫でした。山岳チップが正しく重なって表示されるだけで、マップの見た目がぐっと本物らしくなります。地形チップの量産がまだまだ続きますが、技術的な問題が片付いたので後は手を動かすだけですね。

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

ピクセルアートと地道な実装改善、2日間の記録

ピクセルアート作業が本格化してきました。
今回は2日分をまとめてお届けします。

コーディング的な意味での開発フェーズは一旦落ち着いて、ひたすら画像の作成と編集作業ばかりとなり、技術的には薄い内容(笑)になってます。


■ 3月31日・4月1日の開発状況

1. 戦闘画面のチームカラー色分け

戦術マップでは敵味方がカラーで区別されていましたが、戦闘演出画面ではこの色分けが反映されていませんでした。

今回、戦闘画面に配置されるユニットスプライトにもチームカラーを適用し、プレイヤー側は青系、エネミー側は赤系で統一。
戦術マップと戦闘画面で見た目に一貫性が出ました。

2. ユニット移動スプライトの不具合修正

移動中のユニット(特に敵ユニット)が、移動専用スプライトではなく待機スプライトのまま回転して表示されるバグを修正しました。

待機アニメーションのコルーチンが移動中も並走してスプライトを上書きしていたことが原因で、移動開始時にコルーチンを停止する処理を追加することで解決しています。

3. 地形情報パネルの表示改善

下部情報パネルの地形アイコン表示を改善しました。

これまでは各地形データに登録した専用アイコン画像を表示していましたが、マップチップの種類が増えるにつれてアイコンとの乖離が気になってきたため、実際にマップに配置されているチップ画像をそのまま表示する方式に変更しています。

カーソルを動かすと、そのマスに置いてある実際のチップが情報パネルにリアルタイムで表示されるようになりました。

4. ピクセルアート:2日間の成果

引き続きピクセルアートの作業を進めています。

項目ステータス
戦闘用スプライト13種 / 25種完了(+5)
マップチップ ベース6種完了
マップチップ 地形別2地形分作成完了
チップ用オブジェクトアート4枚作成

マップチップは各地形の土台となるベースチップから着手しました。
接続パターン(隣接チップとのなじみ)は後回しにして、まずは「1種類あたり最低限の見た目が成立する」状態を優先しています。

ユニットの上面図・側面図は全ユニット分のピクセルアート調整作業まで完了。
仕上がりはこんな感じです。

戦闘用のユニット画像は元ネタ(ピクセル単位の調整前)の画像は全て揃ったのですが、ピクセルアート調整作業がまだ大量に残ってます(笑)
出来た分の一部を公開。

マップチップはまだまだ時間が掛かりそうです。
画像自体は小さいのですが、マップタイルへ配置した時の異なるチップ同士の接続ビジュアル設計がなかなかしんどいです(笑)
とにかくパターンが多くなりそうなので如何に効率的な整理ができるかですね。


■ 進捗メモと今後の課題

機能面の細かい改善とピクセルアートの量産が並行して進んでいます。

【現在の進捗状況】

  • 戦闘用スプライト: 残り12種
  • 次回予定: ピクセルアート継続、ブリーフィングシーンデザイン着手

執筆後記

地形アイコンをマップチップ画像に切り替えてみたら、思いのほかゲームらしさが増した気がします。小さい改善でもプレイ感に効いてくるので、地道な作業も悪くないですね。