【Unity】RPGを作るチュートリアルその98 お店の入店時の処理を実装

【Unity】RPGを作るチュートリアルその98 お店の入店時の処理を実装

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

第97回ではお店のUIを作成しました。

今回はお店に入った時の選択肢を表示する機能を作成します。イベントからお店を呼び出す機能についても実装します。

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

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

 

チュートリアルの一覧

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

 

前回の内容

前回はお店のUIを作成しました。

 

お店を呼び出す処理

前回お店のUIを作成したので、少しずつ動きを作っていきたいと思います。今回はイベントプロセスからお店の選択肢を表示するところまでを作っていきます。メニューのアイテム画面を作った時のように、動きを作る部分は作業量が多いので、何回かに分けて実装したいと思います。

イベントプロセスからは、コールバック先、お店の品揃えリスト、店主の名前など、お店の処理に必要な情報を渡すようにします。お店で「店を出る」を選択した際には呼び出し元のイベントプロセスにコールバックするようにします。

お店の処理としては、「いらっしゃい!」と言ったウェルカムメッセージを表示したいと思います。魔界塔士Sa・Gaだと「なんのようだ!」というとても出迎えるメッセージとは思えない言葉が表示されます。

お店に関するクラスの構成としては、

  • お店全体の管理クラス
    • お店の処理完了を通知するコールバック用インタフェース
    • お店の選択肢用のコールバック用インタフェース
    • お店の選択肢用の制御クラス
    • お店の選択項目を表現するEnum
  • お店のアイテム画面を制御するクラス
    • 購入に関するアイテム制御のクラス
    • 購入処理を行うクラス
    • 売却に関するアイテム制御のクラス
    • 売却処理を行うクラス

のように処理範囲を分けていきます。メニューのアイテム画面や魔法画面のような組み方で作成していきましょう。考え方の使い回しも大事ですね。

今回はお店全体の管理クラスを作成して、お店の選択肢を表示する部分、イベントプロセスにコールバックする部分を作成していきます。

 

コールバック用インタフェースの作成

先に影響範囲の小さいコールバック用のインタフェースを作成しましょう。このインタフェースではお店の完了を通知するメソッドを用意します。

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

コールバック用のインタフェース
コールバック用のインタフェース

 

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

イベントプロセス側でこのインタフェースを実装して通知を受け取るようにします。

 

お店で選択した項目のEnumの作成

メニュー画面などと同様に、お店で選択した項目に対応するEnumも用意します。これを使って現在の状態を判別していきましょう。

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

お店で選択した項目のEnum
お店で選択した項目のEnum

 

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

お店のメニューに対応する形で項目を作成しました。

 

お店の選択肢用のコールバック用インタフェース

お店の選択肢の選択結果を通知するためのコールバック用インタフェースを用意します。通常の選択肢ウィンドウのものを使って共有することも考えましたが、自分でも若干混乱したので分けることにしました。

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

お店の選択肢のコールバック用インタフェース
お店の選択肢のコールバック用インタフェース

 

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

通常の選択肢のコールバック用メソッドと同じ名前にならないように、メソッド名に「Shop」の文字を入れています。

 

お店の選択肢用の制御クラス

お店の選択肢ウィンドウを制御するクラスも作成します。通常の選択肢ウィンドウの制御クラスを継承し、保持するコールバック用インタフェースを追加したいと思います。

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

お店の選択肢ウィンドウの制御クラス
お店の選択肢ウィンドウの制御クラス

 

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

お店の選択肢用のインタフェースを使うように処理を上書きしています。この時点ではコンパイルエラーが出ますが、以下の変更を加えることで消えます。

 

OptionWindowControllerの変更

overrideをつけるにあたって、「OptionWindowController」の方にも変更を加えていきます。

フィールドのうち、「_selectedIndex」については継承先でアクセスできるようにprotectedをつけます。

 

OnPressedConfirmButton()、OnPressedCancelButton()については、継承先で上書きできるようにprotected virtualをつけておきます。

HideProcess()のコルーチンにはprotectedをつけます。

 

お店全体の管理クラスの作成

お店全体の処理の流れを管理するクラスも作成してきます。ウェルカムメッセージなどもこのクラスから表示するようにしましょう。

お店用の選択肢を表示するほかに、アイテムを買う/売るかどうか確認の選択肢も表示したいと思います。こちらは通常の選択肢ウィンドウを表示する予定です。これらの選択結果を処理する部分も含めてこのクラスで実装していきます。

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

お店全体を管理するクラス
お店全体を管理するクラス

 

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

各種コールバックを受け取るので、「IMessageCallback」、「IOptionCallback」、「IShopOptionCallback」のインタフェースを実装しています。

「_callback」のフィールドはコールバック先となるイベントプロセスを保持します。退店時にこのイベントプロセスに通知を行います。「_isSecondVisit」のフィールドは、お店の処理中にお店の選択肢ウィンドウが表示されるのが2回目以降でtrueになって、ウェルカムメッセージの「いらっしゃい!」が「ほかに必要なものはあるかい?」に変化するようにします。これらのメッセージの定義もフィールドとして用意しています。

「_shopMasterName」のフィールドは店主の名前を保持し、「_shopItems」のフィールドは品揃えとなるアイテムIDのリストを保持します。どちらもイベントプロセスから渡される情報になります。

イベントプロセスからお店の処理を呼び出す際にはStartShopProcess()のメソッドを使います。必要な情報をフィールドにセットした後、ShowWelcomeMessage()でウェルカムメッセージを表示します。メッセージを表示する際は、店主の名前を含めた形で文字列を生成します。

メッセージ表示後のコールバックでShowShopOption()を呼び、お店の選択肢ウィンドウを表示するようにします。ここで選んだ選択肢に応じてOnSelectedShopOption()の中で処理を分岐させていきます。

また、退店時はShowExitMessage()のメソッドからコルーチンを呼んでメッセージを表示し、キー入力を受け取ったらイベントプロセスに完了を通知しています。

通常の選択肢のコールバックメソッドは、次回以降に使用するものを先行して実装しています。

 

お店の処理を呼び出すイベントプロセスの作成

お店の処理を呼び出すイベントプロセスも作成していきます。Projectウィンドウから「Assets/Scripts/Event/Process」のフォルダを開き、MonoBehaviourのスクリプトファイルを作成します。名前は [EventProcessShop] にしました。

お店を呼び出すイベントプロセス
お店を呼び出すイベントプロセス

 

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

お店の完了をコールバックとして受け取るため、「IShopCallback」のインタフェースを実装し、OnFinishedShopProcess()のメソッドで完了を受け取るようにしています。完了時はシンプルに次のイベントプロセスを呼び出すようにしています。

Inspectorウィンドウから、店主の名前や品揃えとなるアイテムのIDリストを設定できるようにします。

Execute()では、設定した情報を「ShopManager」のStartShopProcess()のメソッドで渡すようにしています。実際のお店の処理は「ShopManager」側で行うので、イベントプロセスとしては情報を渡して呼び出すだけになっています。

 

スクリプトのアタッチ

作成したスクリプトをアタッチしていきましょう。お店関連のスクリプトはシーン内の管理用ゲームオブジェクトに、イベント関連のスクリプトはNPCにアタッチします。

 

お店関連のスクリプト

Hierarchyウィンドウから「Managers」の下に空のゲームオブジェクトを作成し、名前を [ShopManager] にしました。

お店全体の管理を行うゲームオブジェクト
お店全体の管理を行うゲームオブジェクト

 

作成した「ShopManager」の子オブジェクトとして空のゲームオブジェクトを作成し、名前を [ShopOptionWindowController] にします。

お店の選択肢の制御クラス
お店の選択肢の制御クラス

 

作成した「ShopOptionWindowController」では同名のスクリプトファイルをアタッチします。お店用の選択肢ウィンドウの参照もアサインしておきます。

スクリプトのアタッチ
スクリプトのアタッチ

 

Hierarchyウィンドウから再び「ShopManager」のゲームオブジェクトを選択し、Inspectorウィンドウから同名のスクリプトをアタッチします。

スクリプトのアタッチと参照のアサイン
スクリプトのアタッチと参照のアサイン

 

イベント用のスクリプト

次にイベント用のスクリプトをアタッチしていきます。お店のイベントは「NPC_Man」のNPCから実行するようにします。

編集のため、「ShopItemParent」を非表示に、「Grid」の下の「Map_0001_Village」を表示しておきます。「Map_0001_Village」内の「NPC」では「NPC_Goblin」を非表示にして、シーン直下に配置されていた「NPC_Man」を「NPC」の子オブジェクトにして表示します。

店主用のゲームオブジェクトを移動
店主用のゲームオブジェクトを移動

 

Hierarchyウィンドウで「NPC_Man」を選択し、「Transform」の「Position」の「X」を [14.5] に、「Y」を [7.5] に設定します。

位置の設定
位置の設定

 

Projectウィンドウの「Assets/Prefabs」のフォルダから「EventFileData」をドラッグ&ドロップして「NPC_Man」の子オブジェクトにします。Hierarchyウィンドウから、「Processes」の子オブジェクトとして空のゲームオブジェクトを作成し、名前を [Shop] にします。

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

 

作成した「Shop」のゲームオブジェクトを選択し、Inspectorウィンドウから「EventProcessShop」のスクリプトファイルをアタッチします。「Shop Master Name」は「おっちゃん」、品揃えのIDリストは1から5まで要素を追加し、作成したアイテムが並ぶようにしました。

お店を呼び出すイベントプロセス
お店を呼び出すイベントプロセス

 

「EventPage」のゲームオブジェクトを選択し、「Event Trigger」を [Confirm Button] に、「Start Process」を [Shop] にします。

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

 

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

 

動作確認

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

マップ右側のお店でおっちゃんに向かって決定ボタンを押して、お店の選択肢が表示されることを確認します。また、店主の名前としてイベントプロセスのInspectorウィンドウで設定した名前が表示されることも確認しましょう。

「買う」と「売る」の場合はコンソールにログが表示されることを確認します。ハンドリングの動作をまだ入れていないので、ゲームの処理は停止しますが、ログだけ確認できればOKです。

「店を出る」を選択した場合は、退店時のメッセージが表示され、イベントが終了することを確認します。

お店の選択肢が表示される
お店の選択肢が表示される

 

今回のブランチ

 

まとめ

今回はお店に入った時の選択肢を表示する機能を作成しました。イベントからお店を呼び出す機能についても実装しました。お店の機能に対して渡す情報を変えることで、動きを変えられるようにしておくと便利です。

次回はお店でアイテムを買う動作を実装していきます。

 

     

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

CTA-IMAGE

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


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


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