インベントリ / スロットの自動生成

はじめに

今回からコーディング作業が始まります。作成するのは、ItemBagクラス内でスロットプレハブを量産する箇所になります。下図の「」印を付けた箇所です。



作業の概要は、ItemBagクラスを作成し、ゲーム開始とともにスロットを量産することです。



Main

早速作業に入ります。ProjectのInventoryフォルダ内に"Scripts"フォルダを作成し、中に入ってください。

ここにItemBagスクリプトを作成します。次にこのスクリプトを"ItemBagオブジェクト"にアタッチします。


ではこのスクリプトを編集していきます。ファイルをダブルクリックし、エディタを開いてください。初めからいくつかのコードが書かれていると思いますが、それらは消去して以下のコードを貼り付けてください。
ItemBag.cs
1using System;
2using System.Collections.Generic;
3using UnityEngine;
4
5namespace FlMr_Inventory
6{
7    /// <summary>
8    /// インベントリをコントロールするクラス。
9    /// 複数のアイテムスロットを保持し、アイテムの出入りを行う。
10    /// </summary>
11    public class ItemBag : MonoBehaviour
12    {
13        /// <summary>
14        /// 初期のスロット数
15        /// </summary>
16        [SerializeField] private int slotNumber = 10;
17
18        /// <summary>
19        /// スロットオブジェクトのプレハブ
20        /// </summary>
21        [SerializeField] private GameObject slotPrefab;
22
23        /// <summary>
24        /// 全てのスロットオブジェクト
25        /// </summary>
26        private List<GameObject> AllSlots { get; } = new();
27
28        void Awake()
29        {
30            for (int i = 0; i < slotNumber; i++)
31            {
32                //slotNumber の数だけスロットを生成し、ItemBagの子オブジェクトとして配置する
33                var slot = Instantiate(slotPrefab, this.transform, false);
34                AllSlots.Add(slot);
35            }
36
37        }
38
39    }
40}

コードの説明をしていきます。

まず4行目で名前空間を設定しています。この名前はなんでも良いのですが、今後常にFlMr_Inventoryであるとして説明を行います。そのため好きな名前に変更するのは完成後に行うことをお勧めします。

15行目で、バッグが持つスロット数を定義しています。先に説明した通りインスペクター上で設定したいため、SerializeField属性を付けています。初期値は何でもいいですが、今後の説明のため10を代入することを推奨します。

20行目は生成するスロットのプレハブを保持する変数です。25行目には、バッグ内に存在するスロットオブジェクトを全て保存する変数を定義しています。これもインスペクター上から登録します。

最後に27-36行目のAwake()メソッドです。これはItemBagオブジェクトがシーンに登場した際に自動的に呼ばれるメソッドです。Start()メソッドも同様に呼ばれるメソッドですが、Awake()メソッドのほうが先に呼ばれます。ここでは設定したslotNumber分だけループ処理が走っています。中ではInstantiate()が実行されます。第一引数に登録されたプレハブ(原本)をもとに、そのコピーがシーン上に出現します。このままでは一体どこに配置すればよいのか分からないため、第二引数に親オブジェクト(ItemBagオブジェクト)を渡しています。

Unityに戻り、ItemBagのコンポーネントを調節します。SlotPrefabには前回作成したItemSlotプレハブ(Inventory/Prefabs/ItemSlot)を登録します。

この状態でゲームを開始すると、インスペクター上で指定した数だけスロットが生成されます。

今回は以上です。

ここまでの状況は  Github  から確認できます。