前言
欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中,我们将探索如何用unity制作一个3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱等功能,我会附带项目源码,以便你更好理解它。
箱子库存
新增库存箱子脚本
public class Chest : MonoBehaviour { [SerializeField] private GameObject chestUIPrefab; // 宝箱UI预制体 [SerializeField] private Transform chestUIParent; // 宝箱UI的父对象 [HideInInspector] public List<Slot> allChestSlots = new List<Slot>(); // 所有宝箱槽位列表 [HideInInspector] public GameObject chestInstantiatedParent; // 实例化的宝箱父对象 private void Start() { chestInstantiatedParent = Instantiate(chestUIPrefab, chestUIParent.position, chestUIParent.rotation, chestUIParent); // 获取所有宝箱槽位,并添加到槽位列表中 foreach (Transform childSlot in chestInstantiatedParent.transform.GetChild(1)) { Slot childSlotScript = childSlot.GetComponent<Slot>(); allChestSlots.Add(childSlotScript); childSlotScript.initialiseSlot();// 初始化槽位信息 } chestInstantiatedParent.SetActive(false); Inventory.Instance.allInventorySlots.AddRange(allChestSlots); } }
绘制箱子库存UI,然后做成预制体,删除原来的
配置箱子参数
修改Inventory
public List<Slot> characterInventorySlots = new List<Slot>(); // 人物槽位列表,也就是背包+快捷栏 [Header("宝箱")] public LayerMask chestLayer; private List<Slot> chestSloats = new List<Slot>();//当前宝箱的槽位列表 private GameObject chestSlotParent;//宝箱槽位的父对象 private Chest chestInfo; public new void Awake() { characterInventorySlots.AddRange(hotbarSlots); characterInventorySlots.AddRange(inventorySloats); //。。。 } // 显示物品名称和拾取物品 private void itemRaycast(bool hasClicked = false) { //... if (hasClicked && Physics.Raycast(ray, out hit, raycastDistance, chestLayer) && chestSlotParent == null) { chest = hit.collider.GetComponent<Chest>(); openChest(chest); } } // 打开宝箱时的操作 private void openChest(Chest chest) { toggleInventory(true);// 打开玩家背包界面 chestSloats = chest.allChestSlots;// 设置当前宝箱的槽位列表 chestSlotParent = chest.chestInstantiatedParent;// 设置宝箱槽位的父对象为当前打开的宝箱界面 chestSlotParent.SetActive(true);// 显示宝箱界面 } private void toggleInventory(bool enable) { //关闭背包时,关闭所有鼠标悬停在该槽位上的标志 if (!enable) { foreach (Slot curSlot in allInventorySlots) { curSlot.hovered = false; } } //关闭背包时,清除所有的宝箱数据 if (!enable && chestSlotParent != null) { chestSlotParent.SetActive(false); chestSlotParent = null; chestSloats = null; chest = null; } //... }
修改宝箱交互层级
效果
源码
源码不出意外的话我会放在最后一节