首页 > 解决方案 > 如何像列表一样使用现有的数组?

问题描述

我有一个数组来控制我的 UI 库存列表。当我将 a 添加GameObject到数组时,该函数也会将其添加GameObject到我的库存 UI。

在我的脚本中,我还有一个删除函数,它GameObject从数组中删除 并GameObject从 UI 中删除。

我的问题是我需要将此数组更改为列表,以便它可以动态工作,因为列表具有将数组元素移动到数组前面的内置功能(即在数组中向左移动它们指数)。

例如,当前使用数组时,当我选择项目 1、2、3、4 和 5 时。然后我继续删除项目 3。我的数组中剩下的是 1、2、null、4 和 5。同样,我的库存 UI 中剩下的就是GameObject插槽 1,2,null,4,5 中的 s。在这种情况下,null 是一个没有任何内容的 UI 图像。

通过将此数组转换为列表,我相信我可以避免库存 UI 中出现空白。同样,我知道我的数组和/或列表将始终是 16 项。

我尝试将现有数组转换为列表并使用与列表方法对应的所有方法。

原始数组用法:

public class Inventory : MonoBehaviour
{
    public GameObject[] inventory = new GameObject[16];
    public List<GameObject> inventory2 = new List<GameObject>();

    public void AddItem(GameObject item)
    {
        bool itemAdded = false;

        //find the first open slot in inventory
        for (int i = 0; i < inventory.Length; i++)
        {
            if (inventory[i] == null)
            {
                inventory[i] = item;

                //Update UI
                InventoryButtons[i].image.overrideSprite = 
    item.GetComponentInChildren<SpriteRenderer>().sprite;
        }
    }
}

我尝试将其转换为列表并像这样使用它:

public class Inventory : MonoBehaviour
{
    public List<GameObject> inventory = new List<GameObject>();

    public void AddItem(GameObject item)
    {
        bool itemAdded = false;

        //find the first open slot in inventory
        for (int i = 0; i < inventory.Count; i++)
        {
            if (inventory[i] == null)
            {
                inventory[i] = item;

                //Update UI
                InventoryButtons[i].image.overrideSprite = 
     item.GetComponentInChildren<SpriteRenderer>().sprite;
            }
        }
    }
}

由于我认为列表和数组的工作方式相同,我认为我的方法可以工作,但是列表仍然充当数组,也就是说,在从数组中删除项目后,它不会动态地将数组中的项目移动到前面.

标签: c#arrayslistunity3d

解决方案


如果数组版本成功并且您总是想要 16 个项目,为什么不这样做来删除一个项目:

//remove item at index 5
for (int i = 5; i < inventory.Count - 1; i++)
  inventory[i] = inventory[i+1];

inventory[inventory.Length - 1] = null;

我们从要删除的索引 5 开始,然后继续到 array-1 的末尾,将每个下一个项目复制到当前项目的顶部。然后我们完成循环并使最后一项为空


推荐阅读