コマンド画面は一通り作ったので、いくつかスクリプトを作成してコマンドを遷移するようにしていきたいと思います。
【2DRPG】コマンドを切り替えるスクリプトを作成する【Unity】
どのボタンが選択されているのかを分かるようにする
まずは、どのボタンが選択されているのかが分かるように「CommandPanelButtonScript」を作成します。
「購入する」「売却する」等といったボタンにアタッチするスクリプトですが、選択されているボタンの画像をアクティブにし、それ以外のボタンは非アクティブにするだけです。
作成したら設定する必要があるボタンに対してアタッチします。最終的には上の画像のように選択されているボタンのみアイコンが表示されるので、何が選択されているのかすぐに分かると思います。
NPCに接触したらコマンドを開くようにする
どのタイミングでコマンドを開くのかといったきっかけになる部分ですね。
この辺は、個人で処理の仕方が異なってくると思いますが、私の場合だと上の画像にあるようにプレイヤーがNPCに接触したらFungusの会話コマンドを実行し、その後鍛冶屋コマンドを開きます。
そういった際のサンプルスクリプトとなります。NPCコントローラースクリプトやこの後作成するコマンドスクリプトより、コマンドの表示・非表示を行います。
このスクリプトは、対象となるオブジェクトにアタッチしてインスペクタからキャンバスを設定します。
コマンドスクリプトを作成する
コマンドを開いた後の処理を行うためのスクリプト「EquipCommandScript」を作成します。
結構長いコードになっていますが、行っていることはそこまで難しくはないと思います。
まずは、プレイヤーがどのコマンドにいるのかを識別するために列挙型「Command Mode」を作ります。
- CommandPanel・・・最初のコマンドを開いた初期状態。
- EquipPanelSelect・・・どの装備品を選択するのか
- EquipListPanel・・・選択された装備品のリストを表示する
- BuyCheckPanel・・・購入するのか確認するパネル
とりあえず4つ作成していますが、本来ならもっとたくさんあります。付け加えたい際は、ここに追記するようにしていきます。
フィールドでは、今挙げたコマンドの状態に対応するPanelやCanvasGroupを作成します。
Awakeメソッドでは、階層を辿ってパネルやCanvasGroup等を取得します。
OnEnableメソッドは、ゲームオブジェクトがアクティブになった際に処理を実行します。
コマンドの初期化や、表示する必要のないパネルを非表示にするようにします。最初に表示されるコマンドは項目の選択を行えるようにするためinteractableをtrueにします。
Updateメソッド
Updateメソッドでは、キャンセルされた場合の処理を記述します。
最初のコマンド画面からキャンセルが押されたら、画面を閉じるようにするため先ほど作成しておいたスクリプトのExitCommandメソッドを実行します。
装備品パネルを開いていた状態でキャンセルされた場合は、パネルを削除するようにします。
EventSystem.current.SetSelectedGameObjectで各パネルに対応するボタンオブジェクトを設定するようにしています。
SelectedCommandメソッド
このメソッドでは、購入ボタンが押されたのか、売却ボタンが押されたのかをチェックします。厳密には終了ボタンが押された際もありますけどね。終了の場合はコマンドを閉じるだけでOKです。
後ほどボタンの設定を行いますが、受け取った引数によって処理を分けるようにします。
ちなみに、画像の通りどちらのボタンが押されても同じコマンド画面に切り替わるので、現在の仕様なら同じ処理でも構いません。
今後何かしら処理を追加する必要がある際の事を考えて、このような記述にしています。
WeaponSelectCommandメソッド
どの種類の装備品を押されたのかをチェックします。
今回は、武器ボタンが押された際を例にとって進めていきます。
foreach文を使って登録されているアイテムのインスタンスを作成して表示します。
武器データは後ほどScriptableObjectを使って作成します。
アイテムの情報を表示するためinformationPanelをアクティブにします。
作成したスクリプトはBlackSmithCommand(キャンバス)にアタッチしておきます。
アイテムデータを作成する
まずは、アイテムデータをScriptableObjectで作成していきます。
ScriptableObjectの使い方については、以前解説していましたので参考にしてください。
こんな感じでItemスクリプトを作成します。
「Create」→「CreateItem」から3つほど武器データを作成しました。
続けて、アイテムをリスト化して表示するためのスクリプトを作成します。
「Create」→「CreateKajiyaWeaponList」を作成して今作ったアイテムデータを登録します。
Weapon Nameはタイトル、Goldはゴールド、infotextはアイテムの情報を入力します。
EquipPanelButtonを作成する
アイテムリストを表示するボタンを作成します。
ボタンに元々設定してあるImageのチェックを外して、アイコン用のイメージ画像とテキストを3つ子要素として作成します。またTransitionは「None」にしておきます。
EquipTextには先ほどのWeapon Nameが、GoldTextにはゴールドを表示させるようにします。GTextはテキスト欄に「G」と入力しているだけですね。
それぞれの幅やボタンのサイズなどはお任せします。
ボタンにはCommandPanelButtonScriptをアタッチします。
また、選択されているボタンのアイテム情報を表示させるための「EquipButtonScript」を作成します。
このスクリプトもEquipPanelButtonにアタッチします。ここまで出来たらプレハブ化してヒエラルキーウィンドウにあるボタンは削除しておきます。
キャンバスと購入ボタン等のインスペクタの設定
EquipCommandScriptをアタッチしておいたキャンバスを選択して、今作成したボタンのプレハブやアイテムデータを設定します。PartyStatusは特に関係ないのでスルーして構いません。
購入ボタンを押したらEquipCommandScriptのSelectCommandメソッドを実行するようにします。
武器ボタンの場合は、WeaponSelectCommandメソッドを設定します。後はそれぞれテキスト入力欄にスクリプトから指定しておいた文字を入力します。
入力コマンドの設定
どのボタンがキャンセルに対応するのかなどを設定するためには「Edit」→「Project Settings」→「Input」を開きます。
私の設定画面はこのようにしています。この辺は好きなボタンやジョイスティックで操作出来るように設定してもらえればと思います。
ここまで出来たらキャンバスを非表示にした状態でゲームを実行してみます。
まとめ
今回は、コマンドの遷移に関わる処理を実装しました。
購入ボタンを押して武器リストを表示するまでの一連の流れについて進めてきましたが、同じような工程で防具やアクセサリーリストも表示させることが出来ると思います。
全ての作業を1つの記事にしようとすると膨大な量となってしまうので割愛していますが、まだまだ鍛冶屋だけでも実装するべき事柄がたくさんあるので、やはりRPGの制作は結構大変です。