Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我有两个相同类型的武器槽,但当我点击武器类型的物品时,只有一个槽被占用_C#_Unity3d - Fatal编程技术网

C# 我有两个相同类型的武器槽,但当我点击武器类型的物品时,只有一个槽被占用

C# 我有两个相同类型的武器槽,但当我点击武器类型的物品时,只有一个槽被占用,c#,unity3d,C#,Unity3d,我正在创建一个库存系统,使用4种类型的设备 public enum EquipmentType { Weapon, Head, Body, Feet, } 但我有5个插槽,2个插槽用于武器。我已经实现了右键单击事件右键单击库存中的项目将装备这些项目到设备面板中的相应插槽。所以,当我右键单击武器类型的物品时,只有一个插槽被占用。 此外,我还实现了拖放方法,这似乎对两个插槽都很好。以下是我使用的脚本 设备插槽.cs using System.Collections;

我正在创建一个库存系统,使用4种类型的设备

public enum EquipmentType
{
    Weapon,
    Head,
    Body,
    Feet,
}
但我有5个插槽,2个插槽用于武器。我已经实现了右键单击事件右键单击库存中的项目将装备这些项目到设备面板中的相应插槽。所以,当我右键单击武器类型的物品时,只有一个插槽被占用。 此外,我还实现了拖放方法,这似乎对两个插槽都很好。以下是我使用的脚本

设备插槽.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;
    }
设备面板.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;
    }
}
AddItem方法会找到EquipmentType.Wearm类型的第一个插槽,并将其替换为您尝试添加的项目

如果您有两个EquipmentType.Answare类型的插槽,这意味着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;
}

谢谢,那么什么样的代码可以更好地解决这个问题呢?这取决于当两个插槽都被占用时您打算做什么。我添加了一个解决方案的代码,该解决方案首先尝试找到一个空插槽来安装武器。如果没有可用的插槽,它将用您试图装备的武器替换第二个找到的插槽中的武器。我尝试更改代码,但似乎不起作用。它给我一个完全不同的输出,用以前单击的项目替换库存中的项目。很抱歉,我在设备插槽[I]中得到了错误的索引。项目=项目;。它应该是EquipmentSlots[lastFoundSlotIndex].Item=Item;。代码现在已修复。