【Unity】RPGを作るチュートリアルその86 イベントの定義を行うクラスの実装

【Unity】RPGを作るチュートリアルその86 イベントの定義を行うクラスの実装

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

第85回では実行するイベントのページの条件を設定するクラスについて実装しました。

今回はイベントをまとめるクラス、イベントページ、イベントプロセスのベースクラスなど、イベントの定義を行うクラスについて実装します。それぞれ参照が必要だったりしてまとめて実装しないとコンパイルエラーが出るため、ちょっと長くなりそうですが今回でまとめてやってしまいましょう。

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

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

 

チュートリアルの一覧

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

 

前回の内容

前回は実行するイベントのページの条件を設定するクラスについて実装しました。

 

イベントの定義を行うクラス

イベントの動作を設定するためのクラスとして、以下の画像のうち3つのクラスを実装していきたいと思います。

  • EventFileData
  • EventPage
  • EventProcessBase

グラフィック部分については次回以降に実装していきます。

 

イベント関連のクラスのイメージ図
イベント関連のクラスのイメージ図

 

「EventProcess」に関しては、ベースクラスを作って、それをページ内で取りまとめる形にしていきます。また、「EventFileData」では「EventPage」を取りまとめていきます。

そのため、下位の「EventProcess」から作成していきましょう。

 

イベントプロセス用のクラスを作成

イベントページ内の個別の処理についてはイベントプロセスと呼ぶようにしましょう。イベントプロセスはメッセージの表示や、アイテムの増減など、ゲーム内の様々なイベントを定義するものになります。今回はそのベースクラスとして共通する処理を実装していきます。

共通する処理として入れたいのが、

  • 次のイベントプロセスへの参照
  • イベントページ、イベントデータへの参照
  • イベントの処理を行うメソッド
  • 次の処理を呼び出すメソッド

です。イベントプロセスに関しては、次に呼び出すプロセスをInspectorウィンドウから指定する形で実装したいと思います。設定の手間はあるのですが、分岐処理などを考えたときに、次に実行するプロセスを指定できる形だと実装しやすかったのでこのようにしています。

共通のメソッド類については、必要に応じて派生先でoverrideできるようにしておきましょう。

Projectウィンドウから「Assets/Scripts/Event」のフォルダを開き、新しくフォルダを作成します。名前は [Process] にしました。イベントプロセス関連のスクリプトファイルは多くなることが予想されるので、個別にフォルダを用意しています。

プロセス用フォルダの作成
プロセス用フォルダの作成

 

作成した「Process」のフォルダに移動し、新しいMonoBehaviourのスクリプトファイルを作成します。名前は [EventProcessBase] にしました。

プロセスのベースクラス
プロセスのベースクラス

 

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

「_nextProcess」のフィールドでは次に実行するプロセスを指定します。Inspectorウィンドウから設定できるため、エディタ等がなくてもUnityデフォルトの機能でイベントの繋がりを表現するようにしました。

「EventPage」への参照は主にプロセスの終了を通知する用途で使います。次のプロセスを実行するのは「EventPage」側で行うため、実行対象のプロセスがあるかどうかを判断して次に進むようにします。「_nextProcess」のフィールドの参照がなかったら、ページ内の処理が完了したと判断します。

「EventFileData」への参照は全部のプロセスで使うわけではありませんが、どのイベントに紐づいているのかの情報があった方が便利なことも多いのでフィールドとして用意しています。今回のチュートリアルで作成する範囲だと、グラフィックの更新を行う際に「EventFileData」に紐づくグラフィック用の制御クラスを呼び出すため、この参照を使う想定です。

SetEventPageReference()のメソッドでは必要な参照をセットしています。「EventPage」から呼び出される際に参照が渡される想定です。

Execute()はイベントの処理の本体です。派生したクラス側でoverrideしてそれぞれの処理を行う想定です。

CallNextProcess()は次のプロセスに進む処理です。引数で実行するプロセスが指定されていればそのプロセスを、そうでなければフィールドとして指定したプロセスを「EventPage」に渡します。はい、いいえでの分岐の場合、次に進むプロセスを複数用意しておいて、条件に応じたプロセスを引数で渡すことで、対応する流れに進めるようにしています。

 

イベントページ用のクラスを作成

続いてイベントページ用のクラスを作成していきます。このクラスではページに対応する条件の確認と、プロセスの順次実行を行います。

条件に関しては前回作成した「EventPageConditionBase」の派生クラスを指定します。リストとして保持することで、複数の条件を指定することができるようにしましょう。今回のチュートリアルの中では、リスト内の条件が全てtrueの時に実行されるAND条件で実装していきます。場合によってはOR条件で作成したいケースもあるかと思いますので、チュートリアル後の拡張として実装すると良いかもしれません。

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

イベントページ
イベントページ

 

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

「_conditions」のフィールドでは条件用のクラスをリストとして保持します。「_eventTrigger」のフィールドでは、イベントを開始する方法を指定します。決定キーで開始する、自動で開始する、といった形で、それぞれイベントの確認タイミングが異なるので、対応する開始方法のページを実行するようにします。

「_startProcess」はページ内の最初のプロセスを指定します。「_targetEventProcess」は実行対象のプロセスを保持するためのフィールドです。ページの最初の処理では「_startProcess」のものを渡し、プロセスの終了は引数で渡されたプロセスをアサインします。

「EventFileData」のプロパティでは「_eventFileData」の値を返しています。これはプロセス側で呼び出しています。

IsMatchedConditions()のメソッドではforeachで条件のリストを回して、全部がtrueならメソッドとしてtrueを返すようにしています。IsMatchedTrigger()のメソッドではイベントの実行方法が一致しているかを確認します。これら2つのメソッドは「EventFileData」のクラスから、実行対象のページを特定するために使用します。

StartEvent()のメソッドでは必要な参照を渡してイベントの実行処理であるExecuteEventProcess()を呼び出しています。「_targetEventProcess」がnullならページ内の実行対象プロセスがないと判断して終了処理を行います。そうでなければ対象のプロセスを実行します。プロセス側のExecute()を共通で呼び出せるので、overrideできるように実装していました。

OnFinishedEventProcess()のメソッドはプロセス側から終了時に呼ばれる処理で、次に実行するプロセスが渡されます。プロセスがあれば実行対象としてアサインした後、再びExecuteEventProcess()を呼び出します。

OnFinishedEventPage()のメソッドはページ内の処理が完了した時に呼び出される処理で、次回以降に実装するイベント処理用クラスの「EventProcessor」に完了を通知する予定です。

 

イベントを取りまとめるクラスを作成

次にイベントを取りまとめるクラスを作成していきます。このクラスでは、ゲームオブジェクトに紐づくイベントページの一覧を取得する処理と、その中から条件に合致するページを取得して実行する処理を行います。

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

イベントデータ
イベントデータ

 

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

「_eventPages」のフィールドでは、子オブジェクト内にある「EventPage」を保持します。この処理についてはSetUpEventPages()の中で行なっていきます。

ExecuteEvent()は外部からのイベント実行の起点になるメソッドで、上で少し触れたイベント処理用クラスの「EventProcessor」から呼び出す想定です。

GetEventPage()のメソッドでは実行対象のイベントページを取得します。「EventPage」のクラスで実装した条件確認のメソッド、イベントトリガーの確認メソッドを使って、一致するページを実行対象として取得しています。取得後はStartEvent()のメソッドを呼び出してページ内の処理を行うようにします。

 

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

 

今回のブランチ

 

まとめ

今回はイベントをまとめるクラス、イベントページ、イベントプロセスのベースクラスなど、イベントの定義を行うクラスについて実装しました。それぞれMonoBehaviourのクラスとしてシーン内のゲームオブジェクトにアタッチするので、Hierarchyウィンドウ内で視覚的にも構成が分かりやすくなることを狙っています。

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

     

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

CTA-IMAGE

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


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


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