【Unity】RPGを作るチュートリアルその88 イベントを処理するクラスを実装

【Unity】RPGを作るチュートリアルその88 イベントを処理するクラスを実装

シンプルなRPGをUnityで作るチュートリアルシリーズの88回目です。

第87回ではイベントのグラフィックを切り替えるための機能を実装しました。

今回はイベントを処理するクラスを実装していきます。

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

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

 

チュートリアルの一覧

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

 

前回の内容

前回はイベントのグラフィックを切り替えるための機能を実装しました。

 

イベントを処理するクラス

イベントを個別に定義するクラスについては実装が完了したので、今回は対象となるイベントの処理を行なっていくクラスを実装します。戦闘シーンで実装した「BattleActionProcessor」のようなイメージで、イベント処理中の状態切り替えやイベントファイルに対する実行処理などを行なっていきます。

イベントの処理にあたっては、イベント完了を通知するためのインタフェースや、複数のイベントをキューに追加する機能なども追加したいと思います。そのため、

  • イベント完了を通知するためのインタフェース
  • イベントのキューの情報
  • イベントを処理するクラス

を作成していきます。

 

イベント完了を通知するためのインタフェース

イベントを実行する際には、イベントを処理するクラスを通して実行していきます。そこで、呼び出し元にイベントの完了を通知するためにインタフェースを用意します。

Projectウィンドウから「Assets/Scripts/Event」のフォルダを開き、空のスクリプトファイルを作成します。名前は [IEventCallback] にしました。

イベント完了のコールバック
イベント完了のコールバック

 

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

イベント実行の呼び出し元クラスでは、このインタフェースを実装し、イベント完了後の後処理を行います。

 

イベントのキューの情報

別のイベントを実行中に、さらにイベントの実行呼び出しが来るケースもあります。例えば、マップに入ったときの自動イベントが複数あるケースなどです。これに備えて、イベントの実行中に他の呼び出しが発生したら、キューに保持しておく仕組みを入れたいと思います。

キューに保持する際には、

  • どのゲームオブジェクトか
  • イベントの実行方法
  • コールバック先

を保持しておくことで、通常のイベントの呼び出しと同様に処理することができるため、これらを保持するためのクラスを用意します。

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

イベントのキュー情報
イベントのキュー情報

 

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

上で挙げた3項目をフィールドとして実装しています。ゲームオブジェクトに関しては、子オブジェクト内にある「EventFileData」を取得してイベントを実行していく流れになります。

 

イベントを処理するクラス

イベントを処理するクラスを作成していきます。このクラスでは、イベントを実行中かどうかのフラグを保持したり、キューとして次に実行するイベントを保持したりするなど、イベント実行に関する制御を行います。

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

イベントを処理するクラス
イベントを処理するクラス

 

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

この時点ではコンパイルエラーが出ますが、今回の後半に「EventFileData」や「EventPage」にて「EventProcessor」に関する実装を行います。

「_characterMoverManager」はキャラクターの動作を停止/再開するために参照を保持します。「_currentEventFileData」のフィールドでは現在実行中のイベントファイルを保持します。コールバックやキューについてもフィールドとして保持するようにしましょう。

AddQueue()のメソッドではキューに情報を追加します。基本的には移動時や決定キーを押した時には1つのイベントが実行される想定ですが、マップ内の自動イベントなどは複数存在する可能性もあるため、外部からキューに追加できるようにしています。

StartEvent()のメソッドからはコルーチンを起動しています。キューに複数のイベントがある場合、後続のイベントに関してはイベントの実行中フラグを確認して、それがtrueの間は待つようにしています。

ExecuteEvent()のメソッドに関しては、ゲームオブジェクトを渡すもの、イベントファイルを直接渡すもの、といった形で2つのオーバーロードを用意しています。ゲームオブジェクトを渡す方はGetEventFile()のメソッドを使って、ゲームオブジェクト自身、またはその子オブジェクトに存在する「EventFileData」を取得します。

ExecuteEventFile()のメソッドはイベントを処理するための準備を行なった上で、イベントファイル側に実行を通知します。

OnEventFinished()のメソッドはイベントファイル側から完了の通知を受け取るもので、キューにイベントが残っていればその処理に進み、そうでなければイベントの呼び出し元に完了を通知します。

 

既存のクラスの変更

「EventProcessor」とのやりとりを行うため、以下のクラスを変更します。

  • EventPage
  • EventFileData

EventPageの変更

「EventPage」のクラスでは「EventProcessor」への参照を保持するフィールドの追加と、完了通知処理を実装します。

フィールドでは以下のように「_eventProcessor」のフィールドを追加しました。

 

ページ内のイベントを開始する処理のStartEvent()では、完了通知を行えるように引数として「EventProcessor」への参照を渡すようにします。メソッド内では参照をフィールドにキャッシュします。

 

空欄にしていたOnFinishedEventPage()のメソッド内では、「EventProcessor」のOnEventFinished()を呼び出すようにします。

 

EventFileDataの変更

「EventFileData」のクラスでは「EventProcessor」への参照を保持するフィールドの追加と、参照をセットするメソッドの追加、イベントページに参照を渡す処理を追加します。

ExecuteEvent()より後ろは変更がないので省略しています。

 

今回も動作確認を行うところまではいかないので、スクリプトを保存してコンパイルエラーがないことを確認したら完了です。

 

今回のブランチ

 

まとめ

今回はイベントを処理するクラスを実装しました。イベントの実行状態を保持して、全体を制御するクラスがあると処理の流れを把握しやすくなるかと思います。

次回はイベント用のスクリプトをアタッチするため、既存のNPCのゲームオブジェクトについてテンプレート用Prefabを作成していきます。

     

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

CTA-IMAGE

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


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


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