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

シンプルな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 | 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 | 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ウィンドウでの設定作業が多いため、参照切れなどがないか確認しておくと安心です。

今回のブランチ
まとめ
今回はマップに入った時に自動的に実行されるイベントの機能を実装しました。これでイベントの実行方法は一通り実装できたかと思いますので、ゲーム内のイベントを作り込んでいけるようになりました。
次回はレベルアップ時に魔法を覚える処理を入れてなかったので、その部分を実装していきます。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】RPGを作るチュートリアルその101 イベントからの戦闘機能の呼び出し 2025.07.08
-
次の記事
記事がありません
コメントを書く