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

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

前言

欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中,我们将探索如何用unity制作一个3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱等功能,我会附带项目源码,以便你更好理解它。

存储加载物品信息

新增SaveInventory,保存和加载物品数据

public class SaveInventory : Singleton<SaveInventory>
{
    [Header("保存加载")]
    public List<GameObject> allItemPrefabs = new List<GameObject>(); //物品预制体列表
    private string saveFileName = "inventorySave.json";

    //开始加载数据
    private void Start()
    {
        loadInventory();
    }

    //退出保存数据
    private void OnApplicationQuit()
    {
        saveInventory();
    }

    // 保存物品数据
    private void saveInventory()
    {
      List<Slot> allInventorySlots = Inventory.Instance.allInventorySlots;
        InventoryData data = new InventoryData();
        foreach (Slot slot in allInventorySlots) // 遍历所有插槽
        {
            Item item = slot.getItem(); // 获取插槽中的物品
            if (item != null)
            {
                ItemData itemData = new ItemData(item.name, item.currentQuantity, allInventorySlots.IndexOf(slot)); // 创建物品数据
                data.slotData.Add(itemData); // 添加至插槽数据列表
            }
        }
        string jsonData = JsonUtility.ToJson(data); // 序列化为 JSON 格式

        File.WriteAllText(saveFileName, jsonData); // 将数据写入文件
    }

    // 加载物品数据
    public void loadInventory()
    {
      List<Slot> allInventorySlots = Inventory.Instance.allInventorySlots;
        if (File.Exists(saveFileName))
        {
            string jsonData = File.ReadAllText(saveFileName); // 从文件中读取数据
            InventoryData data = JsonUtility.FromJson<InventoryData>(jsonData); // 反序列化为 InventoryData 对象
            Inventory.Instance.clearInventory(); // 清空物品
            foreach (ItemData itemData in data.slotData) // 遍历插槽数据列表
            {
                GameObject itemPrefab = allItemPrefabs.Find(prefab => prefab.GetComponent<Item>().name == itemData.itemName); // 根据物品名称查找对应的预制体
                if (itemPrefab != null)
                {
                    GameObject createdItem = Instantiate(itemPrefab, Inventory.Instance.dropLocation.position, Quaternion.identity); // 在指定位置创建物品
                    Item item = createdItem.GetComponent<Item>();
                    item.currentQuantity = itemData.quantity; // 设置物品数量
                    Inventory.Instance.addItemToInventory(item, itemData.slotIndex); // 将物品添加到相应插槽中
                }
            }
        }
        foreach (Slot slot in allInventorySlots) // 更新所有插槽的数据
        {
            slot.updateData();
        }
    }
}
[System.Serializable]
public class ItemData
{
    public string itemName; // 物品名称
    public int quantity; // 数量
    public int slotIndex; // 插槽索引
    public ItemData(string itemName, int quantity, int slotIndex)
    {
        this.itemName = itemName;
        this.quantity = quantity;
        this.slotIndex = slotIndex;
    }
}

[System.Serializable]
public class InventoryData
{
    public List<ItemData> slotData = new List<ItemData>(); // 插槽数据列表
}

修改Inventory

//将物品添加到背包中
public void addItemToInventory(Item itemToAdd, int overrideIndex = -1)
{
    //如果指定了覆盖索引,则将物品添加到指定的槽位中
    if(overrideIndex != -1 && overrideIndex < allInventorySlots.Count){
        allInventorySlots[overrideIndex].setItem(itemToAdd);
        itemToAdd.gameObject.SetActive(false);
        allInventorySlots[overrideIndex].updateData();
        return;
    }

    //。。。
}

// 清空物品
public void clearInventory() 
{
    foreach (Slot slot in allInventorySlots)
    {
        slot.setItem(null);
    }
}

注意:记得修改Inventory的Start方法为Awake或者OnEnable,确保Inventory初始化在SaveInventory的Start之前执行,不然会出错,对unity生命周期函数还不了解的小伙伴可以看我这篇文章:【2023Unity游戏开发教程】零基础带你从小白到超神05——脚本组件和生命周期函数

挂载配置参数

效果

先进入拾取物品,放在随机位置,退出游戏

查看保存的文件信息,在项目目录下

再次进入游戏,查看之前的物品被成功加载了

源码

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

目录
相关文章
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
934 18
|
存储 数据挖掘 数据库
服务器数据恢复—EMC UNITY 400存储卷被误删除的数据恢复案例
EMC Unity 400存储连接了2台硬盘柜。2台硬盘柜上一共有21块硬盘(520字节)。21块盘组建了2组RAID6:一组有11块硬盘,一组有10块硬盘。 在存储运行过程中,管理员误操作删除了 2组POOL上的部分数据卷。
|
编译器 vr&ar 图形学
从零开始的unity3d入门教程(五)---- 基于Vuforia的AR项目
这是一篇Unity3D结合Vuforia实现增强现实(AR)项目的入门教程,涵盖了环境配置、Vuforia账户注册、Target数据集创建、Unity项目设置、AR程序配置、Android环境配置以及最终在手机上测试运行的全过程。
从零开始的unity3d入门教程(五)---- 基于Vuforia的AR项目
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
1822 6
|
图形学 开发者 搜索推荐
Unity Asset Store资源大解密:自制与现成素材的优劣对比分析,教你如何巧用海量资产加速游戏开发进度
【8月更文挑战第31天】游戏开发充满挑战,尤其对独立开发者或小团队而言。Unity Asset Store 提供了丰富的资源库,涵盖美术、模板、音频和脚本等,能显著加快开发进度。自制资源虽具个性化,但耗时长且需专业技能;而 Asset Store 的资源经官方审核,质量可靠,可大幅缩短开发周期,使开发者更专注于核心玩法。然而,使用第三方资源需注意版权问题,且可能需调整以适应特定需求。总体而言,合理利用 Asset Store 能显著提升开发效率和项目质量。
828 1
|
图形学 C# 开发者
Unity粒子系统全解析:从基础设置到高级编程技巧,教你轻松玩转绚丽多彩的视觉特效,打造震撼游戏画面的终极指南
【8月更文挑战第31天】粒子系统是Unity引擎的强大功能,可创建动态视觉效果,如火焰、爆炸等。本文介绍如何在Unity中使用粒子系统,并提供示例代码。首先创建粒子系统,然后调整Emission、Shape、Color over Lifetime等模块参数,实现所需效果。此外,还可通过C#脚本实现更复杂的粒子效果,增强游戏视觉冲击力和沉浸感。
2055 1
|
API 开发工具 vr&ar
PicoVR Unity SDK⭐️一、SDK下载、项目设置与程序初始配置
PicoVR Unity SDK⭐️一、SDK下载、项目设置与程序初始配置
|
图形学 开发者 UED
Unity游戏开发必备技巧:深度解析事件系统运用之道,从生命周期回调到自定义事件,打造高效逻辑与流畅交互的全方位指南
【8月更文挑战第31天】在游戏开发中,事件系统是连接游戏逻辑与用户交互的关键。Unity提供了多种机制处理事件,如MonoBehaviour生命周期回调、事件系统组件及自定义事件。本文介绍如何有效利用这些机制,包括创建自定义事件和使用Unity内置事件系统提升游戏体验。通过合理安排代码执行时机,如在Awake、Start等方法中初始化组件,以及使用委托和事件处理复杂逻辑,可以使游戏更加高效且逻辑清晰。掌握这些技巧有助于开发者更好地应对游戏开发挑战。
1202 0
|
开发者 图形学 前端开发
绝招放送:彻底解锁Unity UI系统奥秘,五大步骤教你如何缔造令人惊叹的沉浸式游戏体验,从Canvas到动画,一步一个脚印走向大师级UI设计
【8月更文挑战第31天】随着游戏开发技术的进步,UI成为提升游戏体验的关键。本文探讨如何利用Unity的UI系统创建美观且功能丰富的界面,包括Canvas、UI元素及Event System的使用,并通过具体示例代码展示按钮点击事件及淡入淡出动画的实现过程,助力开发者打造沉浸式的游戏体验。
1163 0

热门文章

最新文章