【Unity】RPGを作るチュートリアルその60 戦闘結果を処理する機能を実装

【Unity】RPGを作るチュートリアルその60 戦闘結果を処理する機能を実装

シンプルなRPGをUnityで作るチュートリアルシリーズの60回目です。シンプルなRPGと言いながらもう60回もやっているなんて、RPGは奥深いですね(白目)

第59回では戦闘機能全体を管理するクラスにて、ユーザが選択したコマンドに応じた行動を登録し、それを処理していく部分を作成しました。

今回は戦闘終了の処理を作成していきましょう。

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

シンプルなRPGを作る上でどんな作業が必要か、どんな順番で作っていくと良さそうか、別ページで検討しました。基本的にこの流れに沿って進めていきます。

 

チュートリアルの一覧

このシリーズ全体の一覧は以下のページにまとめています。

 

前回の内容

前回は戦闘機能全体を管理するクラスにて、ユーザが選択したコマンドに応じた行動を登録し、それを処理していく部分を作成しました。

 

戦闘終了の処理を行うクラス

行動を処理する機能の実装が完了したので、戦闘が終わる時の処理についても実装していきたいと思います。行動終了時に敵を倒した、味方がやられた、という情報は「BattleManager」に通知されますが、それを元に戦闘勝利時、敗北時の処理を別クラスで担当し、その処理が終わったことをまた「BattleManager」に通知するようにします。

実装したい機能としては、

  • 必要な参照用フィールド
  • キー入力を待つフラグ
  • メッセージ表示を待つフラグ
  • 初期化処理のメソッド
  • キー入力を待つメソッド
  • 勝利時の処理メソッド
  • 敗北時の処理メソッド
  • メッセージ表示のフラグを切り替えるメソッド

です。勝利時のメッセージを表示したり、敗北時のメッセージを表示するにあたって、行動クラスと同様にメッセージ表示を待つフラグを用意しています。

Projectウィンドウから「Assets/Scripts/Battle」のフォルダに移動し、MonoBehaviourのスクリプトファイルを作成します。名前は [BattleResultManager] にしました。

スクリプトファイルの作成
スクリプトファイルの作成

 

作成した「BattleResultManager」の中身は以下のように記載しました。

「BattleManager」のへ参照はコールバック用、「EnemyStatusManager」への参照は経験値やゴールドの取得用、「MessageWindowController」への参照はメッセージ表示用に使用します。

フラグ類としては2種類用意していて、キー入力を待つフラグの「_waitKeyInput」と、メッセージ表示を待つ「_pauseMessage」があります。

初期化処理としてSetReferences()を用意していて、こちらで必要な参照をアサインするようにしています。

Update()からはキー入力を確認する処理のKeyWait()を呼びます。こちらは後ほど詳しく説明したいと思います。

OnWin()は戦闘に勝利した時の処理で、敵キャラクターの経験値やゴールドを取得し、主人公のステータスに反映しています。これらの処理が終わった後、行動の処理と同じような感じでメッセージ表示のWinMessageProcess()のコルーチンを起動します。コルーチン内ではメッセージを待つ処理に加えて、キー入力を待つ処理も使って処理をポーズするようにしています。レベルが上がった場合は専用のメッセージを表示して、「BattleManager」の戦闘終了処理を呼び出します。

KeyWaitProcess()はキー入力を待つためのコルーチンです。キー入力が必要なタイミングでページ送りのカーソルを表示してキー入力を待ちます。while文を使ってフラグを確認していて、KeyWait()のメソッド内で決定ボタンまたはキャンセルボタンの入力を検知するとキー入力を待つフラグがfalseになってコルーチンが終了するようになっています。

OnLose()は戦闘に負けた時の処理で、メッセージ用のコルーチンを起動した後、「BattleManager」の負けた場合の戦闘終了処理を呼び出します。全滅した場合は村長の前に戻せるように専用のメソッドを用意しましょう。そのメソッドはこの後実装していきます。

 

既存のクラスの修正

今回実装した機能と繋ぎ合わせるため、既存のクラスも修正していきます。対象は、

  • BattleManager

です。

 

BattleManagerの修正

「BattleManager」では

  • 「BattleResultManager」への参照用フィールドを追加
  • 「BattleResultManager」の初期化処理を追加
  • メッセージ表示のコールバックで分岐を追加
  • 敵に勝った時、負けた時に「BattleResultManager」の処理呼び出しを追加
  • 戦闘終了時の処理を追加

を行います。

 

フィールドの追加

「BattleActionProcessor」の後ろに「BattleResultManager」への参照用フィールドを追加しました。

 

初期化処理の追加

既存の戦闘開始処理であるStartBattle()で、「BattleResultManager」のSetReferences()を呼び出すようにしました。

また、ターン数のカウント、戦闘中フラグの初期化についてもここで行うようにしました。

 

メッセージ表示のコールバック

既存のOnFinishedShowMessage()のメソッドにて、戦闘結果のフェーズの場合に「BattleResultManager」のShowNextMessage()を呼び出すようにしました。

 

「BattleResultManager」の処理呼び出し

行動処理のクラスを実装するときに作った勝利時のメソッド、負けた時のメソッド、敵が逃げた時のメソッドでそれぞれ「BattleResultManager」のメソッドを呼び出すようにしました。

 

戦闘終了時の処理

既存のOnFinishBattle()に戦闘終了の処理内容を記載しました。また、OnFinishBattleWithGameover()としてゲームオーバー時の戦闘終了処理も用意しています。こちらは村長の前に戻す処理を入れる予定ですが、現時点ではコンソールにメッセージを表示するに止め、OnFinishBattle()と堂々の処理を入れています。

 

スクリプトのアタッチ

スクリプトを保存したら、ゲームオブジェクトの作成してスクリプトをアタッチしましょう。

 

BattleResultManagerのアタッチ

Hierarchyウィンドウから「BattleParent」の下にある「Managers」のゲームオブジェクトを選択し、子オブジェクトとして空のゲームオブジェクトを作成しましょう。名前は [BattleResultManager] にしました。

ゲームオブジェクトの作成
ゲームオブジェクトの作成

 

Inspectorウィンドウで今回作成した「BattleResultManager」をアタッチします。

スクリプトのアタッチ
スクリプトのアタッチ

 

参照のアサイン

「BattleManager」に参照用のフィールドを追加したので、こちらも参照をアサインしておきます。Hierarchyウィンドウで「BattleManager」のゲームオブジェクトを選択し、Inspectorウィンドウから「BattleResultManager」への参照をアサインします。

参照のアサイン
参照のアサイン

 

動作確認

ゲームを実行して戦闘を開始し、終了時の流れを確認しましょう。

戦闘に勝利した時は敵キャラクターが消え、経験値とゴールドがメッセージウィンドウに表示されます。ページ送りのカーソルが表示されている時に決定ボタンまたはキャンセルボタンを押すと、移動画面に戻ります。

戦闘に勝利した時の動作
戦闘に勝利した時の動作

 

戦闘に敗北した時は敵キャラクターがそのまま表示され、全滅時のメッセージがメッセージウィンドウに表示されます。ページ送りのカーソルが表示されている時に決定ボタンまたはキャンセルボタンを押すと、移動画面に戻ります。

戦闘に敗北した時の動作
戦闘に敗北した時の動作

 

戦闘から逃走した時には、逃走のメッセージが表示された後、キー入力なしで移動画面に戻ります。

これらの動作が確認できれば今回は完了です。

 

今回のブランチ

 

まとめ

今回は戦闘終了の処理を作成しました。戦闘開始から終了までの流れができたので、おおまかに戦闘機能を確認できるようになりました。

次回はデバッグ用の機能からではなく、移動時に戦闘を呼び出すエンカウントの部分を作成していきます。

     

ゲーム開発の攻略チャートを作りました!

CTA-IMAGE

「ゲームを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


ゲームを作り始めた時にぶつかる壁である「何をしたら良いのか分からない」という悩みを吹き飛ばしましょう!