【ダークソウル風ゲームを作りたい(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); } } }
今回は以上です。