У меня есть 2 слота для оружия одного и того же типа, но когда я нажимаю на предметы типа оружия, только 1 слот становится занятым - PullRequest
0 голосов
/ 20 марта 2019

Я создаю систему инвентаря с 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;
    }
}

1 Ответ

1 голос
/ 21 марта 2019

Ваш метод AddItem() находит первый слот типа EquipmentType.Weapon и заменяет его элементом, который вы пытаетесь добавить.

Если у вас есть 2 слота типа EquipmentType.Weapon как вы сказали, это означает, что AddItem() будет всегда заменять первый найденный слот, а никогда даже не коснется второго слота .

Это может быть одним из возможных способов сделать это:

public bool AddItem(EquippableItem item, out EquippableItem previousItem)
{
    int lastFoundSlotIndex = -1;
    for(int i=0; i < EquipmentSlots.Length; i++)
    {
        if(EquipmentSlots[i].EquipmentType == item.EquipmentType)
        {
            lastFoundSlotIndex = i;

            if (EquipmentSlots[i].Item == null)
                break;
        }
    }

    if (lastFoundSlotIndex >= 0)
    {
        previousItem = (EquippableItem)EquipmentSlots[lastFoundSlotIndex].Item;
        EquipmentSlots[lastFoundSlotIndex].Item = item;
        return true;
    }

    previousItem = null;
    return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...