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

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

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

第95回ではHP/MPが全回復するイベントや待ち時間を発生させるイベント、選択肢を呼ぶイベントを実装しました。これらを組み合わせて宿屋の処理も実装しました。

今回は宝箱の処理を実装していきます。アイテム増減、所持金増減、フラグの設定、画像切り替えのイベントプロセスを作って実現していきましょう。

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

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

 

チュートリアルの一覧

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

 

前回の内容

前回はHP/MPが全回復するイベントや待ち時間を発生させるイベント、選択肢を呼ぶイベントを実装しました。これらを組み合わせて宿屋の処理も実装しました。

 

宝箱の処理

RPGでは宝箱はアイテムを手に入れたり、お金を手に入れたりと、テンションの上がるイベントです。今回はその宝箱のイベントを実装するのに必要な部分を作成していきたいと思います。必要そうな処理を考えてみると、

  • アイテムを増減させる処理
  • お金を増減させる処理
  • フラグを設定する処理
  • 画像を切り替える処理

あたりがあると実現できそうです。

フラグを設定しておくことで、次に宝箱を調べたときにアイテムやお金の再入手を防ぐことができます。また、フラグに応じた画像を設定しておくことで、入手済みの宝箱の画像を切り替えることができます。

これらを順番に実装していきましょう。

 

アイテムを増減させる処理

まずはアイテムを増減させる処理から実装していきます。アイテムの所持数についてもこのタイミングで上限値を決めておきたいと思います。ついでにお金の上限値も決めておきます。作業としては、

  • ValueSettingsの変更
  • CharacterStatusManagerの変更
  • アイテムを増減させるイベントプロセスの作成

になります。

 

ValueSettingsの変更

「ValueSettings」では上限値の定義値を追加します。

所持アイテムの上限は99個、所持金の上限は999999ゴールドにしました。

 

CharacterStatusManagerの変更

アイテム増加メソッドのIncreaseItem()、ゴールド増減メソッドのIncreaseGold()でぞれぞれ上限値を確認する処理を追加します。

既存のIncreaseItem()の末尾に、所持アイテム数の上限を確認する処理を追加しました。

 

IncreaseGold()については、このメソッド内で増減どちらの処理も行うので、下限と上限両方の確認を行うようにしました。

 

アイテムを増減させるイベントプロセスの作成

アイテムを増減させるイベントプロセスを作成していきます。Projectウィンドウから「Assets/Scripts/Event/Process」のフォルダに移動し、MonoBehaviourのスクリプトファイルを作成します。名前は [EventProcessChangeItem] にしました。

アイテムを増減させるイベント
アイテムを増減させるイベント

 

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

「_itemId」のフィールドではアイテムIDを、「_itemNum」のフィールドではアイテムの個数を指定します。「_isGenerateMessage」のフラグがtrueの場合は、次のメッセージ表示プロセスに文字列を渡すようにします。システム側で文字列を生成できるようにしておくことで、Inspectorウィンドウでの入力の負担を減らせます。

Execute()ではアイテムの存在確認後、指定した個数が正の数か、負の数かに応じて呼び出すメソッドと生成するメッセージを分けています。正の数ならIncreaseItem()を呼び、負の数ならDecreaseItem()を呼びます。DecreaseItem()で負の数を渡すと、メソッド内部で「負の数だけ減らす=増やす」と解釈してIncreaseItem()を呼ぶようにしてあるので、マイナスをつけて個数の絶対値を渡すようにしています。

SendMessageToNextProcess()では次のプロセスがメッセージ表示のプロセスだった場合に、文字列を渡す処理を行います。

 

お金を増減させる処理

お金の上限値やその確認処理はアイテムの部分で一緒に実装したので、イベントプロセスを作成します。Projectウィンドウから「Assets/Scripts/Event/Process」のフォルダにて、MonoBehaviourのスクリプトファイルを作成します。名前は [EventProcessChangeGold] にしました。

お金を増減させるイベント
お金を増減させるイベント

 

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

「_goldAmount」のフィールドで増減させる所持金の量を指定します。アイテムの時と同様に、「_isGenerateMessage」のフィールドがtrueの場合はシステム的にメッセージを生成して次のメッセージ表示プロセスに文字列を渡します。

Execute()での概要もほどんど同じで、所持金の場合は増減メソッドが1つだけなのでそれを呼ぶようにしています。

 

フラグを設定する処理

続いてフラグを設定するイベントプロセスを作成します。Inspectorウィンドウからフラグ名、フラグの値を指定して、それを「FlagManager」にセットするようにします。

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

フラグをセットするイベント
フラグをセットするイベント

 

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

「_flagName」のフィールドでフラグ名を、「_flagState」のフィールドでフラグの状態を指定します。

Execute()ではフラグの値をセットする処理のSetFlagState()を呼び出すだけなのでシンプルですね。

 

 

画像を切り替える処理

フラグの値に応じて画像を切り替える処理も入れていきます。といってもやりたいのは「EventFileData」のグラフィック確認処理を呼び出すことです。フラグをセットしてあることで、そのフラグに対応するイベントページが取得できるので、そのページに対応する画像に切り替えます。

今のところマップの切り替え時にのみグラフィックの確認を行うようにしていましたが、イベントとして実装することで任意のタイミングで確認と切り替えが可能になります。

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

グラフィックを確認するイベント
グラフィックを確認するイベント

 

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

このイベント単体でグラフィックを確認するのか、マップ内全体でグラフィックを確認するのかを選べるようにしています。enumとして範囲の選択肢を用意しています。おそらくこのクラス内でしか使わないので、ファイルとして作成せずクラス内に記載しています。

Execute()では、グラフィックの確認範囲に応じて処理を分けています。このイベントのみ(Self)なら対応する「EventFileData」のSetEventGraphic()のメソッドを呼び出します。マップ内全部(All)ならMapManagerを取得して、マップ切り替え時に呼ばれるグラフィック確認の処理を呼び出します。

 

アイテムを入手するイベントの作成

作成したスクリプトをイベントとしてアタッチしていきます。

まずは「Map_0001_Village」の下にある「Events」にて、「Event_MoveMap」を複製してゲームオブジェクトを作成します。名前は [Event_TreasureItem] にしました。

宝箱の作成
宝箱の作成

 

ゲームオブジェクトの作成

「Event_TreasureItem」を選択し、タグを [NPC] に変更します。これは操作キャラクターとの重なりを防ぎたいためです。

「Transform」の「Position」の「X」を [8.5] に、「Y」を [5.5] に設定します。「SpriteRenderer」では「Sprite」を宝箱の画像である [map_chip_dungeon_treasure_close] に変更します。

位置と画像の設定
位置と画像の設定

 

フラグによって処理の流れを切り替えたいので、イベントページを2つ使っていきましょう。既存の「EventPage」を複製し、名前をそれぞれ [EventPage1][EventPage2] にしました。

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

 

それぞれのイベントページについて、既存のプロセスは削除して、宝箱イベント用にゲームオブジェクトとプロセスを作成していきます。

イベントページ ゲームオブジェクト名 アタッチするスクリプト
EventPage1 SetFlag EventProcessFlag
EventPage1 CheckGraphic EventProcessCheckGraphic
EventPage1 GetItem EventProcessChangeItem
EventPage1 ShowMessage EventProcessMessage
EventPage2 ShowMessageEmpty EventProcessMessage
イベントプロセスの作成
イベントプロセスの作成

 

イベントプロセスの設定

続いて「Next Process」を以下の表のように指定します。

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

 

「SetFlag」のゲームオブジェクトでは、「Flag Name」を [DungeonTreasure] にして、「Flag State」にチェックを入れます。先にフラグを変えておくことで、メッセージが表示されるタイミングでは空いている宝箱を表示するようにします。中身が見えていないのに「薬草を手に入れた!」と出るとちょっと違和感がありますからね(1敗)

フラグの設定
フラグの設定

 

「CheckGraphic」はデフォルトのままでOKで、「GetItem」ではアイテムを指定します。ここではテスト的に薬草を3つ手に入れるようにします。「Item Id」を [1] に、「Item Num」を [3] にしましょう。「Is Generate Message」のチェックは入れたままにします。

入手するアイテムの設定
入手するアイテムの設定

 

「ShowMessage」では「GetItem」から文字列が渡されるのでデフォルトのままでOKです。「ShowMessageEmpty」では [からっぽ!] と入れておきます。

 

条件の設定

実行するイベントページを選択するための条件を設定していきましょう。今回条件が必要なのは「EventPage2」の方なので、こちらでフラグの条件を設定します。Hierarchyウィンドウから「EventPage2」の「Conditions」の中にある「EventPageConditionFlag」を選択します。

条件用のゲームオブジェクト
条件用のゲームオブジェクト

 

Inspectorウィンドウから「EventPageConditionFlag」にて、「SetFlag」のゲームオブジェクトで設定したフラグ名と値を設定します。

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

 

「EventPage2」のゲームオブジェクトを選択し、「Conditions」のリストに先ほど設定した「EventPageConditionFlag」を追加します。これにより、まず「EventPage2」の条件を確認し、合致すれば「EventPage2」の処理を実行、合致しなければ条件のない「EventPage1」の処理を実行します。また、「EventPage1」も「EventPage2」も決定ボタンを押したときにイベントを実行するので、両方で「Event Trigger」を [Confirm Button] にしておきましょう。

フラグのリストに追加
フラグのリストに追加

 

グラフィックの設定

イベントページの条件に応じたグラフィックにするため、「EventGraphicController」の設定もしておきます。Hierarchyウィンドウから「Event_TreasureItem」の中にある「EventGraphicRecord」を選択し、ゲームオブジェクトを複製します。片方の名前を [EventGraphicRecordClosed] に、もう一方の名前を [EventGraphicRecordOpened] に変更します。

閉じている時、開いている時の画像設定
閉じている時、開いている時の画像設定

 

「EventGraphicRecordClosed」のゲームオブジェクトを選択し、「Event Pages」のリストに「EventPage1」を設定します。「Sprite」では閉じている宝箱の画像の [map_chip_dungeon_treasure_close] を設定します。

ページと閉じている画像の設定
ページと閉じている画像の設定

 

次に「EventGraphicRecordOpened」のゲームオブジェクトを選択し、「Event Pages」のリストに「EventPage2」を設定します。「Sprite」では閉じている宝箱の画像の [map_chip_dungeon_treasure_open] を設定します。

ページと開いている画像の設定
ページと開いている画像の設定

 

続いて「EventGraphicController」のゲームオブジェクトを選択し、「Event Graphic Records」のリストに「EventGraphicRecordClosed」と「EventGraphicRecordOpened」を設定します。「SpriteRenderer」には宝箱イベントのゲームオブジェクトを設定します。

Recordをリストに追加
Recordをリストに追加

 

お金を入手するイベントの作成

続いてお金を入手する宝箱のイベントも作成します。こちらはアイテムを入手する宝箱のゲームオブジェクトを複製して設定を変えていきます。Hierarchyウィンドウから「Event_TreasureItem」を複製し、名前を [Event_TreasureGold] に変更します。

ゲームオブジェクトの複製
ゲームオブジェクトの複製

 

作成した「Event_TreasureGold」を選択し、「Transform」の「Position」の「X」を [9.5] に設定します。

位置の変更
位置の変更

 

お金を入手する宝箱では、以下の点を変更していきます。

  • フラグ名
  • アイテム入手のプロセスをお金入手のプロセスに
  • 「EventPage2」の条件のフラグ名

 

フラグ名の変更

「SetFlag」のゲームオブジェクトを選択し、「Flag Name」の値を [DungeonTreasureGold] に変更します。先ほどのアイテム入手のフラグ名と違う名前にしました。

フラグ名の変更
フラグ名の変更

 

フラグ名を定義する「FlagNames」のクラスではこのフラグ名をまだ定義していなかったので、ここで追加してしまいましょう。

「DungeonTreasureGold」の定義を追加し、値も同じく「DungeonTreasureGold」にしています。

 

アイテム入手のプロセスをお金入手のプロセスに

次にイベントプロセスを変更します。変更対象は「GetItem」で、このゲームオブジェクトを削除して新しくゲームオブジェクトを作成します。名前は [GetGold] にしました。

ゲームオブジェクトの作成
ゲームオブジェクトの作成

 

作成した「GetGold」を選択し、Inspectorウィンドウから「Gold Amount」の値を [200] にします。後のチュートリアルでお店のテストをする際に十分なお金をここで入手できるようにしたいと思います。

入手するお金の設定
入手するお金の設定

 

「GetItem」を削除したことで「Next Process」の参照が切れるので、以下のように再度設定しましょう。

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

 

 

「EventPage2」の条件のフラグ名

「EventPage2」について、条件のフラグ名を変更します。「SetFlag」で設定したフラグ名と合わせて [DungeonTreasureGold] にします。

フラグ名の変更
フラグ名の変更

 

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

 

動作確認

宝箱の動作を確認してみましょう。確認前に、「Map_0001_Village」を非表示にしておきます。

マップ内の宝箱に向かって決定ボタンを押して、

  • アイテム/お金入手時のメッセージが表示されること
  • メニューのアイテムウィンドウで入手したアイテムが表示されること
  • メニューのステータスウィンドウで入手したゴールドが表示されること
  • 入手済みの宝箱に向かって再度決定ボタンを押すと入手済みのメッセージが表示されること

を確認します。

宝箱の確認
宝箱の確認

 

村でのイベント作りで便利なので、しばらくはこのまま宝箱たちを置いておきます。ゲームとして動きを作っていくときには、この宝箱たちはダンジョンに移動させる予定です。

 

今回のブランチ

 

まとめ

今回は宝箱の処理を実装しました。アイテム増減、所持金増減、フラグの設定、画像切り替えのイベントプロセスを作って実現しています。フラグによる制御はとても良く使う部分なので、分かりやすい宝箱の動作で確認していくと楽です。

次回はお店のUIを作成していきます。お店に関しては最後の山なので頑張って進めていきましょう(白目)

 

     

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

CTA-IMAGE

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


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


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