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

本文主要是介绍【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱10(附带项目源码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

效果演示

在这里插入图片描述

文章目录

  • 效果演示
  • 系列目录
  • 前言
  • 战利品箱子
  • 源码
  • 完结

系列目录

前言

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

战利品箱子

新增LootTable ,配置战利品表信息

//战利品表
[CreateAssetMenu(fileName = "ChestLootTable", menuName = "Inventory/ChestLootTable")]
public class LootTable : ScriptableObject
{public List<LootItem> lootItems = new List<LootItem>(); // 掉落物品列表[Range(0, 100)] public int spawnChancePerSlot = 20; // 单个槽位生成物品的概率// 初始化掉落物品列表,计算总生成概率并进行归一化public void InitialiseLootTable(){float totalSpawnChance = CalculateTotalSpawnChance();if (totalSpawnChance > 100f){NormaliseSpawnChances();}}// 归一化生成概率,使其总和为 100%private void NormaliseSpawnChances(){float normalisationFactor = 100f / CalculateTotalSpawnChance();foreach (LootItem item in lootItems){item.spawnChance *= normalisationFactor;}}// 计算总生成概率private float CalculateTotalSpawnChance(){float totalSpawnChance = 0f;foreach (LootItem item in lootItems){totalSpawnChance += item.spawnChance;}return totalSpawnChance;}// 在宝箱内生成物品public void SpawnLoot(List<Slot> allChestSlots){foreach (Slot chestSlot in allChestSlots){if (Random.Range(0f, 100f) <= spawnChancePerSlot){SpawnRandomItem(chestSlot);}}}// 在指定槽位内生成随机物品private void SpawnRandomItem(Slot slot){LootItem chosenItem = ChooseRandomItem();if (chosenItem != null){int spawnCount = Random.Range(chosenItem.minSpawn, chosenItem.maxSpawn + 1);GameObject spawnedItem = Instantiate(chosenItem.itemPrefab, Vector3.zero, Quaternion.identity);spawnedItem.SetActive(false);Item itemComponent = spawnedItem.GetComponent<Item>();if (itemComponent != null){itemComponent.currentQuantity = spawnCount;}slot.setItem(itemComponent);// slot.updateData();}}// 随机选择一个物品private LootItem ChooseRandomItem(){float randomValue = Random.Range(0f, 100f);float cumulativeChance = 0f;foreach (LootItem item in lootItems){cumulativeChance += item.spawnChance;if (randomValue <= cumulativeChance){return item;}}return null;}
}[System.Serializable]
// 掉落物品信息类
public class LootItem
{public GameObject itemPrefab; // 物品预制体public int minSpawn; // 最小生成数量public int maxSpawn; // 最大生成数量[Range(0, 100)] public float spawnChance; // 生成概率
}

配置信息
在这里插入图片描述

修改Chest

[Header("战利品")]
[SerializeField] private bool randomLoot;
[SerializeField] private LootTable lootTable;private void Start()
{//...if(randomLoot){lootTable.InitialiseLootTable();lootTable.SpawnLoot(allChestSlots);}else{Inventory.Instance.allInventorySlots.AddRange(allChestSlots);}
}

修改Inventory

// 打开宝箱时的操作
private void openChest(Chest chest)
{//。。。//如果是战利品宝箱if (chest.randomLoot) allInventorySlots.AddRange(chestSloats);// 将宝箱内的所有槽位临时添加到玩家背包槽位列表中
}//去除战利品宝箱数据
public List<Slot> GetAllInventorySlots()
{List<Slot> newAllInventorySlots = allInventorySlots;if (chest && chest.randomLoot){foreach (Slot chestSloat in chestSloats){newAllInventorySlots.Remove(chestSloat);}}return newAllInventorySlots;
}//开关背包
private void toggleInventory(bool enable)
{//关闭背包时,隐藏信息框if (!enable) itemHoverInformation.gameObject.SetActive(false);//关闭背包时,关闭所有鼠标悬停在该槽位上的标志if (!enable){foreach (Slot curSlot in allInventorySlots){curSlot.hovered = false;}}//关闭背包时,清除所有的宝箱数据if (!enable && chestSlotParent != null){allInventorySlots = GetAllInventorySlots();chestSlotParent.SetActive(false);chestSlotParent = null;chestSloats = null;chest = null;}inventory.SetActive(enable); // 根据参数显示或隐藏背包界面Cursor.lockState = enable ? CursorLockMode.None : CursorLockMode.Locked; // 根据背包界面的状态锁定或解锁鼠标指针Cursor.visible = enable; // 设置鼠标指针的可见性// 禁用或启用相机的旋转控制Camera.main.GetComponent<MouseLook>().enabled = !enable;
}

修改SaveInventory,不保存战利品宝箱数据

// 保存物品数据
private void saveInventory()
{List<Slot> allInventorySlots = Inventory.Instance.GetAllInventorySlots();//。。。
}// 加载物品数据
private void loadInventory()
{List<Slot> allInventorySlots = Inventory.Instance.GetAllInventorySlots();//。。。
}

在这里插入图片描述

效果
在这里插入图片描述

源码

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

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

在这里插入图片描述

这篇关于【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱10(附带项目源码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/720749

相关文章

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

python中os.stat().st_size、os.path.getsize()获取文件大小

《python中os.stat().st_size、os.path.getsize()获取文件大小》本文介绍了使用os.stat()和os.path.getsize()函数获取文件大小,文中通过示例代... 目录一、os.stat().st_size二、os.path.getsize()三、函数封装一、os

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne