【Unity】RPGを作るチュートリアルその80 イベント機能について方針をまとめようの回

【Unity】RPGを作るチュートリアルその80 イベント機能について方針をまとめようの回

シンプルなRPGをUnityで作るチュートリアルシリーズの80回目です。メニューでUI作りの山を超えたと思ったら、今度はイベントの山が待っています。大きな山が見込まれますが、せめてシリーズ通して150回以内では終わらせたい気持ちです。そう考えれば半分は過ぎたので気が楽になりますね(白目)

第79回ではメニュー画面のゲーム終了機能について、UIと動作部分の両方を実装しました。

今回はイベント機能について実装の方針をまとめていきたいと思います。

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

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

 

チュートリアルの一覧

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

 

前回の内容

前回はメニュー画面のゲーム終了機能について、UIと動作部分の両方を実装しました。

 

イベント機能について

キャラクターを移動させているパートにて発生する、NPCとの会話やお店の処理などを総称して、RPGツクールに倣ってイベントと呼ぶようにしましょう。ボス戦などでは戦闘中にもイベントを発生させたりすることがありますが、今回は実装の範囲外とします。

イベントの開始は基本的に決定ボタンで話しかけた時に発生させます。他にも、あるマップに入ったら自動的に発生するなど、発生条件の仕組みを用意しておくと表現できることの幅が広がります。

イベントの起点は共通のクラスで行い、どのイベントを発生させるのかはEnumなどでカテゴリーを定義しておいて、対応するクラスを呼び出す形にしたいと思います。今回はシンプルなRPGを目指すのでゴリ押し的に作っていきますが、規模が大きくなりそうならイベントを簡単に設定できるエディタなどを作ると後の作業が楽になります。複数人で作っているなら、コードを書かない人でもエディタを使ってイベントを作れるようにすると効率も上がります。

 

イベント機能の処理について

ゲームの実行中は事前に定義したイベントデータに沿って処理を行っていきます。イベントを処理するクラスを用意して、引数で渡されたイベントデータを処理できる形にしたいと思います。

イベントデータはScriptableObjectで保持する形にします。

(追記)

イベントデータをScriptableObjectにする形ではなく、MonoBehaviourのスクリプトとして実装し、シーン内で設定できるようにしました。ScriptableObjectで試してみたところ、エディタを作らずに設定していくのは大変でした……。

 

イベントの開始方法

イベントの開始方法については、

  • マップに入った時に自動で開始
  • NPCなどの前で決定キーを押して開始
  • 対象のマスに入った時に開始

などが考えられます。自動で開始するイベントについては、マップのPrefabの中で自動開始イベントのリストを保持するクラスを作っておき、マップ表示時にそのリストから処理を行なっていきます。

NPCの前で決定キーを押して開始する場合は、主人公の向いている方向で1歩先の座標を確認して、その座標にいるNPCのイベントデータから対応するイベントを実行します。道具屋は机の向こう側にキャラクターがいる想定のため、机越しに話しかけられるように、さらにもう1歩先までチェックする仕組みも入れておきます。

 

イベントの処理単位

フラグによってキャラクターやゲームオブジェクトの画像を変えたり、メッセージを変更したりなど、条件に応じて別のまとまりの処理を行いたいケースがあります。条件に応じたイベントの処理を行う単位を「ページ」と呼ぶことにします。これもRPGツクールリスペクトで実装したいと思います。ページごとに条件を設定できるようにして、条件に合致するページを実行していきます。イメージとしては、宝箱を調べたらフラグをセットして、2回目に調べたら「からっぽ!」と表示される、みたいな感じです。この場合は2ページ目の条件で宝箱のフラグがTrueの場合を設定しておき、後ろのページから条件を確認していって、合致するものを実行していきます。

ページ内の個別の処理に関しては、「プロセス」と呼ぶようにします。プロセスはメッセージの表示、お店の処理、場所移動など、イベントの種類に応じた処理のまとまりです。

  • イベントデータの中に複数のイベントページがある
  • イベントページの中に複数のイベントプロセスがある

といった関係のデータ構造にしていきます。

イベントプロセスについてはリストとして保持して、それをひとつひとつ処理していく流れです。プロセス内の分岐についてはif-elseのようなものを作っていきます。分岐の処理を行うクラス内からイベント処理を行うクラスに対して、条件に対応するコード値を渡して、それに応じて次のイベントプロセスを特定するようにします。

 

イベントの種類について

各イベントの種類に応じた処理クラスを作成して、それをイベントプロセスと対応させていきます。1つのイベントプロセスが1つのイベントカテゴリを持つようにしたいと思います。イベントプロセスでは、イベントカテゴリに対する引数も設定できるようにします。カテゴリによって必要な引数なども変わってくるため、イベントプロセスの共通処理をインタフェースで実装する形で、カテゴリ単位でクラスを作るようにしていきます。

今の所作っておきたいイベントの種類は以下の表のとおりです。

イベントの種類 概要
メッセージ表示 画面にメッセージを表示します
お店 お店の処理を呼び出します
アイテムの増減 所持アイテムを増加または減少させます
フラグ設定 指定したフラグ名の状態を設定します
場所移動 指定したマップの指定した位置に移動します
戦闘の呼び出し 戦闘機能を呼び出します
画面のフェードイン/アウト 画面をフェードイン、またはフェードアウトさせます
全回復 パーティ内のキャラクターのHPとMPを回復させます
ウェイト処理 次のイベントプロセスを実行するまで指定した秒数待ちます

他にも必要なイベントの種類が出てきたら、都度実装していきます。

 

作業の順番を考えてみる

イベント機能に関しては実装する範囲が広いので、なるべく手戻りが少なくなるように順番を考えてみたいと思います。今のところ、以下のように進めていければと考えています。

  • フラグ関係の実装
  • イベントのデータクラスの実装
  • イベントの処理クラスの実装
  • イベントカテゴリの個別クラスの実装

それぞれ作業の多さに応じて分割していきたいと思います。

イベントで条件を扱うために、先にフラグに関する部分を実装していきます。セーブやロードとも関連するので、フラグの実装時にそちらも対応しておきたいと思います。

この辺りの実装は大変な反面、上手くできた時の達成感もあるので頑張りましょう。

 

今回のブランチ

今回は実装作業は特にないので、ブランチは切ってません。そのため、前回のブランチをご参照ください。

 

まとめ

今回はイベント機能に関して基本方針を考えました。イベント関連は大きな山場なので、ちょっと長くなりそうですが頑張ってチュートリアルにしたいと思います(白目)

次回はイベントの条件として使うフラグの管理機能を実装していきます。

     

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

CTA-IMAGE

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


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


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