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

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

前言

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

配置参数

效果,实现了物品拖拽和交换

源码

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

目录
相关文章
|
2月前
|
图形学 开发者 UED
Unity游戏开发必备技巧:深度解析事件系统运用之道,从生命周期回调到自定义事件,打造高效逻辑与流畅交互的全方位指南
【8月更文挑战第31天】在游戏开发中,事件系统是连接游戏逻辑与用户交互的关键。Unity提供了多种机制处理事件,如MonoBehaviour生命周期回调、事件系统组件及自定义事件。本文介绍如何有效利用这些机制,包括创建自定义事件和使用Unity内置事件系统提升游戏体验。通过合理安排代码执行时机,如在Awake、Start等方法中初始化组件,以及使用委托和事件处理复杂逻辑,可以使游戏更加高效且逻辑清晰。掌握这些技巧有助于开发者更好地应对游戏开发挑战。
120 0
|
3月前
|
图形学 C# 开发者
Unity粒子系统全解析:从基础设置到高级编程技巧,教你轻松玩转绚丽多彩的视觉特效,打造震撼游戏画面的终极指南
【8月更文挑战第31天】粒子系统是Unity引擎的强大功能,可创建动态视觉效果,如火焰、爆炸等。本文介绍如何在Unity中使用粒子系统,并提供示例代码。首先创建粒子系统,然后调整Emission、Shape、Color over Lifetime等模块参数,实现所需效果。此外,还可通过C#脚本实现更复杂的粒子效果,增强游戏视觉冲击力和沉浸感。
176 0
|
3月前
|
开发者 图形学 前端开发
绝招放送:彻底解锁Unity UI系统奥秘,五大步骤教你如何缔造令人惊叹的沉浸式游戏体验,从Canvas到动画,一步一个脚印走向大师级UI设计
【8月更文挑战第31天】随着游戏开发技术的进步,UI成为提升游戏体验的关键。本文探讨如何利用Unity的UI系统创建美观且功能丰富的界面,包括Canvas、UI元素及Event System的使用,并通过具体示例代码展示按钮点击事件及淡入淡出动画的实现过程,助力开发者打造沉浸式的游戏体验。
95 0
|
3月前
|
图形学
Unity动画☀️Unity动画系统Bug集合
Unity动画☀️Unity动画系统Bug集合
|
5月前
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
159 2
|
5月前
|
图形学
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统(下)
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统
81 0
|
5月前
|
图形学 容器
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统(上)
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统
80 0
|
3月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
172 6
|
2月前
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
98 4
|
3月前
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
136 5