前言
欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中,我们将探索如何用unity制作一个3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱等功能,我会附带项目源码,以便你更好理解它。
拖放、交换物品
绘制拖拽物品插槽UI
记得默认透明的设为0,并去除射线检测
修改Inventory,控制拖放功能
[Header("拖放")] public Image dragIconImage;//拖拽图标的Image组件 private Item currentDraggedItem;//当前被拖拽的物品 private int currentDragSlotIndex = -1;//当前被拖拽物品的槽位索引 public void Update() { //。。。 if (inventory.activeInHierarchy && Input.GetMouseButtonDown(0)) { dragInventoryIcon();//拖拽物品 } else if (currentDragSlotIndex != -1 && Input.GetMouseButtonUp(0) || currentDragSlotIndex != -1 && !inventory.activeInHierarchy) { dropInventoryIcon();//放下物品 } dragIconImage.transform.position = Input.mousePosition; } // 开始拖拽背包中的一个物品图标 private void dragInventoryIcon() { for (int i = 0; i < allInventorySlots.Count; i++) { Slot curSlot = allInventorySlots[i]; // 获取当前遍历到的槽位 if (curSlot.hovered && curSlot.hasItem()) // 如果鼠标悬停在有物品的槽位上 { currentDragSlotIndex = i; // 更新当前正在拖拽的槽位索引变量 currentDraggedItem = curSlot.getItem(); // 从当前槽位获取物品 dragIconImage.sprite = currentDraggedItem.icon; // 设置拖拽图标的精灵为物品的图标 dragIconImage.color = new Color(1, 1, 1, 1); // 使跟随鼠标的图标不透明(可见) curSlot.setItem(null); // 从我们刚刚拿起物品的槽位中移除物品 break; // 找到后即退出循环 } } } // 放下正在拖拽的背包图标 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(); // 获取该槽位的物品以供交换 curSlot.setItem(currentDraggedItem); // 将拖拽的物品放入当前槽位 allInventorySlots[currentDragSlotIndex].setItem(itemToSwap); // 将被交换的物品放回原来的拖拽槽位 } else // 如果槽位为空,则直接放置物品,无需交换 { curSlot.setItem(currentDraggedItem); } resetDragVariables(); // 重置拖拽相关的变量 return; // 放置成功后即退出函数 } } // 如果没有悬停在任何槽位上(即放置位置无效),则将物品放回原来的槽位 allInventorySlots[currentDragSlotIndex].setItem(currentDraggedItem); resetDragVariables(); } // 重置拖拽相关的变量 private void resetDragVariables() { // 逻辑代码来重置相关变量,例如 currentDragSlotIndex = -1; currentDraggedItem = null; }
配置参数
效果,实现了物品拖拽和交换
源码
源码不出意外的话我会放在最后一节