前言
欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中,我们将探索如何用unity制作一个3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱等功能,我会附带项目源码,以便你更好理解它。
物品堆叠
修改Inventory
// 放下正在拖拽的背包图标 private void dropInventoryIcon() { // 重置我们的拖拽物品变量 dragIconImage.sprite = null; dragIconImage.color = new Color(1, 1, 1, 0); // 使图标不可见 for (int i = 0; i < allInventorySlots.Count; i++) { Slot curSlot = allInventorySlots[i]; // 获取当前遍历到的槽位 if (curSlot.hovered) // 如果鼠标悬停在当前槽位上 { if (curSlot.hasItem()) // 如果该槽位已经有物品 { Item itemToSwap = curSlot.getItem(); // 获取该槽位的物品 //如果两个物品相同,且可堆叠 if (itemToSwap.name == currentDraggedItem.name && itemToSwap.currentQuantity != itemToSwap.maxQuantity) { int leftoverQuantity = currentDraggedItem.currentQuantity;//当前拖拽物品数量 int freeSpaceInSlot = itemToSwap.maxQuantity - itemToSwap.currentQuantity;//目标物品差多少满堆叠 if (freeSpaceInSlot >= leftoverQuantity) { itemToSwap.currentQuantity += leftoverQuantity; Destroy(currentDraggedItem); allInventorySlots[currentDragSlotIndex].setItem(null); allInventorySlots[i].updateData(); resetDragVariables(); return; } else { itemToSwap.currentQuantity = itemToSwap.maxQuantity;//设置目标物品为最大堆叠 allInventorySlots[i].updateData(); currentDraggedItem.currentQuantity = currentDraggedItem.currentQuantity - freeSpaceInSlot; allInventorySlots[currentDragSlotIndex].setItem(currentDraggedItem); resetDragVariables(); return; } } else { //交互物品 curSlot.setItem(currentDraggedItem); // 将拖拽的物品放入当前槽位 allInventorySlots[currentDragSlotIndex].setItem(itemToSwap); // 将被交换的物品放回原来的拖拽槽位 resetDragVariables(); // 重置拖拽相关的变量 return; } } else // 如果槽位为空,则直接放置物品 { curSlot.setItem(currentDraggedItem); resetDragVariables(); // 重置拖拽相关的变量 return; } } } // 如果没有悬停在任何槽位上(即放置位置无效),则将物品放回原来的槽位 allInventorySlots[currentDragSlotIndex].setItem(currentDraggedItem); resetDragVariables(); }
效果
源码
源码不出意外的话我会放在最后一节