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”错误。
我附上相同的视频链接 - 该问题视频的驱动器链接
所以很难根据视频和上下文判断发生了什么,但我认为发生的是在游戏开始时,您将库存初始化为
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;
}
这是我根据上下文的猜测。