【Unity】RPGを作るチュートリアルその102 自動で実行されるイベントの実装

【Unity】RPGを作るチュートリアルその102 自動で実行されるイベントの実装

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

第101回ではイベントから戦闘を呼び出す機能を実装しました。

今回はマップに入った時に自動的に実行されるイベントの機能を実装します。

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

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

 

チュートリアルの一覧

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

 

前回の内容

前回はイベントから戦闘を呼び出す機能を実装しました。

 

マップに入った時に自動で実行するイベント

マップに入った際に、条件を満たしていたら自動でイベントを実行する機能を実装したいと思います。これはオープニングイベントだったり、エンディングのイベント、あるいは敗北時の会話イベントなど、さまざまな場面で使われます。

イベントのトリガーとしては「RpgEventTrigger」の「Auto」を使います。マップを表示するタイミングで、マップ内のイベントファイルを全て確認し、フラグなどの条件を満たすイベントページをチェックして、起動条件が「Auto」のものを順番に実行していきます。

マップ表示のタイミングと合わせるので、「MapManager」に処理を追加していきます。タイミング的にはグラフィックを確認するためにCheckEvent()のメソッドを用意しているので、そこから呼んでいるコルーチンに処理を追加しましょう。また、イベント実行に伴い、「EventProcessor」の処理も呼ぶので参照をアサインするフィールドも用意します。

既存の「_characterMoverManager」のフィールドの下に、「EventProcessor」への参照を保持する「_eventProcessor」を追加しました。

 

処理部分では、既存のCheckEvent()から呼ばれるCheckEventProcess()内で処理を追加し、自動イベントを確認するCheckAutoEventProcess()のメソッドを追加します。

CheckEventProcess()ではイベントによる処理を行うことから、キャラクターの動きを止める処理を追加しました。

CheckAutoEventProcess()では引数の「EventFileData」の配列から、マップ内のイベントをキューデータとして追加し、「EventProcessor」に渡します。「RpgEventTrigger.Auto」に対応するトリガーが設定されているページの確認は「EventProcessor」を経由して「EventFileData」側で行なっています。

 

スクリプトを保存したら、忘れないように参照をアサインします。Hierarchyウィンドウから「MapManager」を選択し、「EventProcessor」への参照をアサインしましょう。

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

 

イベントの作成

自動で実行するイベントをNPCの村長にアタッチしましょう。村長に関して実行したいイベントは、

  • ゲーム開始時に目的を教える自動イベント
  • 通常の会話イベント
  • 戦闘に敗北した時の自動イベント

です。それぞれイベントページを分けて実装していきましょう。

編集のため、Hierarchyウィンドウから「Map_0001_Village」のゲームオブジェクトを選択し、表示されている状態にします。

シーン直下にいる「NPC_Chourou」のゲームオブジェクトを「Map_0001_Village」の下にある「NPC」の子オブジェクトにします。初期のころは長老と呼んでいた名残がありますが、表記揺れしている部分があれば村長と読み替えていただければと思います。

村長のオブジェクト
村長のオブジェクト

 

村長の位置は、私の環境では「X」を [7.5] に、「Y」を [13.5] に設定しました。上にある家の机の向こう側あたりに配置しましょう。

位置の変更
位置の変更

 

また、村長が動き回ると戦闘敗北時などにマップ移動した際、重なってしまう恐れがあるので、移動しないようにしておきます。

移動頻度の設定
移動頻度の設定

 

村長のゲームオブジェクトに、イベント用のテンプレートをインスタンス化して追加します。Projectウィンドウの「Assets/Prefabs」から「EventFileData」をドラッグ&ドロップします。

イベント用テンプレートの追加
イベント用テンプレートの追加

 

追加したテンプレート内で、「EventPages」の下にある「EventPage」を複製して合計3つになるようにします。名前は末尾に1, 2, 3をつけて区別しています。作成したイベントページに対応するイベントをそれぞれ作成していきましょう。

イベントページの作成
イベントページの作成

 

 

ゲーム開始時に目的を教える自動イベント

「EventPage1」ではゲームの開始時に目的を教えるメッセージを表示するようにします。まだオープニング用のフラグがtrueではない場合に実行されるようにします。

先にイベントプロセスから作成していきます。「Processes」の下に以下のゲームを作成し、イベントプロセスのスクリプトファイルをアタッチします。

ゲームオブジェクト名 アタッチするスクリプト
ChangeDirection EventProcessChangePlayerDirection
Wait EventProcessWait
ShowMessage EventProcessMessage
SetFlag EventProcessFlag
イベントプロセスの作成
イベントプロセスの作成

 

イベントプロセスのつながりは以下のように設定します。

ゲームオブジェクト名 フィールド名 アサインするプロセス
EventPage1 Start Process ChangeDirection
ChangeDirection Next Process Wait
Wait Next Process ShowMessage
ShowMessage Next Process SetFlag
SetFlag Next Process なし

 

また、設定変更が必要なイベントプロセスでは以下のように設定しました。デフォルト値を使う場合は表に入れていません。メッセージは4ページ分あります。

ゲームオブジェクト名 フィールド名 設定値
ChangeDirection Target Direction Back
ShowMessage Messages/要素0 <長老>
アレンよ!
お前も16歳になり、旅をして見聞を広める時期じゃ。
ShowMessage Messages/要素1 <長老>
そのためにも、世界を旅する力があるかどうか、皆に示さねばならん。
まずは北東の洞窟に住み着いたゴブリンの親玉を退治してくるのじゃ。
ShowMessage Messages/要素2 <長老>
少しずつ戦いに慣れ、力をつけていくんじゃ。
決して無理をする必要はないぞ。
ShowMessage Messages/要素3 <長老>
では行くのだアレン!
SetFlag Flag Name Opening
SetFlag Flag Value true

 

「EventPage1」ではフラグによる実行条件を設定したいので、「Conditions」の下にある「EventPageConditionFlag」にて、「FlagName」を [Opening] に、「State」を [false] にします。

フラグの条件を設定
フラグの条件を設定

 

「EventPage1」では、条件として先ほど設定した「EventPageConditionFlag」をアサインし、「Event Trigger」では [Auto] を選択します。

イベントページの設定
イベントページの設定

 

通常の会話イベント

「EventPage2」では通常の会話イベントを実行します。特に条件は設定しないので、決定ボタンでイベントを開始したらこのページが呼ばれます。

先にイベントプロセスから作成していきます。「Processes」の下に以下のゲームを作成し、イベントプロセスのスクリプトファイルをアタッチします。

ゲームオブジェクト名 アタッチするスクリプト
ShowMessage EventProcessMessage
EventPage2のイベントプロセス
EventPage2のイベントプロセス

 

イベントプロセスのつながりは以下のように設定します。

ゲームオブジェクト名 フィールド名 アサインするプロセス
EventPage2 Start Process ShowMessage
ShowMessage Next Process なし

 

また、設定変更が必要なイベントプロセスでは以下のように設定しました。デフォルト値を使う場合は表に入れていません。メッセージは1ページ分です。

ゲームオブジェクト名 フィールド名 設定値
ShowMessage Messages/要素0 <長老>
ゴブリンの親玉は北東の洞窟の奥にいる。
近くとはいえしっかりと準備して臨むのじゃ。

 

「EventPage2」では、条件は設定不要で、「Event Trigger」では [Confirm Button] を選択します。

イベントページの設定
イベントページの設定

 

 

戦闘に敗北した時の自動イベント

「EventPage3」では戦闘に負け時のイベントを実行します。マップ移動で村長の前に戻った際に、メッセージを表示した後に全回復の処理を行います。

先にイベントプロセスから作成していきます。「Processes」の下に以下のゲームを作成し、イベントプロセスのスクリプトファイルをアタッチします。

ゲームオブジェクト名 アタッチするスクリプト
ChangeDirection EventProcessChangePlayerDirection
Wait EventProcessWait
ShowMessage EventProcessMessage
Refresh EventProcessRefresh
SetFlag EventProcessFlag
EventPage3のイベントプロセス
EventPage3のイベントプロセス

 

イベントプロセスのつながりは以下のように設定します。

ゲームオブジェクト名 フィールド名 アサインするプロセス
EventPage3 Start Process ChangeDirection
ChangeDirection Next Process Wait
Wait Next Process ShowMessage
ShowMessage Next Process Refresh
Refresh Next Process SetFlag
SetFlag Next Process なし

 

また、設定変更が必要なイベントプロセスでは以下のように設定しました。デフォルト値を使う場合は表に入れていません。メッセージは1ページ分です。SetFlagではフラグの値をfalseに設定しています。

ゲームオブジェクト名 フィールド名 設定値
ChangeDirection Target Direction Back
ShowMessage Messages/要素0 <長老>
怪我は大丈夫か?
無理せず少しずつ経験を積むと良いぞ。
SetFlag Flag Name BattleLose
SetFlag Flag Value false

 

「EventPage3」ではフラグによる実行条件を設定したいので、「Conditions」の下にある「EventPageConditionFlag」にて、「FlagName」を [BattleLose] に、「State」を [true] にします。

フラグの条件を設定
フラグの条件を設定

 

「EventPage3」では、条件として先ほど設定した「EventPageConditionFlag」をアサインし、「Event Trigger」では [Auto] を選択します。

イベントページの設定
イベントページの設定

 

ここまでの設定が終わったら、「Map_0001_Village」の「Overrides」のプルダウンから [Apply All] をクリックしてPrefabに変更を適用します。

 

主人公の位置を変更

村長の前からゲームがスタートするので、それに合わせて「Player」のゲームオブジェクトの位置も村長の前に変更しておきます。

主人公の位置を変更
主人公の位置を変更

 

動作確認

自動イベントの動作を確認してみましょう。確認前に、「Map_0001_Village」を非表示にしておきます。

ゲームを実行して、以下のポイントを確認していきましょう。

  • ゲーム開始時に目的を教える自動イベント
    • ゲームを実行した際に村長の会話が始まること
  • 通常の会話イベント
    • 村長に向かって決定ボタンを押すとメッセージが表示されること
  • 戦闘に敗北した時の自動イベント
    • 戦闘に負けて村にマップ移動した際、村長の会話が始まること
    • ステータスを確認し、HPとMPが全回復していること

今回はHierarchyウィンドウやInspectorウィンドウでの設定作業が多いため、参照切れなどがないか確認しておくと安心です。

自動イベントの確認
自動イベントの確認

 

今回のブランチ

 

まとめ

今回はマップに入った時に自動的に実行されるイベントの機能を実装しました。これでイベントの実行方法は一通り実装できたかと思いますので、ゲーム内のイベントを作り込んでいけるようになりました。

次回はレベルアップ時に魔法を覚える処理を入れてなかったので、その部分を実装していきます。

 

     

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

CTA-IMAGE

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


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


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