【Unity】RPGを作るチュートリアルその106 戦闘に関する機能を修正
- 2025.07.15
- RPGチュートリアル
- RPG, Unity, ゲーム開発, チュートリアル

シンプルなRPGをUnityで作るチュートリアルシリーズの106回目です。
第105回ではボスゴブリンの会話と戦闘のイベントを実装しました。
今回は前回動作確認中に見つけた戦闘関連で気になった部分を修正していきます。
制作環境
MacBook Pro 2023 Apple M2 Max
Unity6 (6000.0.30f1) Silicon
作業内容と順序
シンプルなRPGを作る上でどんな作業が必要か、どんな順番で作っていくと良さそうか、別ページで検討しました。基本的にこの流れに沿って進めていきます。
チュートリアルの一覧
このシリーズ全体の一覧は以下のページにまとめています。
前回の内容
前回はボスゴブリンの会話と戦闘のイベントを実装しました。
戦闘関連の修正
前回の作業で戦闘に関して確認していたところ、
- ボスからも逃げられる
- 逃げると勝利扱いになる
- 一度戦闘に負けた後、再度戦うとHPが残っていても負けになる
といった点が出てきたため、次回修正したいと思います。上2つについては、イベントプロセス側から逃走できるかどうかのフラグをセットできるようにします。3つ目については、全回復時に撃破フラグをfalseにする処理が入っていない可能性があるため、その部分を修正します。
逃走可能フラグの作成
「BattleManager」にて、逃走可能フラグを作成して、実行中の戦闘で逃げられるかどうかによって処理を分岐できるようにします。基本方針としては、通常のエンカウントによる戦闘は逃げられるように、イベント戦闘は逃げられないようにしたいと思います。イベント戦闘に関しては、「EventProcessBattle」に逃走可能フラグを追加し、Inspectorウィンドウから設定できるようにします。
「逃げる」を選択した際に、通常の失敗メッセージと同じだと、素早さやリアルラックの問題で逃げられないと思ってしまう可能性があるため、ターンを経過させずに「この戦闘からは逃げられない!」と表示してコマンド選択に戻るようにします。
変更が必要なクラスはちょっと多いですが、
- BattleMessage
- MessageWindowController
- CommandWindowController
- BattleManager
- EventProcessBattle
- EncounterManager
に変更を加えていきます。
BattleMessageの変更
「BattleMessage」のクラスでは逃走不可の戦闘で表示するメッセージを定義します。
既存の「LevelUpNumberSuffix」の下に新しくフィールドを追加します。
MessageWindowControllerの変更
「MessageWindowController」では逃走できない時のメッセージを生成する処理を追加します。戦闘に関するメッセージ表示では、それぞれ必要なメソッドを作っていたので、それに合わせて追加していきましょう。
こちらも既存のGenerateLevelUpMessage()のメソッドの下に、新しくメソッドを追加します。
CommandWindowControllerの変更
「CommandWindowController」ではコマンドを選択できるかどうかのフラグを追加します。コマンド選択のフェーズ以外ではキー入力を検知しないようになっていますが、逃走不可のメッセージを表示している間はコマンド選択のフェーズのままなので、制御用のフラグを追加したいと思います。
コマンドを選択できるかどうかのフラグとして「_canSelect」のフィールドを追加しました。
既存のSetUpController()のメソッドの下にSetCanSelectFlag()を追加して、外部のクラス(BattleManager)から選択できるかどうかの状態を制御できるようにします。
SelectCommand()の中では、フェーズの確認の後ろに「_canSelect」のフラグを確認する処理を入れ、フェーズ以外でもコマンド選択できるかどうかの制御を入れています。
BattleManagerの変更
「BattleManager」では、逃走不可のフラグ用フィールドと、それを外からセットできるメソッドを追加します。また、フラグの値に応じて、「逃げる」のコマンドを選択した際にメッセージを表示する処理も入れていきましょう。
メッセージに関しては表示後のコールバックを分岐させます。現在はフェーズを使って分岐させていましたが、逃走不可のメッセージはコマンド選択のフェーズ内の処理になるため、別途フラグを用意して処理を分岐させます。
既存の「IsBattleFinished」の下に、逃げられるかどうかのフラグの「CanRunaway」とメッセージのコールバック時に処理を分岐させるかどうかのフラグの「_handleRunnawayMessage」をフィールドとして追加します。
既存のRegisterCallback()のメソッドの下にSetCanRunaway()のメソッドを追加し、逃げられるかどうかのフラグを外部からセットできるようにします。
StartInputCommandPhase()のメソッドにて、コマンドウィンドウに選択可能フラグをセットするメソッドを呼び出します。
既存のSetRunCommandAction()のメソッドで「CanRunaway」の値を確認する処理を追加します。もしfalseの場合は、逃走不可のメッセージを表示するShowCannotRunawayMessage()を呼び出します。
ShowCannotRunawayMessage()では、コマンドウィンドウの選択可能フラグをfalseに切り替えます。これによってメッセージ表示中のコマンド選択を防ぎます。また、「_handleRunnawayMessage」をtrueにすることで、メッセージ表示後に呼ばれるOnFinishedShowMessage()内の分岐を通るようにします。
EventProcessBattleの変更
「EventProcessBattle」では、逃走できるかどうかのフラグを設定するためのフィールドを追加します。戦闘機能を呼び出す時にこのフラグをセットするようにします。
既存の「_loseProcess」の上に「_canRunaway」のフィールドを追加します。
Execute()の中では、敵キャラクターのIDをセットするタイミングで逃走可能フラグについてもセットするようにします。
EncounterManagerの変更
「EncounterManager」でも逃走可能フラグを戦闘機能に渡すようにします。通常のエンカウントでは逃げられるようにしたいので、trueを固定で渡すようにします。もし通常エンカウントでも逃げられないケースを作りたい場合は、マップ単位で逃走可能フラグを持つか、敵キャラクターの定義で逃走可能フラグを持たせるなどの方法もあります。
CheckEncounter()の処理の中で、戦闘機能の準備をしている部分でSetCanRunaway()を呼び出してフラグをセットします。
全回復時の撃破フラグの変更
全回復の処理を行う際に、撃破フラグをfalseにする処理を入れてなかったため、一度戦闘で負けた後、敵から攻撃を受けるとHPが残っていても敗北扱いになってしまっていました。そのため、「CharacterStatusManager」で全回復の処理を呼び出すタイミングで、撃破フラグについてもfalseにできるようにします。
既存のRefreshPartyCharacter()のメソッドの下にSetDefeatedFlag()のメソッドを追加し、撃破フラグを変更できるようにします。このメソッドはRefreshPartyCharacter()の中から呼び出すようにしておきます。これにより、全回復の処理に撃破フラグについてもfalseになります。
動作確認
スクリプトファイルを保存したら動作確認を行いましょう。
逃走不可の戦闘の設定
逃走できない戦闘の確認として、ダンジョンの奥にいるボスゴブリンと戦ってみます。この時、「逃げる」コマンドを選択した際に逃走できないメッセージが表示されることを確認します。

また、通常のエンカウントによる戦闘も行い、逃走できることを確認します。
敗北後の撃破フラグの回復
一度敗北して村長の前に戻った後、HPがある状態でも敵の攻撃を受けると再度敗北してしまう事象がありました。撃破フラグについては修正を行なったので、ボスゴブリンなどと戦って敗北した後、スライムと戦ってHPが残っている間は敗北にならないことを確認します。敗北する際には、防具を外すとダメージが増えて確認しやすくなります。
後のチュートリアルでエンディングを確認する際にボスゴブリンと戦うところから動作確認したいため、ボスゴブリン前でセーブしたデータを残しておくと便利です。
今回のブランチ
まとめ
今回は戦闘関連で気になった部分として、ボス戦で逃走できないようにする機能の実装、全回復時の撃破フラグの扱いの修正を行いました。通しでプレイできるようになってくると、色々なことに気付けますね。
次回はエンディングのイベントを実装していきます。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】RPGを作るチュートリアルその105 ボスに関するイベントを実装 2025.07.12
-
次の記事
【Unity】RPGを作るチュートリアルその107 エンディングのイベントを実装 2025.07.16
コメントを書く