【Unity】RPGを作るチュートリアルその105 ボスに関するイベントを実装

【Unity】RPGを作るチュートリアルその105 ボスに関するイベントを実装

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

第104回ではゲーム内で使用するイベントの実装として、各マップを繋ぐマップ移動のイベントを実装しました。

今回はボスゴブリンの会話と戦闘のイベントを実装していきたいと思います。

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

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

 

チュートリアルの一覧

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

 

前回の内容

前回はゲーム内で使用するイベントの実装として、各マップを繋ぐマップ移動のイベントを実装しました。

 

各マップのイベントを実装

イベント機能について、コードの部分はある程度作成できたので、各マップで実際にイベントを組んでいきましょう。といっても村のイベントについてはイベントプロセスを実装する際にある程度作ってあるので、

  • 各マップをつなぐマップ移動のイベント
  • ボスゴブリンの会話と戦闘のイベント
  • エンディングのイベント

を実装すれば、当初想定していたイベントとしては実装が完了します。前回は一番上のマップ移動のイベントを実装したので、今回はボスゴブリンの会話と戦闘のイベントの部分を作成してきます。

 

ボスゴブリンの会話と戦闘のイベントの作成

戦闘機能を呼び出すイベントプロセスについては既に作成してあるので、ゴブリンのゲームオブジェクトをダンジョンに配置して、会話イベントなども実装していきたいと思います。

また、ダンジョンに関する部分でいうと、宝箱も配置したいと考えています。この宝箱についても既に作成済みなので、村からダンジョンに移動させればOKな状態になっています。宝箱の中身となるアイテムの種類やゴールドの量などはちょっと調整していきます。

簡単に終わりそうな宝箱の部分について先にやってしまいましょう。

 

宝箱イベントの移動

機能の確認のため、村のマップである「Map_0001_Village」にて、宝箱のイベントを2つ作成してあります。これらのゲームオブジェクトを「Map_0003_Dungeon」の「Events」の下に移動させましょう。シーン内からドラッグ&ドロップしようとするとPrefabを跨ぐことになってダイアログが出るので、コピーしてからペーストする形で移動させます。ペースト後、「Map_0001_Village」の方の宝箱は削除しておきましょう。

宝箱のゲームオブジェクトの移動
宝箱のゲームオブジェクトの移動

 

移動した宝箱をダンジョン内に配置します。私は「Event_TreasureItem」の「Transform」にて「X」を [12.5] に、「Y」を [15.5] に設定しました。もう一方の「Event_TreasureGold」の「Transform」にて「X」を [-1.5] に、「Y」を [0.5] に設定しました。入り口側の宝箱にゴールドを入れて引き返しやすくして、奥の宝箱にはアイテムを入れておきます。

宝箱の中身も少し調整しておきましょう。「Event_TreasureGold」にある「GetGold」のイベントプロセスでは、「Gold Amount」の値を [50] に変更しました。上位武器のロングソードがちょうど買えるくらいの量にしています。

ゴールドの量を調整
ゴールドの量を調整

 

「Event_TreasureItem」の方は、今のところ薬草が3つ手に入るようにしていますが、こちらはこのままにしておきましょう。ダンジョン内で店売りの武器や防具が手に入ると若干悲しい気持ちになるので、それなら消費アイテムの方が嬉しいかもしれない、という考えです。この辺りは開発者としての考え方によって変えていくのは全然アリだと思います。

 

ボスゴブリンのイベント

宝箱を移動させたのと同じような手順で、「NPC_Goblin」のゲームオブジェクトを「Map_0001_Village」から「Map_0003_Dungeon」に移動させます。

ゴブリンの移動
ゴブリンの移動

 

「NPC_Goblin」はダンジョンの奥に配置されるように「Transform」の「Position」の「X」を [16.5] に、「Y」を [15.5] に設定します。

ゴブリンの位置をダンジョンの奥に
ゴブリンの位置をダンジョンの奥に

 

ボスとしてどっしりと構えていてもらうため、「NpcMover」の「Move Frequency」の値を [Never] に変更します。

移動頻度の変更
移動頻度の変更

 

ダンジョンでボスゴブリンに話しかけた時には、以下のような流れでイベントを進めたいと思います。

  • 会話イベント(例: 「よく来たゴブ!」)
  • 戦闘の呼び出し
  • 負けたら村長の前に戻す
  • 勝ったら勝利フラグを立てて、会話後に村長の前に戻す

勝利フラグをtrueにして村に戻った場合、エンディングの自動イベントを開始する予定でいます。この部分は次回作成しましょう。

まずは必要なゲームオブジェクトとして以下のように作成します。区切り用のゲームオブジェクトなど、動作確認時に作成してそのまま使えそうなものは流用しましょう。「Post———–」の区切り以降は勝ち負け共通して通る処理にしています。どちらも村長の前に戻る処理を行い、村側のイベントでフラグの違いによって処理を分けます。

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

 

ボスゴブリンのイベントプロセス
ボスゴブリンのイベントプロセス

 

また、ボスゴブリンを倒した後にグラフィックを透明にしたいので、対応するイベントページも作成します。作成してある「EventPage」を複製して、元々ある方を [EventPage1] に、複製した方を [EventPage2] にリネームします。「EventPage2」の方は特に処理を行わないのでイベントプロセスを削除しておきましょう。

イベントページの複製
イベントページの複製

 

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

ゲームオブジェクト名 フィールド名 アサインするプロセス
EventPage1 Start Process ShowMessage
ShowMessage Next Process StartBattle
StartBattle Next Process ShowMessageWin
StartBattle Lose Process SetFlag
ShowMessageWin Next Process SetFlagWin
SetFlagWin Next Process ChangeGraphic
ChangeGraphic Next Process Wait ※勝った場合の処理の方
Wait Next Process ShowMessageWin2
ShowMessageWin2 Next Process FadeOut
SetFlag Next Process FadeOut
FadeOut Next Process Wait
Wait Next Process Move
Move Next Process ChangeDirection
ChangeDirection Next Process FadeIn
FadeIn Next Process なし

 

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

ゲームオブジェクト名 フィールド名 設定値
ShowMessage Messages/要素0 <ボスゴブリン>
ニンゲン、こんなところまでご苦労なこったゴブ。
ShowMessage Messages/要素1 <ボスゴブリン>
我々ゴブリン族はこの洞窟を拠点にして、
魔王様の支配領域を広げるんだゴブ!
ShowMessage Messages/要素2 <ボスゴブリン>
手始めに近くの村を襲って、開戦の狼煙を上げてやるゴブ!
ShowMessage Messages/要素3 <ボスゴブリン>
ここに来たということは、お前はその村のニンゲンゴブね?
このボスゴブリン様がボコボコにしてやるゴブ!
StartBattle Enemy Id 3
ShowMessageWin Messages/要素0 <ボスゴブリン>
まさかニンゲンに負けるとは……。
ShowMessageWin Messages/要素1 <ボスゴブリン>
魔王様、申し訳ありませんゴブ……
ぐふっ!
SetFlagWin Flag Name DungeonBossWin
SetFlagWin Flag State True
ShowMessageWin2 Messages/要素0 <アレン>
よし、帰ろう!
SetFlag Flag Name BattleLose
SetFlag Flag State True
Move Target Map Id 1
Move Target Position X: 7, Y: 11
ChangeDirection Target Direction Back

 

条件の設定

「EventPage2」ではフラグがTrueの時のグラフィックを表示したいので、「Conditions」の下にある「EventPageConditionFlag」にて、「FlagName」を [DungeonBossWin] に、「State」を [true] にします。

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

 

「EventPage2」では、条件として先ほど設定した「EventPageConditionFlag」をアサインし、「Event Trigger」では [None] を選択します。「EventPage2」の方はグラフィックの切り替えのために使うため、実際の処理は行わないようにします。「Start Process」もNullのままでOKです。

条件と起動方法の設定
条件と起動方法の設定

 

「EventPage1」では、条件はなしで、「Event Trigger」では [Confirm Button] を選択します。

条件と起動方法の設定
条件と起動方法の設定

 

グラフィックの設定

続いてグラフィックの設定を行います。既存の「EventGraphicRecord」を複製して合計2つにした後、それぞれ名前を [EventGraphicRecordVisible][EventGraphicRecordInvisible] にリネームします。

画像設定の複製
画像設定の複製

 

「EventGraphicRecordVisible」では画像を表示するときの設定を行います。「Event Pages」のリストでは、対応するイベントページとして「EventPage1」をアサインします。「Sprite」では正面を向いている画像の [npc_mock_enemy_1] 、「Animator Controller」では [NPC_Goblin] のアニメーションコントローラをそれぞれアサインします。

グラフィックを表示する時の設定
グラフィックを表示する時の設定

 

「EventGraphicRecordInvisible」では画像を表示しないときの設定を行います。「Event Pages」のリストでは、対応するイベントページとして「EventPage2」をアサインします。「Sprite」では透明な画像の [event_indicator_transparent] をアサインします。「Is Stop Animator」のチェックも入れておきます。アニメーターを止めることで、アニメーター側による画像の切り替えを防いでいます。

グラフィックを表示しない時の設定
グラフィックを表示しない時の設定

 

「EventGraphicController」では画像の設定をアサインしていきます。「Event Graphic Records」には上で設定したレコード2つをアサインします。「Sprite Renderer」と「Animator」ではそれぞれ「NPC_Goblin」のゲームオブジェクトにアタッチしてあるものをアサインします。Hierarchyウィンドウから「NPC_Goblin」をドラッグ&ドロップすると便利です。

グラフィックのコントローラ
グラフィックのコントローラ

 

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

 

動作確認

ボスゴブリンのイベントの動作を確認してみましょう。確認前に、「Map_0001_Village」、「Map_0002_Field」、「Map_0003_Dungeon」を非表示にしておきます。

ゲームを開始して、ダンジョンの奥まで進み、ボスゴブリンの前でセーブしておきましょう。セーブはメニュー画面から行います。ロードする際は、「SaveTester」からセーブ枠のIDを指定してロードします。

ボスゴブリンに向かって決定ボタンを押して、

  • ボスゴブリンとの会話イベント後、戦闘が始まること
  • 戦闘に勝った場合は会話イベントに進むこと
  • 会話イベント後にゴブリンの画像が消えること
  • その後村に移動すること
  • 戦闘に負けた場合はそのまま村に戻り、負けた時のイベントが始まること

を確認します。

ボスゴブリンのイベント
ボスゴブリンのイベント

 

戦闘に関して確認していたところ、

  • ボスからも逃げられる
  • 逃げると勝利扱いになる
  • 一度戦闘に負けた後、再度戦うとHPが残っていても負けになる

といった点が出てきたため、次回修正したいと思います。上2つについては、イベントプロセス側から逃走できるかどうかのフラグをセットできるようにします。3つ目については、全回復時に敗北フラグをfalseにする処理が入っていない可能性があるため、その部分を修正します。

 

今回のブランチ

 

まとめ

今回はボスゴブリンの会話と戦闘のイベントを実装しました。イベント関連は細かい作業が多くなるため、イベントプロセス間のつながりなどはよく確認しておくと良いかもしれません。

次回は戦闘関連で気になった部分を修正していきます。

     

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

CTA-IMAGE

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


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


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