Я создаю систему инвентаря с 4 типами экипировки, используя
public enum EquipmentType
{
Weapon,
Head,
Body,
Feet,
}
, но у меня есть 5 слотов (2 слота для оружия).Я реализовал событие RightClick (предметы, нажимаемые правой кнопкой мыши в инвентаре, будут снаряжать предметы в соответствующие слоты на панели оборудования).Поэтому, когда я щелкаю правой кнопкой мыши по предметам типа оружия, занят только один слот.Также я реализовал методы перетаскивания, которые работают нормально для обоих слотов.Ниже приведены сценарии, которые я использовал.
EquipmentSlot.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EquipmentSlot : ItemSlot
{
public EquipmentType EquipmentType;
protected override void OnValidate()
{
base.OnValidate();
gameObject.name = EquipmentType.ToString() + " Slot";
}
public override bool CanRecieveItem(Item item)
{
if (item == null)
return true;
EquippableItem equippableItem = item as EquippableItem;
return equippableItem != null && equippableItem.EquipmentType == EquipmentType;
}
EquipmentPanel.cs
using System;
using UnityEngine;
public class EquipmentPanel : MonoBehaviour
{
public EquipmentSlot[] EquipmentSlots;
[SerializeField] Transform equipmentSlotsParent;
public event Action<ItemSlot> OnRightClickEvent;
public event Action<ItemSlot> OnPointerEnterEvent;
public event Action<ItemSlot> OnPointerExitEvent;
public event Action<ItemSlot> OnBeginDragEvent;
public event Action<ItemSlot> OnEndDragEvent;
public event Action<ItemSlot> OnDragEvent;
public event Action<ItemSlot> OnDropEvent;
public void Start()
{
for (int i = 0; i < EquipmentSlots.Length; i++)
{
EquipmentSlots[i].OnRightClickEvent += OnRightClickEvent;
EquipmentSlots[i].OnPointerEnterEvent += OnPointerEnterEvent;
EquipmentSlots[i].OnPointerExitEvent += OnPointerExitEvent;
EquipmentSlots[i].OnBeginDragEvent += OnBeginDragEvent;
EquipmentSlots[i].OnEndDragEvent += OnEndDragEvent;
EquipmentSlots[i].OnDragEvent += OnDragEvent;
EquipmentSlots[i].OnDropEvent += OnDropEvent;
}
}
private void OnValidate()
{
EquipmentSlots = equipmentSlotsParent.GetComponentsInChildren<EquipmentSlot>();
}
public bool AddItem(EquippableItem item, out EquippableItem previousItem)
{
for(int i=0; i < EquipmentSlots.Length; i++)
{
if(EquipmentSlots[i].EquipmentType == item.EquipmentType)
{
previousItem = (EquippableItem)EquipmentSlots[i].Item;
EquipmentSlots[i].Item = item;
return true;
}
}
previousItem = null;
return false;
}
public bool RemoveItem(EquippableItem item)
{
for (int i = 0; i < EquipmentSlots.Length; i++)
{
if (EquipmentSlots[i].Item == item)
{
EquipmentSlots[i].Item = null;
return true;
}
}
return false;
}
}