【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱9(附带项目源码)

简介: 【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱9(附带项目源码)

前言

欢迎来到【制作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;
    }

    //...
}

修改宝箱交互层级

效果

源码

源码不出意外的话我会放在最后一节

目录
相关文章
|
2天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3(附带项目源码)
13 2
|
2天前
|
图形学
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
10 0
|
2天前
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
11 2
|
2天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(上)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)
10 2
|
2天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版2(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版2(附带项目源码)
8 1
|
2天前
|
存储 JSON 图形学
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
6 0
|
2天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
8 0
|
2天前
|
存储 JSON 关系型数据库
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
9 0
|
2天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
8 0
|
2天前
|
存储 图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版11(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版11(附带项目源码)
6 0