【Unity】RPGを作るチュートリアルその119 地獄のデバッグ作業
- 2025.08.18
- RPGチュートリアル
- RPG, Unity, ゲーム開発, チュートリアル

シンプルなRPGをUnityで作るチュートリアルシリーズの119回目です。
第118回ではイベント関連の効果音を実装しました。
今回は全体のデバッグ作業を行いたいと思います。現時点で私の方で気付いているものを中心に修正していきます。
制作環境
MacBook Pro 2023 Apple M2 Max
Unity6 (6000.0.30f1) Silicon
作業内容と順序
シンプルなRPGを作る上でどんな作業が必要か、どんな順番で作っていくと良さそうか、別ページで検討しました。基本的にこの流れに沿って進めていきます。
チュートリアルの一覧
このシリーズ全体の一覧は以下のページにまとめています。
前回の内容
前回はイベント関連の効果音を実装しました。
ゲームをデバッグしよう!
ここまでの一通りの実装、お疲れ様でした。もうすでに100回を超えてのチュートリアルなので、たくさんの作業を乗り越えてきました。
さて、実はチュートリアルの解説の中では触れずにいたいくつかのバグが残っているので、これを修正・解決していきましょう。現時点で私が検知しているものをこの回で直していきたいと思います。他にもあるかもしれないので、もし気付いてしまったらこっそりコメントで教えてください。
今回対応するのは以下のバグです。
- 戦闘中に消費アイテム以外を選択できてしまう
- Tilemapのタイルが表示されないことがある
実は先行してビルドした結果いくつか実機で発生するバグも検知しているのですが、実機ビルドについては次回以降で対応したいと思います。
戦闘中に消費アイテム以外を選択できてしまう点の修正
お気付きの方も多いかと思いますが、戦闘中に消費アイテム以外を選択すると、コンソールにて「未定義のアイテム効果です」と表示されて戦闘が進まなくなってしまう事象があります。例えば、戦闘中にアイテム画面から本来使えないようにしたい「皮の胸当て」を選択できてしまい、戦闘の進行が止まってしまいます。あと地味にアイテムの説明も別のアイテムのものになっています。
これらを修正していきましょう。

アイテムの効果を定義していないので、警告メッセージが出て止まります。

修正の方向性としては、
- 未定義のアイテム効果の時には「〇〇を使った! しかし何も起きなかった!」と表示する
- アイテムの説明で正しいものが表示されるようにする
- アイテム効果が「None」のものはアイテム画面で選択できないようにする
の方向で進めたいと思います。
未定義なアイテムだとしても戦闘自体は続けられるようにします。その上で、アイテム効果が「None」のものはアイテム画面で選択できないようにすることで、無駄なターン消費を防ぎます。確認の都合上、上から順番に修正して動作確認していきます。
未定義のアイテム効果の時には「〇〇を使った! しかし何も起きなかった!」と表示する
メッセージ定義を追加しつつ、未定義のアイテム効果の分岐を作成していきます。
メッセージ定義クラスの修正
「BattleMessage」に定義された文字列を追加します。
既存の「CannotRunaway」のフィールドの下に、効果がない時のメッセージ定義を追加します。
MessageWindowControllerの修正
「MessageWindowController」では、アイテムの効果がない時のメッセージ生成メソッドを追加します。
既存のGenerateUseItemMessage()のメソッドの下に、アイテムの効果がない時のメッセージを生成するGenerateNoEffectMessage()のメソッドを追加しました。アイテム使用時のメッセージに付け加えて表示するので「uiController.ClearMessage();」は呼ばないようにしています。
BattleActionProcessorItemの修正
「BattleActionProcessorItem」では、アイテムの効果がない時のコルーチンを追加します。
まずはProcessAction()のメソッドで分岐を追加します。アイテム効果として「None」が設定されている場合と、その他の場合に分けて分岐させています。これはアイテムの効果として「None」が設定されているなら意図して効果がない状態になっていると判断できますが、アイテムの効果として「Damage」を設定しているけどコード内で処理が書かれていない、なんて場合を検知できるようにしています。
あと細かい部分ですが、警告メッセージを出力する際にUnityのDebugクラスを使っていたので、このプロジェクト内のロガーである「SimpleLogger」を使用する形に修正しました。
続いて既存のShowItemHealMessage()のコルーチンの下に、アイテム効果がない時の処理を行うコルーチンを追加します。処理の流れは効果のあるアイテムとほとんど同じで、使用者のメッセージを表示した後、効果がなかった旨を表示するようにしています。
効果がない場合でも「_actionProcessor.SetPauseProcess(false);」を呼ぶことで後続の処理が呼ばれるようになっています。
BattleActionProcessorMagicの修正
「BattleActionProcessorMagic」でも同様に、魔法の効果がない時のコルーチンを追加します。
こちらも魔法の効果の分岐にて、「None」の場合とその他の場合を追加しました。その他の場合は警告を出力するようにしています。
クラスの末尾にShowNoEffectMessage()のクラスを追加しました。魔法の場合は消費MPの反映があるので、効果がなかった時のメッセージ表示のタイミングで「_battleManager.OnUpdateStatus();」を呼び出して画面左上のステータスを変更しています。
動作確認
スクリプトを保存したらゲームを実行して確認しましょう。事前の準備として、アイテム欄に装備品がある状態にしておきましょう。
戦闘を開始して、戦闘中に消費アイテム以外のアイテムを使用してみます。以下の画像のように、「しかし何も起きなかった!」と表示され、戦闘が継続していればOKです。魔法の場合は定義データを追加して確認を行いました。チュートリアル後の拡張時に魔法データを追加していく際に確認するのでも良いかと思います。

アイテムの説明で正しいものが表示されるようにする
続いて戦闘中にアイテム選択画面を表示した際に正しい説明文が表示されるようにします。現在の実装だと、ページ内アイテムのセットアップを行なった際に、一番最後のアイテムの説明がUIにセットされていて、カーソル選択時に反映されていない状態になっています。
そのため、アイテム選択ウィンドウでカーソルの移動時に対象のアイテムの説明をUIにセットするようにします。
「SelectionWindowController」のクラスを修正していきましょう。
方向キーでカーソルを移動した時のメソッドであるSelectRightItem()、SelectLeftItem()、SelectUpperItem()、SelectLowerItem()について、末尾で「ShowSelectionCursor();」としていた部分を「PostSelection();」に変更します。PostSelection()のメソッドは後ほど追加します。
既存のGetMaxPageNum()のメソッドとShowSelectionCursor()のメソッドの間にPostSelection()のメソッドを追加しました。このメソッドではカーソル移動の後に呼ばれる処理をまとめています。装備画面での実装に合わせる形ですね。
カーソルの表示を切り替えるだけでアイテムの説明文をセットしていなかったので、ShowSelectedItemDescription()のメソッドを追加してカーソル位置のアイテムや魔法の定義データを取得し、説明文をセットするようにしています。
InitializeSelect()ではPostSelection()を呼んで初期化の段階でその位置のアイテムの説明をセットするようにします。
また、ウィンドウを表示する際にカーソル選択を初期化するメソッドを呼ぶようにします。
動作確認
スクリプトを保存したらゲームを実行して確認しましょう。事前の準備として、アイテム欄に複数の項目がある状態にしておきましょう。
戦闘を開始して、アイテム画面を表示後、カーソルを移動させてそのアイテムの説明がUIのテキストに表示されることを確認します。

アイテム効果が「None」のものはアイテム画面で選択できないようにする
次に、アイテム効果が「None」のアイテムについてはアイテム画面でグレーアウトして選択できないようにします。選択画面のうち、アイテムに関する処理を行う「SelectionWindowItemController」のクラスにて、CanSelectItem()のメソッドでアイテムを使用できるかどうかの判定を行なっていますが、現在はアイテムの所持数だけ確認して0より大きければ使用できるようになっています。
この条件に加えて、アイテム効果も確認するようにしたいと思います。
また、IsValidSelection()のメソッドでもページ内のインデックスとして有効かどうかを調べた後に、アイテムの所持数を確認しているため、CanSelectItem()のメソッドを呼んで効果も確認するようにします。
コードの上部にあるIsValidSelection()から修正していきます。このメソッド内でアイテムの個数を確認していたので、同様の処理をしているCanSelectItem()を呼び出す形にしました。
アイテムの個数を確認する「isValidNum」の変数と、アイテム効果がNoneでないかどうかのフラグである「isValidEffect」の両方がTrueの時にアイテムを使用できるようにしたいと思います。
「isValidNum」の方は以前と同様にアイテムの個数について確認しています。
「isValidEffect」ではアイテムの定義データを取得してアイテムの効果がNoneでないことを確認しています。これによって、アイテムの効果がNoneのものについては画面上でグレーアウトされ、決定ボタンでも選択できないようになります。
動作確認
スクリプトを保存したらゲームを実行して確認しましょう。事前の準備として、アイテム欄に装備品がある状態にしておきましょう。
戦闘を開始して、アイテム画面を表示後、装備品がグレーアウトされていること、その装備品を選択できないことを確認します。

これで戦闘中に装備品を選択してゲームの進行が止まってしまう事象が解決しました。デバッグ時の修正はステップごとに分けて対応していくと修正しやすくなります。
Tilemapのタイルが表示されないことがある点の修正
次にTilemapのタイルが表示されないことがある点を修正していきます。これはコード側の問題というよりは私がうっかり設定を忘れていたことが原因なので申し訳ありません。
実は110回のゲームの開始と終了の機能を実装するタイミングにおいて、先行してリポジトリの方は修正していたのですが、今回のデバッグ作業にて詳細な修正を行いたいと思います。
「Tilemap Renderer」のコンポーネントでは、タイルの描画モードとしてデフォルトで「Chunk」が選択されています。Unityのマニュアルでは、Scriptable Render Pipelineとの互換性がないと記載されていて、このチュートリアルの最初にプロジェクトを作成した時にはScriptable Render PipelineのひとつであるURPを選択していたのでした。
私の環境だと何故か表示されていたのですが、たまたま別のPCでgithubからクローンして確認してみたところタイルが表示されずに「アイエエエ!? タイル!? タイルナンデ!?」となって気付きました。
そのため、「Tilemap Renderer」を使っている部分について描画モードを変更していきます。
まずは「Game」シーンを開きます。Hierarchyウィンドウではおそらく非表示にされたマップ用のPrefabがいるかと思いますので、Hierarchyウィンドウの検索バーにて「t:TilemapRenderer」と入力して、「Tilemap Renderer」がアタッチされているゲームオブジェクトを表示します。検索時に「t:」と先頭につけることで、型(タイプ)による検索ができるようになります。
もしシーン内にPrefabがいない場合は、Projectウィンドウから「Assets/Prefabs/Map」のフォルダを開き、個別にPrefabを編集モードとして表示して、同様に「t:TilemapRenderer」で検索して「Tilemap Renderer」がアタッチされているゲームオブジェクトを表示します。
対象のゲームオブジェクトが表示されたら、それらを複数選択します。Inspectorウィンドウから「Tilemap Renderer」のコンポーネントにて、「Mode」の項目を [SRP Batch] に変更します。

変更後は各Prefabにて変更を適用します。
この点はチュートリアル完了後、過去に遡って修正が適用できるかどうか確認しておきます。
今回のブランチ
まとめ
今回はデバッグ作業を行いました。全体が出来上がってくると、通して遊べるようになってバグにも気付きやすくなるので何度も遊んでみるのが大切ですね。
次回はゲームをビルドして動作を確認していきます。ビルドした際もエラーがたくさん出るんですよね……(白目)
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】RPGを作るチュートリアルその118 イベント関連の効果音を実装 2025.08.17
-
次の記事
記事がありません
コメントを書く