【Unity】RPGを作るチュートリアルその101 イベントからの戦闘機能の呼び出し

【Unity】RPGを作るチュートリアルその101 イベントからの戦闘機能の呼び出し

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

第100回ではお店でアイテムを売る動作を実装しました。

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

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

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

 

チュートリアルの一覧

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

 

前回の内容

前回はお店でアイテムを売る動作を実装しました。

 

イベントから戦闘を呼び出す処理

戦闘機能は今の所エンカウントの機能を使って呼び出されるようになっています。これに加えて、イベントからも呼び出せるようにしたいと思います。

戦闘機能を呼び出すイベントに加えて、戦闘に負けた時に村長の前に戻すイベントについても作成しておきたいと思います。このイベントはシステム側で実行するもので、イベント実行の契機が特殊なものになっています。システム側のイベントについては、特定のマップに紐づけるのではなく、シーン内のシステムイベントとして、どのマップからも参照できるようにしたいと思います。

特定のタイルに入ったらモンスター出現、敵キャラクターと会話後に戦闘、といった形でRPGではさまざまな形で戦闘機能を呼び出すことがあるので、さまざまな呼び出し方ができるようにしておくと便利です。

また、今回のチュートリアルでは実装しませんが、敵キャラクター側から操作キャラクターに触れた時にイベントを実行するトリガーを用意することで、ロマサガのようなシンボルエンカウントを実装することもできます。

 

イベントプロセスの作成

まずは戦闘機能を呼び出すイベントプロセスから作成していきます。イベントプロセス側で保持したいものとしては、戦う敵キャラクターのID、負けた時のイベントプロセスへの参照です。

今回のチュートリアルでは1対1の戦いなので敵キャラクターのIDを直で指定していますが、複数体と戦う形式であれば、事前に構成を定義した敵のパーティIDを指定するか、リスト形式で出現する敵キャラクターのIDを保持すると良いかと思います。

戦闘に負けた場合は、処理を分岐させることが考えられます。そのため、負けた際に実行するイベントプロセスを指定できるようにします。

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

戦闘機能を呼び出すイベントを作成
戦闘機能を呼び出すイベントを作成

 

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

Inspectorウィンドウから敵キャラクターのIDと、負けた場合のイベントプロセスを指定できるようにしています。

Execute()では「BattleManager」への参照を取得後、敵キャラクターIDとコールバック先をセットしてから開始処理を呼び出しています。この部分はエンカウントする場合と同じ流れです。

勝ち負けそれぞれに対応するコールバックが呼ばれるようになっているので、呼び出し元で対応する処理に分岐させていきましょう。戦闘で勝った場合はOnFinishedBattle()が呼ばれて次のイベントプロセスへ、負けた場合は「_loseProcess」として指定したイベントプロセスに進みます。

 

エンカウント時の負け処理の実装

「EncounterManager」では敗北時に呼ばれるコールバックのOnLostBattle()のメソッド自体は作成済みですが、中身の処理は実装していませんでした。こちらの実装も行いたいと思います。

このクラスからは、敗北時に実行するイベントファイルへの参照を保持しておいて、OnLostBattle()の中で「EventProcessor」のクラスに渡すようにします。イベントファイル側でのトリガーを「System」にして、イベント実行時のトリガー指定も「System」にしておくことで、起動方法を一致させて実行できるようにします。

これらを実現するため、既存の「EncounterManager」にフィールドを追加して、OnLostBattle()の中身も書いていきましょう。

既存の「_characterMoverManager」のフィールドの下に2つのフィールドを追加しました。「EventProcessor」への参照を保持する「_eventProcessor」と、シーン内のシステムイベントへの参照を保持する「_loseEvent」です。

 

OnLostBattle()のメソッドでは、「EventProcessor」のExecuteEvent()のイベントを呼び出します。引数でシステムのイベントと、トリガーとして「RpgEventTrigger.System」を指定します。

システムイベント側では、村長の前に戻す処理を行い、そのまま自動で尊重との会話イベントが開始する予定なので、コールバック先はnullにしています。

 

向きを変えるイベントプロセスの作成

負けた後のイベントで村長の前に戻す際、主人公の向きを村長の方を向くようにします。Inspectorウィンドウから向く方向を設定できるようにしましょう。

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

主人公の向きを変えるイベント
主人公の向きを変えるイベント

 

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

Execute()では「PlayerMover」への参照を取得し、SetCharacterDirection()のメソッドで主人公の向きを変更します。

 

スクリプトのアタッチ

今回作成したイベントプロセスをアタッチしていきます。

イベントプロセスからの戦闘機能の呼び出しはゴブリンのゲームオブジェクトを使い、エンカウント時の敗北イベントについてはシーン内にゲームオブジェクトを作ってアタッチします。どちらの敗北処理でも、

  • 敗北時のフラグ設定
  • 画面のフェードアウト
  • ウェイト
  • マップの移動
  • 向きの変更
  • 画面のフェードイン

の流れは共通しているので、一方を作ったらコピペして実装してしまいましょう。敗北時のフラグを設定しているのは、村で自動的に開始するイベントの開始条件として使用したいためです。

 

戦闘機能の呼び出し

まずは「NPC_Goblin」のイベントを変更していきます。お店の作業で「Map_0001_Village」の中にいる「NPC_Goblin」のゲームオブジェクトを非表示にしていたので、これを表示状態に切り替えます。以前はカウンターの内部に配置していたため、宝箱周辺に移動させておきましょう。私の環境では「Transform」の「Position」の「X」を [7.5] に、「Y」を [5.5] に設定しました。

ゴブリンのゲームオブジェクト
ゴブリンのゲームオブジェクト

 

「NPC_Goblin」の下にあるイベントプロセスは一度削除して、戦闘機能の呼び出しのイベントプロセスを作成します。「Processes」の下に以下のようにゲームオブジェクトを作成していきます。

ゲームオブジェクト名 アタッチするスクリプト
StartBattle EventProcessBattle
Win———– なし
ShowMessage EventProcessMessage
Lose———– なし
SetFlag EventProcessFlag
FadeOut EventProcessFadeOut
Wait EventProcessWait
Move EventProcessMoveMap
ChangeDirection EventProcessChangePlayerDirection
FadeIn EventProcessFadeIn

 

イベントプロセスの作成
イベントプロセスの作成

 

イベントプロセスのつながりを以下のように設定します。戦闘では勝った場合のプロセスを「Next Process」に、負けた場合のプロセスを「Lose Process」に設定します。

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

 

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

ゲームオブジェクト名 フィールド名 設定値
StartBattle Enemy Id 3
ShowMessage Messages 戦闘に勝った!
SetFlag Flag Name BattleLose
SetFlag Flag Value true
SetFlag Next Process FadeOut
Move Target Map Id 1
Move Target Position X: 7, Y: 11
ChangeDirection Target Direction Back

 

システムの敗北イベントを作成

続いて、システムとして使う敗北イベントを作成します。マップ内のゲームオブジェクトとしてではなく、シーン直下にシステムイベント用の親オブジェクトを作成し、そこに配置しましょう。

Hierarchyウィンドウからシーン直下に空のゲームオブジェクトを作成します。名前は [SystemEvents] にしました。「Player」の隣に配置しておきます。「Transform」の位置はリセットしておきましょう。

システム用のイベント
システム用のイベント

 

作成した「SystemEvents」の下に、空のゲームオブジェクトを作成します。名前は [Event_Lose] にしました。その子オブジェクトとして、イベントファイルのテンプレート用Prefabをドラッグ&ドロップしてインスタンス化します。

イベントファイルの追加
イベントファイルの追加

 

敗北時のイベントプロセスとして、先ほど「NPC_Goblin」で作成した「Lose———–」より下のイベントプロセスをコピーして「Event_Lose」の下の「Processes」の子オブジェクトとしてペーストします。

イベントプロセスの複製
イベントプロセスの複製

 

「EventPage」では「Start Process」として「SetFlag」を指定します。また、「Event Trigger」を [System] にしておきます。

起動方法をシステムに
起動方法をシステムに

 

続いて「EncounterManager」では、「EventProcessor」と「Event_Lose」の下にある「EventFileData」への参照をアサインします。

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

 

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

 

動作確認

イベントから戦闘を呼び出す動作を確認してみましょう。確認前に、「Map_0001_Village」を非表示にしておきます。

ゲームを開始したら、ゴブリンに話しかけて戦闘が始まることを確認します。勝利する場合を確認したい場合は「CharacterStatusSetter」から主人公のレベルを高くしたり、ボスゴブリンのHPを減らすなどの調整をしておくと確認しやすくなります。逆に負ける場合を確認したい場合はレベルを低くしたり、ボスゴブリンの攻撃力を増やすなどが有効です。

勝利した場合はメッセージが表示されること、敗北した場合は村長の前(村長はまだ配置していないので、上の家の机付近)に移動することを確認します。

また、エンカウントによる敗北を確認する際は、一度フィールドに出てスライムと戦闘します。スライムの攻撃力も大きくしておくと敗北のフローを確認しやすくなります。こちらも敗北時に村長の家に移動することを確認します。

なお、戦闘に負けた後は尊重との会話イベント内で全回復させる予定なので、現時点ではHP0のまま歩き回れたりします。

OK! 戦闘開始OK!
OK! 戦闘開始OK!

 

今回のブランチ

 

まとめ

今回はイベントから戦闘を呼び出す機能を実装しました。また、エンカウントで戦闘に敗北した場合にもイベントを起動できるようにして、村長の前に移動するイベントを実装しました。敗北した時にゲームオーバーにする場合は、ゲームオーバー画面を表示してタイトル画面に戻すイベントプロセスを組むことで実現できます。

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

 

     

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

CTA-IMAGE

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


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


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