int AInventory::AddItem(TSubclassOf<ABaseItem> Item, int Amount)
{
//根据物品本身属性判断是否能堆积
if (Item->GetDefaultObject<ABaseItem>()->ItemInfo.bCanBeStacked)
{
//物品可以堆积,此时寻找插槽上空着的堆
//判断对应物品的堆是否为空
if (SearchFreeStack(Item)==Slots.Num())
{
//寻找插槽上有无空位置
if (SearchEmptySlot()!=Slots.Num())
{
//有空位置
//判断存放数量是否大于最大存放数量
if (Amount>MaxStackSize)
{
//先将允许范围内数量的项目存放到对应索引插槽
Slots[SearchEmptySlot()] = FInventorySlot{ Item,MaxStackSize };
//再将剩余数量项目重复此函数
AddItem(Item, Amount - MaxStackSize);
return Amount - MaxStackSize;
}
else
{
AddItem(Item, Amount);
return 0;
}
}
//未找到空着的堆和空着的插槽
else
{
return Amount;
}
}
else//插槽上找到空位置
{
//判断当前插槽存放的数量(判断插槽已存放数量+想要存放数量>插槽允许存放的最大数量)
if ((Slots[SearchFreeStack(Item)].Amount + Amount) > MaxStackSize)
{
//存放允许最大数量范围内的项目
Slots[SearchFreeStack(Item)] = FInventorySlot{ Item,MaxStackSize };
//再次将剩余的项目存储
AddItem(Item, (Slots[SearchFreeStack(Item)].Amount + Amount) - MaxStackSize);
return (Slots[SearchFreeStack(Item)].Amount + Amount) - MaxStackSize;
}
else
{
//存放对应数量的项目
Slots[SearchFreeStack(Item)] = FInventorySlot{ Item,(Slots[SearchFreeStack(Item)].Amount + Amount) };
return 0;
}
}
}
else
{
//若不可被堆积则寻找空插槽,一个插槽存放一个物品
//判断能否找到空插槽
if (SearchEmptySlot()!=Slots.Num())
{
//找到了空插槽,并对相应索引位置赋值
Slots[SearchEmptySlot()] = FInventorySlot{ Item,1 };
//判断数量
if (Amount>1)
{
//使用相同方式重复添加,每添加一个减少一个数量
AddItem(Item, Amount - 1);
return Amount - 1;
}
else
{
//不大于1则证明存放完毕
return 0;
}
}
else//没有空间添加,所以没有添加任何项目返回所有数量
{
return Amount;
}
}
}
老师您好,在“if (Item->GetDefaultObject<ABaseItem>()->ItemInfo.bCanBeStacked)”中,按您的要求更改后依然报空指针