【ダークソウル風ゲームを作りたい(Unity)。その8】

今回はプレイヤーに武器を持たせます。
youtu.be

今回追加するスクリプトです。

namespace SG
{
    public class Item : ScriptableObject //+EP8 ScriptableObject:共用するデータを格納する時に便利なクラス
    {
        [Header("Item Information")]
        public Sprite itemIcon;
        public string itenName;
    }
}
namespace SG
{
    [CreateAssetMenu(menuName="Items/Weapom Item")]
    public class WeaponItem : Item //+EP8
    {
        public GameObject modelPrefab;
        public bool isUnarmed;
    }
}
namespace SG
{
    public class WeaponHoldersSlot : MonoBehaviour //+EP8 プレイヤーの右手/左手にアタッチ
    {
        public Transform parentOverride;
        public bool isLeftHandsSlot;
        public bool isRightHandSlot;

        public GameObject currentWeaponModel;

        public void UnloadWeapon()
        {
            if (currentWeaponModel != null)
            {
                currentWeaponModel.SetActive(false);
            }
        }

        public void UnloadWeaponAndDestory()
        {
            if (currentWeaponModel != null)
            {
                Destroy(currentWeaponModel);
            }
        }

        public void LoadWeaponModel(WeaponItem weaponItem)
        {
            UnloadWeaponAndDestory();

            if (weaponItem == null)
            {
                UnloadWeapon();
                return;
            }

            //武器の生成
            GameObject model = Instantiate(weaponItem.modelPrefab) as GameObject;
            if (model != null)
            {
                //左手の武器の親を設定
                if (parentOverride != null)
                {

                    model.transform.parent = parentOverride;
                }
                //右手の武器の親を設定
                else
                {
                    model.transform.parent = transform;
                }

                model.transform.localPosition = Vector3.zero;
                //回転なし
                model.transform.localRotation = Quaternion.identity;
                model.transform.localScale = Vector3.one;
            }

            currentWeaponModel = model;
        }
    }
}
namespace SG
{
    public class WeaponSlotManager : MonoBehaviour //+EP8 プレイヤー直下のオブジェクトにアタッチ
    {
        WeaponHoldersSlot leftHandslot;
        WeaponHoldersSlot rightHandslot;

        private void Awake()
        {
            WeaponHoldersSlot[] weaponHoldersSlots = GetComponentsInChildren<WeaponHoldersSlot>();
            foreach(WeaponHoldersSlot weaponSlot in weaponHoldersSlots)
            {
                if (weaponSlot.isLeftHandsSlot)
                {
                    leftHandslot = weaponSlot;
                }
                else if (weaponSlot.isRightHandSlot)
                {
                    rightHandslot = weaponSlot;
                }
            }

        }

        public void LoadWeaponOnSlot(WeaponItem weaponItem,bool isLeft)
        {
            if (isLeft)
            {
                leftHandslot.LoadWeaponModel(weaponItem);
            }
            else
            {
                rightHandslot.LoadWeaponModel(weaponItem);
            }
        }
    }
}
namespace SG
{
    public class PlayerInventory : MonoBehaviour //+EP8 プレイヤーにアタッチ
    {
        WeaponSlotManager weaponSlotManager;

        public WeaponItem rightWeapon;
        public WeaponItem leftWeapon;

        private void Awake()
        {
            weaponSlotManager = GetComponentInChildren<WeaponSlotManager>();
        }

        private void Start()
        {
            //右手/左手に武器のリスポーンを実行
            weaponSlotManager.LoadWeaponOnSlot(rightWeapon, false);
            weaponSlotManager.LoadWeaponOnSlot(leftWeapon, true);
        }
    }
}

今回は以上です。