【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏10(附项目源码)

本节最终效果演示

在这里插入图片描述

文章目录

  • 本节最终效果演示
  • 系列目录
  • 前言
  • 快捷栏
    • 绘制UI
    • 代码控制快捷列表信息
  • 源码
  • 完结

系列目录

前言

欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中,我们将探索如何制作一个类似于七日杀和森林的生存游戏。

本篇内容会比较多,我会分几篇来实现,感兴趣的可以关注一下,以免错过内容更新。

本节主要实现了快捷栏的功能。

快捷栏

绘制UI

绘制快捷栏UI,并且重新绘制背包显示的icon,加入背景用于显示选中效果,记得默认隐藏
在这里插入图片描述
记得修改InventorySystem获取图片Icon的方式,以便可以正确显示物品拾取弹窗信息

//添加物品
public void AddToInventory(string itemName)
{// 。。。TriggerPickupPopUp(itemName, itemToAdd.transform.Find("Icon").GetComponent<Image>().sprite);
}

代码控制快捷列表信息

public class EquipSystem : MonoBehaviour
{public static EquipSystem Instance { get; set; }public GameObject quickSlotsPanel; // 快捷栏面板public List<GameObject> quickSlotsList = new List<GameObject>(); // 快捷栏列表private void Awake(){if (Instance == null){Instance = this;}else{Destroy(gameObject);}}private void Start(){PopulateSlotList(); // 填充快捷栏列表}private void PopulateSlotList(){foreach (Transform child in quickSlotsPanel.transform){if (child.CompareTag("QuickSlot")){quickSlotsList.Add(child.gameObject);}}}public void AddToQuickSlots(GameObject itemToEquip){// 查找下一个可用的快捷栏格子GameObject availableSlot = FindNextEmptySlot();// 将物品放置在该格子内itemToEquip.transform.SetParent(availableSlot.transform, false);InventorySystem.Instance.ReCalculeList(); // 重新计算物品列表CraftingSystem.Instance.RefreshNeededItems(); // 刷新制作系统所需物品列表}//获取空闲的格子private GameObject FindNextEmptySlot(){// 遍历快捷栏列表,查找是否有空闲的格子foreach (GameObject slot in quickSlotsList){if (slot.transform.childCount == 0){return slot;}}// 如果没有空闲的格子,则返回一个新的GameObjectreturn new GameObject();}//判断快捷栏是否已满public bool CheckIfFull(){int counter = 0;// 遍历快捷栏列表,查找是否有空闲的格子foreach (GameObject slot in quickSlotsList){if (slot.transform.childCount > 0){counter ++;}}// 如果遍历完所有格子,都没有空闲的格子,则表示快捷栏已满if (counter == 7){return true;}else{return false;}}
}

挂载代码,配置信息
在这里插入图片描述
修改InventoryItem,实现特定物品才可以拉到快捷栏

[Header("是否已经装备")]
public bool isNowEquipped;// 当鼠标点击物品时触发
public void OnPointerDown(PointerEventData eventData)
{// 。。。//按左shift再点击鼠标左键装备/卸载物品if (Input.GetKey(KeyCode.LeftShift) && eventData.button == PointerEventData.InputButton.Left){// 该物品可装备尚未装备,并且装备栏未满if (isNowEquipped == false && EquipSystem.Instance.CheckIfFull() == false)// if (isEquippable && isNowEquipped == false && EquipSystem.Instance.CheckIfFull() == false){// 将物品添加到快捷栏并标记为已装备EquipSystem.Instance.AddToQuickSlots(gameObject);isNowEquipped = true;}// 该物品可装备已经装备,并且背包未满else if (isNowEquipped == true && InventorySystem.Instance.CheckIfFull() == false){// 将物品添加到背包并标记为未装备InventorySystem.Instance.AddToInventory(gameObject);isNowEquipped = false;}}
}

修改InventorySystem,添加新的新增物品方法

//添加物品
public void AddToInventory(GameObject itemToAdd)
{// 找到下一个空闲的槽位whatSlotToEquip = FindNextEmptySlot();// 将新实例化的物体的父对象设置为whatSlotToEquipitemToAdd.transform.SetParent(whatSlotToEquip.transform, false);// 将物品名称添加到itemList中itemList.Add(itemToAdd.GetComponent<InventoryItem>().thisName);ReCalculeList();CraftingSystem.Instance.RefreshNeededItems();
}

修改ItemSlot,判断放置时是否是快捷栏,修改装备状态

// 当拖拽物体被放置到当前物品槽时
public void OnDrop(PointerEventData eventData)
{if (!Item){// 。。。// 如果当前物品槽不是快捷栏if (transform.CompareTag("QuickSlot") == false){// 标记待装备的物品为未装备状态DragDrop.itemBeingDragged.GetComponent<InventoryItem>().isNowEquipped = false;InventorySystem.Instance.ReCalculeList(); // 重新计算物品列表CraftingSystem.Instance.RefreshNeededItems(); // 刷新制作系统所需物品列表} else {// 标记待装备的物品为装备状态DragDrop.itemBeingDragged.GetComponent<InventoryItem>().isNowEquipped = true;InventorySystem.Instance.ReCalculeList(); // 重新计算物品列表CraftingSystem.Instance.RefreshNeededItems(); // 刷新制作系统所需物品列表}}
}

效果
在这里插入图片描述

源码

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

完结

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

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

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/678141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux开发工具的使用 (gcc/g++ | gdb)

目录 一、gcc/g 1.关于gcc/g 2.gcc如何使用 gcc选项&#xff1a; 预处理&#xff1a; 编译: 汇编: 连接: 函数库是什么&#xff1a; 函数库分为动态库和静态库两种 二、调试器gdb 1.关于gdb 2. gdb的使用 gdb选项&#xff1a; Linux是一个广泛用于开发的操作系统&…

第二节 zookeeper基础应用与实战

目录 1. Zookeeper命令操作 1.1 Zookeeper 数据模型 1.2 Zookeeper服务端常用命令 1.3 Zookeeper客户端常用命令 1.3.1 基本CRUD 1.3.2 创建临时&顺序节点 2. Zookeeper JavaAPI操作 2.1 Curator介绍 2.2 引入Curator 2.3 建立连接 2.4 添加节点 2.5 修改节点 …

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之AlphabetIndexer组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之AlphabetIndexer组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、AlphabetIndexer组件 可以与容器组件联动用于按逻辑结构快速定位容器显…

vue核心技术(二)

◆ 指令补充 指令修饰符 通过 "." 指明一些指令 后缀&#xff0c;不同 后缀 封装了不同的处理操作 → 简化代码 v-bind 对于样式控制的增强 为了方便开发者进行样式控制&#xff0c; Vue 扩展了 v-bind 的语法&#xff0c;可以针对 class 类名 和 style 行内样式…

KAJIMA CORPORATION CONTEST 2024(AtCoder Beginner Contest 340)ABCDEF 视频讲解

这场比较郁闷&#xff0c;C题短路&#xff0c;连续4次WA&#xff0c;导致罚时太多 A - Arithmetic Progression Problem Statement Print an arithmetic sequence with first term A A A, last term B B B, and common difference D D D. You are only given inputs for w…

BootstrapBlazor 模板适配移动设备使用笔记

项目模板 Bootstrap Blazor App 模板 为了方便大家利用这套组件快速搭建项目&#xff0c;作者制作了 项目模板&#xff08;Project Templates&#xff09;&#xff0c;使用 dotnet new 命令行模式&#xff0c;使用步骤如下&#xff1a; 安装项目模板 dotnet new install Boo…

007集——数据存储的端序(大端序和小端序转换代码)——VB/VBA

VB/VBA存储的端序 1、要想制造高性能的VB/VBA代码&#xff0c;离了指针是很难办到的。 2、因为VB/VBA里&#xff0c;用Long来表示指针&#xff0c;而32位(包括64位兼容的)计算机里4字节整数的处理&#xff0c;是最快的方式&#xff01; 3、要想用指针来处理数据&#xff0c;…

fast.ai 深度学习笔记(六)

深度学习 2&#xff1a;第 2 部分第 12 课 原文&#xff1a;medium.com/hiromi_suenaga/deep-learning-2-part-2-lesson-12-215dfbf04a94 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;…

Vue-55、Vue技术vuex模块化

一、代码 1、store.js //改文件用于创建最为核心的store //引入vue import Vue from "vue"; //引入vuex import Vuex from vuex;//求和功能相关的配置 const countOptions{namespaced:true,actions:{jia:function (context,value) {console.log(action中的jia被调…

C语言什么是悬空指针?

一、问题 什么是悬空指针&#xff1f;为什么会出现&#xff1f;我们该如何避免悬空指针的出现&#xff1f; 二、解答 在C语言中&#xff0c;悬空指针指的是指向已删除&#xff08;或释放&#xff09;的内存位置的指针。如果一个指针指向的内存被释放&#xff0c;但指针本身并未…

如何实现视线(目光)的检测与实时跟踪

如何实现视线(目光)的检测与实时跟踪 核心步骤展示说明 找到人脸 检测人脸特征点 根据特征点找到人眼区域 高精度梯度算法检测瞳孔中心 根据眼睛周边特征点计算眼睛中心 瞳孔中心和眼睛中心基于视线模型计算视线方向 视线方向可视化 详细实现与说明&#xff1a; https://stud…

ubuntu20.04 安装mysql(8.x)

安装mysql命令 sudo apt-get install mysql-server安装完毕后&#xff0c;立即初始化密码 sudo mysql -u root # 初次进入终端无需密码ALTER USER rootlocalhost IDENTIFIED WITH caching_sha2_password BY yourpasswd; # 设置本地root密码设置mysql远程登录 设置远程登录账…

Linux目录的 /usr/bin 和 /usr/local/bin 的区别

Linux目录的 /usr/bin 和 /usr/local/bin 的区别 usr 是指 Unix System Resource&#xff0c;而不是User usr 是 Unix System Resource&#xff0c;而不是User /usr/bin下面的都是系统预装的可执行程序&#xff0c;系统升级有可能会被覆盖. /usr/local/bin 目录是给用户放置…

【深度学习】:实验6布置,图像自然语言描述生成(让计算机“看图说话”)

清华大学驭风计划 因为篇幅原因实验答案分开上传&#xff0c;深度学习专栏持续更新中&#xff0c;期待的小伙伴敬请关注 实验答案链接http://t.csdnimg.cn/bA48U 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 案例 6 &#xff1a;图像自…

Hadoop运行环境搭建

模板虚拟机环境准备 1&#xff09;准备一台模板虚拟机hadoop100&#xff0c;虚拟机配置要求如下&#xff1a; 模板虚拟机&#xff1a;内存4G&#xff0c;硬盘50G&#xff0c;安装必要环境&#xff0c;为安装hadoop做准备 [roothadoop100 ~]# yum install -y epel-release [r…

命令行随笔

1、xargs xargs命令是将 前一个命令的标准输出作为后一个命令的命令行参数&#xff0c;xargs的默认命令是echo&#xff0c;默认定界符是空格和回车。 而管道是将 前一个命令的标准输出作为后一个命令的标准输入 echo例子 # echo "apple banana orange" | xargs e…

MySQL篇----第十八篇

系列文章目录 文章目录 系列文章目录前言一、SQL 语言包括哪几部分?每部分都有哪些操作关键二、完整性约束包括哪些?三、什么是锁?四、什么叫视图?游标是什么?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,…

梯度提升树系列8——GBDT与其他集成学习方法的比较

目录 写在开头1. 主要集成学习算法对比1.1 GBDT1.2 随机森林1.3 AdaBoost1.4 整体对比2. 算法性能的比较分析2.1 准确率与性能2.2 训练时间和模型复杂度2.3 应用实例和案例研究3. 选择合适算法的标准3.1 数据集的特性3.1.1 数据规模与维度3.1.2 数据质量3.2 性能需求3.2.1 准确…

Unity报错Currently selected scripting backend (IL2CPP) is not installed

目录 什么是il2cpp il2cpp换mono Unity打包报错Currently selected scripting backend (IL2CPP) is not installed 什么是il2cpp Unity 编辑器模式下是采用.net 虚拟机解释执行.net 代码,发布的时候有两种模式,一种是mono虚拟机模式,一种是il2cpp模式。由于iOS AppStore…

pandas dataframe写入excel的多个sheet页面

pandas根据dataframe生成一个excel文件&#xff1a; Dataframe保存新文件 直接把dataframe格式的数据保存到多个sheet页程序如下&#xff1a; excel_file "导出excel文件.xlsx" if os.path.exists(excel_file):os.remove(excel_file)# 生成一个新文件 with pd.Ex…