虚幻Unreal - A计划(一年有效期) 扫二维码继续学习 二维码时效为半小时

(37评价)
价格: 1664.00元
Unreal中级案例-课时287
嘚啊噗昂嘻嗷吱发起了话题2020-12-07
1
回复
440
浏览
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)”中,按您的要求更改后依然报空指针

所有回复
发表回复
你还没有登录,请先 登录或 注册!