【Unity】RPGを作るチュートリアルその87 イベントのグラフィックを切り替える機能を実装

【Unity】RPGを作るチュートリアルその87 イベントのグラフィックを切り替える機能を実装

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

第86回ではイベントをまとめるクラス、イベントページ、イベントプロセスのベースクラスなど、イベントの定義を行うクラスについて実装しました。

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

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

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

 

チュートリアルの一覧

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

 

前回の内容

前回はイベントをまとめるクラス、イベントページ、イベントプロセスのベースクラスなど、イベントの定義を行うクラスについて実装しました。

 

イベントのグラフィックを制御するクラス

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

  • EventFileData
  • EventPage
  • EventProcessBase

今回は以下の画像のうち、グラフィック部分について実装していきます。

 

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

 

グラフィックを切り替える機能は「EventGraphicController」として実装します。切り替えるための条件や、条件に対応した画像、アニメーターコントローラに関しては「EventGraphicRecord」のクラスで保持するようにします。

「EventGraphicController」は前回作成したイベントを取りまとめるクラスの「EventFileData」に紐付けて、そこからグラフィックの確認処理を呼ぶ形にしたいと思います。

 

条件とイベントの画像の対応を保持するクラスの作成

まずは条件とイベントの画像との対応を保持するためのクラスである「EventGraphicRecord」から作成していきます。Projectウィンドウから「Assets/Scripts/Event」のフォルダを開き、MonoBehaviourのスクリプトファイルを作成します。名前は [EventGraphicRecord] にしました。

条件と画像の対応クラス
条件と画像の対応クラス

 

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

個別の処理はなく、フィールドとして情報を保持します。「eventPages」のリストはこのグラフィックに対応するイベントページで、ここで指定したページの条件に合致する時に指定したグラフィックをセットするようにします。例えば、敵キャラを倒す前、敵キャラを倒した後フラグがtrueになった後、といった形でイベントページで条件を分けるとして、それと対応させてグラフィックを切り替えられるようにします。対応するページは複数指定できるので、1ページ目から3ページ目まではこの画像、4ページ目はこの画像、といった形でまとめて指定することもできます。

「sprite」のフィールドは該当のページの時に表示する画像です。Animatorを使うNPCなどでは「animatorController」のフィールドからアニメーターコントローラを切り替えるようにします。

もしAnimatorを停止したい場合は「isStopAnimator」をtrueにします。Animatorが有効な場合、スプライトを変えたとしてもAnimator側から値をセットしてしまうため、例えば敵キャラを倒して画像を透明にしたい場合はAnimatorを停止させます。

 

条件に応じたイベントの画像を制御するクラスの作成

続いて条件に応じたイベントの画像を制御するクラスの「EventGraphicController」を作成します。このクラスでは対応する「EventGraphicRecord」をリストとして保持して、そのグラフィックの情報をセットするようにします。条件の合致を確認するのは、イベントを取りまとめている「EventFileData」で行いたいと思います。なので後ほどそちらも変更していきます。

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

グラフィックを切り替えるクラス
グラフィックを切り替えるクラス

 

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

「_eventGraphicRecords」のフィールドでは、上で作成した「EventGraphicRecord」への参照をリストとして保持します。

「_spriteRenderer」と「_animator」はイベント関係のクラスが紐づく元となるゲームオブジェクトのものを指定します。

SetEventGraphic()のメソッドで実際に切り替え作業を行います。引数として条件に合致するイベントページが渡されるので、そのイベントページと対応する「EventGraphicRecord」を切り替え対象とします。リストとして保持している「EventGraphicRecord」のうち、引数のイベントページが含まれているものを取得して、その画像やアニメーションコントローラを設定します。もし「_spriteRenderer」や「_animator」がアサインされていなければ処理を行わないようにします。

テンプレートとしてこのクラスをアタッチするけど、このNPCではグラフィックを切り替える必要がない、なんてケースもあるので、そうした時には「_eventGraphicRecords」のフィールドを指定せず、「_spriteRenderer」と「_animator」もnullにしておけばOKな形にしています。

 

既存のクラスの変更

前回作成した「EventFileData」のクラスに、グラフィック切替機能を追加していきます。全文は以下の通りです。

フィールドとして「_eventGraphicController」を追加しました。Inspectorウィンドウから対応する「EventGraphicController」への参照をアサインする想定です。

前回はイベントトリガーを引数にするGetEventPage()のメソッドを作成したのですが、グラフィックの場合は起動方法によらない条件で合致するページを取得したいため、引数のないGetEventPage()のメソッドをオーバーロードとして作成しています。

SetEventGraphic()のメソッドの中で「EventGraphicController」に対して切替処理を呼んでいます。SetEventGraphic()自体は別クラスから呼び出します。今のところ、マップをロードしたタイミングでグラフィックを切り替えることを考えているので、「MapManager」からマップ内の「EventFileData」に対して呼び出しを行う想定です。その他、イベントの処理中に切り替えるケースもありそうなので、イベントプロセスからも呼び出します。

 

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

 

今回のブランチ

 

まとめ

今回はイベントのグラフィックを切り替えるための機能を実装しました。条件によって画像を切り替えるのはよくある部分なので、イベントを組んでいく前に機能を実装しておくと手戻りが少なくなるかと思います。

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

     

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

CTA-IMAGE

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


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


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