Unityで武器のスロットから武器を切り替える機能

今回はゲームシーンに装備スロットを表示し、対応するキーを押した時にその武器へ切り替える機能を作成していきます。

前回までに作成した持ち物画面と

Unityのゲームで持ち物画面を作成し、アイテムの情報を見る事が出来るようにします

持ち物画面で装備スロットに武器をセットする機能

Unityの持ち物画面で装備スロットにマウスのドラッグ&ドロップで武器を設定出来るようにします

を作成している必要があります。

今回の機能を作成すると

↑のような感じで持ち物画面で設定した装備スロットの武器を対応する番号のキーを押す事で切り替える事が出来るようになります。

UI部分を凝った作りにしなかった為、持ち物画面で武器を設定する前に装備を切り替えてもスロットの色が変わっていないように見えます。

例えば3を押せば左から3つ目の装備スロットを装備した事になっています。

3つの記事に渡って機能を追加してきたので、ちょっと処理が解り辛いかもしれません。(^_^;)

スポンサーリンク

ゲームシーンに装備スロット表示パネルを作成

まずはゲームシーンに装備スロットのパネルを作成します。

以前作成した弾の弾数を表示するStatusUIの子要素に新しくPanelを作成し、名前をEquipPanelとします。

EquipPanelにはAdd ComponentからLayout→Horizontal Layout Groupを取り付けます。

EquipPanelにHorizontalLayoutGroupを取り付ける

Unityで作成しているガンシューティングゲームの銃の残り弾数をUIを使って表示するような機能を作成していきます。

新しくCanvasを作ってその子要素に作成してもかまいません。

ゲームシーンにEquipPanelを作成する

↑のようにEquipPanelの子要素にさらにPanelを4つ作成し、Equipと名前の後に1~4の番号を付けます。

さらにそれぞれの子要素にImageを作成します。

子要素のImageにはアイテムに対応するスプライトをスクリプトから設定します。

ゲームシーンにEquipPanelを作成した画像

↑のような装備スロットを表示するUIが完成しました。

アイテム情報等の修正

ここまでの記事をご覧頂いている方には申し訳ありませんが、武器の情報を保持しているWeaponStatusで種類を定義しているWeaponTypeを作成していましたが、ItemDataBaseのItemと情報が被ってしまう為、ItemDataBaseにアイテムの種類を一括で管理するようにし、WeaponStatusでは武器の種類にItemDataBaseのItemを設定するようにします。

まずは武器のステータスを保持しているWeaponStatusを修正します。

WeaponTypeを削除しました。

次にItemDataBaseスクリプトの修正です。

列挙型であるItemには以前はKnifeやFlashLightといった特定の名前を付けていましたが、Sword、HandGun、ShotGun、UseItemに分ける事にしました。

銃は弾の種類を変える為GunではなくHandGunとShotGunに分けました。

アイテムの種類をItemDataBaseで一括管理するようにしたので、銃を撃った時の処理Shotスクリプト等でもWeaponStatusのItemで処理していた場所をItemDataBaseのItemで判断するようにします。

また、MyItemStatusとして保持しているアイテムを管理していた場合はそれらの機能をMyStatusに統合します。

持ち物画面の装備スロットをゲームのステータス画面の装備スロットに反映させる

持ち物画面の武器を持ち物画面の装備スロットにドロップした時に持ち物画面の装備スロットにアイテムを設定していますが、その時にゲームのステータス画面の装備スロットにも反映するようにします。

MyStatusスクリプトに処理を追加

MyStatusスクリプトに処理を追加し、装備画面の装備スロットにアイテムがセットされたら、EquipPanelの子要素にアイテムをセットするようにします。

MyStatusスクリプトに以下の処理を追加します。

装備スロットに何がセットされているかをequipSlotDatasで保持します。

equipPanelフィールドにはインスペクタでEquipPanelゲームオブジェクトを設定します。

SetItemDataメソッドは指定したスロット番号にItemDataを設定します。

EquipPanel→Equip番号→Imageを取得する為にequipPanelの子要素のImageにItemDataから取得したスプライトを設定します。

ProcessingEquipSlotに処理を追加

ProcessingEquipSlotが装備画面の装備スロットにアイテムをドロップした時の処理を行っているので、そこでMyStatusのSetItemDataメソッドを呼び出すようにします。

myStatusは主人公に設定しているMyStatusをインスペクタで設定します。

ProcessingEquipSlotは装備画面のEquip子要素のEquipSlot1~4にそれぞれ設定されているので、インスペクタでslotNumに0~3の値を設定します。

myStatusのSetItemDataを呼び出す時に自身のスロットのItemDataとインスペクタで設定したslotNumを渡して呼び出します。

こうすることでゲームのステータス画面の装備スロットの番号と合わせる事が出来ます。

注意するべき点として装備スロット番号は1~4なのに対してProcessingEquipSlotのslotNumは0~3の番号が対応する点と、

ヒエラルキーのEquipSlotの番号の順番が昇順になっている必要がある点です。

またすでに装備している武器があって、持ち物画面で装備している武器のスロットのところに武器をドロップした時は装備を切り替える必要があります。

そこで自身のスロット番号とChangeEquipスクリプトの装備スロットが一致した場合は今ドロップした武器をインスタンス化する処理を呼び出します。

装備切り替えスクリプトChangeEquipの修正

以前は1のキーを押した時に順々に装備品を変更していましたが、

装備の切り替えを1~4のキーが押された時に対応する装備スロットの装備に変更するようにします。

装備切り替え機能はChangeEquipスクリプトなので、処理を修正します。

Updateメソッドで1~4のキーを押したらInstantiateWeaponに対応する数字を渡して呼び出します。

InstantiateWeaponではint型の数字を受け取ります。

装備している武器のスロットの背景を赤に、その他を白に設定します。

MyStatusスクリプトから装備スロットのItemDataを取得し、装備スロットに武器が設定されていなければ以降の処理をしません。

ItemDataとゲームオブジェクトの関連付けはアイテムの名前から武器のプレハブの名前を作成し、その名前と一致するweaponsに指定した武器のプレハブを探し、それをインスタンス化する事にします。

ItemDataにプレハブの名前を登録した方が早そうですね・・・・(^_^;)

最後のShotスクリプトのSetComponentメソッドは銃タイプの武器の時だけ呼び出すように変更しました。

これで機能が完成しました。

終わりに

持ち物画面を作った後に追加した機能なので、以前の記事で作ったものを修正する必要がかなり出ました。

あんまりスッキリした感じに仕上がりませんね・・・・(^_^;)

後はDestroyImmediateを使わないとSetComponentメソッドで銃のレーザーポインタや発砲の光が取得出来ないので使っていますが、通常はDestroyメソッドを使った方がいいようです。

DestroyImmediateだと第2引数にtrueを設定した場合UnityEditor上からアセット自体を削除してしまう可能性があるからかもしれません。

なのでDestroyで問題が出た時だけDestroyImmediateを使った方がいいかもしれません。

UnityのスクリプトリファレンスではDestroyImmediateの使いどころとしては

  • 破壊が遅れた時
  • エディターコードを書き込む時
  • となっています。

    スポンサーリンク

    記事をシェアして頂ける方はこちら

    フォローして頂くとやる気が出ます