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

記事内に広告が含まれています。

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

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

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

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

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

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

今回の機能を作成すると

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

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

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

スポンサーリンク

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

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

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

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

EquipPanelにHorizontalLayoutGroupを取り付ける

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

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

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

Equip1~4のImageのColorのAlphaを100にします。

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

それぞれのImageゲームオブジェクトのImageコンポーネントでSourceにスタンダードアセットのbackgroundを設定し、ColorのAlphaを100にします。

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

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

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

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

持ち物画面の武器を、持ち物画面の装備スロットにドロップした時に持ち物画面の装備スロットにアイテムを設定していますが、その時に先ほど作成したEquipPanelの子要素の装備スロットにも反映するようにします。

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

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

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

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

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

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

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

GetEquipSlotDataメソッドは引数としてスロット番号を受け取りその番号のスロットに設定されているItemDataを返します。

SetSelectedSlotNumメソッドは現在選択しているスロット番号を設定します。

GetSelectedSlotNumメソッドは現在選択しているスロット番号を返します。

ProcessingEquipSlotに処理を追加

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

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

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

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

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

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

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

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

そこで自身のスロット番号と主人公のステータス管理スクリプトのMyStatusの現在選択しているスロットが一致した場合は今ドロップした武器をインスタンス化する処理を呼び出します。

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

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

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

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

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

5のキーを押したら装備を解除します。

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

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

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

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

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

DestroyImmediateについて

以前はDestroyImmediateをつかってゲームオブジェクトを削除してましたが、通常はDestroyメソッドを使った方がいいようです。

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

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

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

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

    以前はDestroyImmediateを使っていましたが、現在はDestoryにしています。

    タイトルとURLをコピーしました