在 Unity 中使用数组时出现“空引用”错误

问题描述 投票:0回答:1

Unity 2022.3.9f1 LTS

所以基本上我有一个 Inventory 对象,它附加了“InventoryManager”,并且同一个类具有长度为 10 的“InventorySlot”数组。

我正在使用以下方法交换/移动库存数组中的物品:

    public class ItemSlot
    {
        [SerializeField] public string ItemName;
        [SerializeField] public ItemsSO ItemProperty;
        [SerializeField] public int ItemAmount;
    }

    [SerializeField] public ItemSlot[] playerInventory;
    private void Start()
    {
        playerInventory = new ItemSlot[10];
    }

    public void MoveItemInPlayerInventoryFromPlayerInventory(ItemSlot movingItem, int inventoryIndex)
    {
        int movingItemIndex = Array.IndexOf(playerInventory, movingItem);

        Debug.LogError($"Item Drag At Inventory Index : {inventoryIndex} \nItem Checking : !{playerInventory[inventoryIndex].ItemName}! ");

        // Destination slot is empty
        if (playerInventory[inventoryIndex].ItemProperty == null)
        {
            playerInventory[inventoryIndex] = playerInventory[movingItemIndex];
            playerInventory[movingItemIndex] = null;
        }
        else
        {
            // Swap items
            ItemSlot temp = playerInventory[inventoryIndex];
            playerInventory[inventoryIndex] = playerInventory[movingItemIndex];
            playerInventory[movingItemIndex] = temp;
        }

        InventoryUIManager.Instance.ShowItemPreviewAtInventory();
    }

奇怪的问题是 - 如果我在播放模式中选择层次结构中的库存游戏对象,那么此方法运行完美,没有任何错误。

但是,如果我取消选择 Inventory 对象并开始玩游戏,那么每次我调用该方法时,它都会在“

Debug.LogError() & if (playerInventory[inventoryIndex].ItemProperty == null)
”行抛出“null Reference”错误。

我附上相同的视频链接 - 该问题视频的驱动器链接

c# unity-game-engine unityscript
1个回答
0
投票

所以很难根据视频和上下文判断发生了什么,但我认为发生的是在游戏开始时,您将库存初始化为

playerInventory = new ItemSlot[10];
,这意味着您正在创建一个数组10 个
ItemSlot
类型的元素,但是您实际上没有在这些容器中放入任何内容,因此即使编译器允许您查找这些类型的属性,您也需要先检查该容器中是否有某些内容,而不是执行以下操作:

        // Destination slot is empty
        if (playerInventory[inventoryIndex].ItemProperty == null)
        {
            playerInventory[inventoryIndex] = playerInventory[movingItemIndex];
            playerInventory[movingItemIndex] = null;
        }
        else
        {
            // Swap items
            ItemSlot temp = playerInventory[inventoryIndex];
            playerInventory[inventoryIndex] = playerInventory[movingItemIndex];
            playerInventory[movingItemIndex] = temp;
        }

你需要先检查对象是否为空

        // Destination slot is empty
        if (playerInventory[inventoryIndex] == null || playerInventory[inventoryIndex].ItemProperty == null)
        {
            playerInventory[inventoryIndex] = playerInventory[movingItemIndex];
            playerInventory[movingItemIndex] = null;
        }
        else
        {
            // Swap items
            ItemSlot temp = playerInventory[inventoryIndex];
            playerInventory[inventoryIndex] = playerInventory[movingItemIndex];
            playerInventory[movingItemIndex] = temp;
        }

这是我根据上下文的猜测。

© www.soinside.com 2019 - 2024. All rights reserved.