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

本节最终效果演示

在这里插入图片描述

文章目录

  • 本节最终效果演示
  • 系列目录
  • 前言
  • 源码
  • 制作系统
    • 简单绘制制作系统面板UI
    • 斧头素材
    • 代码控制工具栏操作
    • 制作石斧
  • 完结

系列目录

前言

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

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

本节主要实现了一个制作系统,并完成一个制作出石斧的功能。

源码

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

制作系统

简单绘制制作系统面板UI

在这里插入图片描述
在这里插入图片描述

斧头素材

https://sketchfab.com/3d-models/stone-axe-3b634530c2f54128a150f723b6822d7b
在这里插入图片描述

代码控制工具栏操作

新增CraftingSystem,控制控制工具栏

public class CraftingSystem : MonoBehaviour
{public GameObject craftingScreenUl; // 制作界面UI对象public GameObject toolsScreenUl; // 工具界面UI对象// 工具按钮Button toolsBTN;[HideInInspector]public bool isOpen; // 是否打开制作系统界面// 所有的蓝图public static CraftingSystem Instance { get; set; }private void Awake(){if (Instance == null){Instance = this;}else{Destroy(gameObject);}}void Start(){isOpen = false;toolsBTN = craftingScreenUl.transform.Find("背景").Find("工具按钮").GetComponent<Button>();toolsBTN.onClick.AddListener(delegate { OpenToolsCategory(); });}void OpenToolsCategory(){craftingScreenUl.SetActive(false); // 关闭制作界面toolsScreenUl.SetActive(true); // 打开工具界面}void Update(){if (Input.GetKeyDown(KeyCode.I)){// 打开关闭制作界面craftingScreenUl.SetActive(!isOpen);if (isOpen) toolsScreenUl.SetActive(false); // 关闭工具界面isOpen = !isOpen;// 设置鼠标锁定模式为无锁定,允许鼠标在界面上移动Cursor.lockState = (isOpen ||  InventorySystem.Instance.isOpen) ? CursorLockMode.None : CursorLockMode.Locked;}}
}

修改MouseLook,控制相机视角

void FreeLook()
{if(InventorySystem.Instance.isOpen || CraftingSystem.Instance.isOpen) return;//。。。
}

挂载代码,配置
在这里插入图片描述
效果
在这里插入图片描述

制作石斧

新增Blueprint,定义制作蓝图

public class Blueprint
{public string itemName; // 蓝图对应的物品名称public string Req1; // 需求1的物品名称public string Req2; // 需求2的物品名称public int Req1amount; // 需求1的数量public int Req2amount; // 需求2的数量public int numOfRequirements; // 需求的总数// 构造函数public Blueprint(string name, int reqNUM, string R1, int R1num, string R2, int R2num){itemName = name; // 设置蓝图对应的物品名称numOfRequirements = reqNUM; // 设置需求的总数Req1 = R1; // 设置需求1的物品名称Req1amount = R1num; // 设置需求1的数量Req2 = R2; // 设置需求2的物品名称Req2amount = R2num; // 设置需求2的数量}
}

修改InventorySystem,实现删除物品 更新库存列表功能

//添加物品
public void AddToInventory(string itemName)
{//...ReCalculeList();CraftingSystem.Instance.RefreshNeededItems();
}//删除物品
public void RemoveItem(string nameToRemove, int amountToRemove)
{int counter = amountToRemove; // 计数器,表示还需要删除的数量for (var i = slotList.Count - 1; i >= 0; i--) // 倒序遍历所有物品槽{if (slotList[i].transform.childCount > 0) // 如果该槽有物品{if (slotList[i].transform.GetChild(0).name == nameToRemove + "(Clone)" && counter != 0) // 如果该物品名称匹配且还需要删除的数量不为 0{Destroy(slotList[i].transform.GetChild(0).gameObject); // 删除该物品counter -= 1; // 计数器减 1}}}ReCalculeList();CraftingSystem.Instance.RefreshNeededItems();
}//更新库存列表
public void ReCalculeList()
{itemList.Clear(); // 清空物品清单foreach (GameObject slot in slotList) // 遍历所有的物品槽{if (slot.transform.childCount > 0) // 如果该槽有物品{string name = slot.transform.GetChild(0).name; // 获取物品名称,例如 "Stone (Clone)"string str2 = "(Clone)";string result = name.Replace(str2, ""); // 去掉后缀 "(Clone)",例如 "Stone"itemList.Add(result); // 将物品名称添加到物品清单列表中}}
}

修改CraftingSystem

public Blueprint AxeBLP = new Blueprint("石斧", 2, "小石头", 2, "树枝", 2);//石斧制作蓝图void Start()
{isOpen = false;toolsBTN = craftingScreenUl.transform.Find("背景").Find("工具按钮").GetComponent<Button>();toolsBTN.onClick.AddListener(delegate { OpenToolsCategory(); });//斧头AxeReq1 = toolsScreenUl.transform.Find("背景").Find("内容").Find("斧头").Find("材料1").GetComponent<TextMeshProUGUI>();AxeReq2 = toolsScreenUl.transform.Find("背景").Find("内容").Find("斧头").Find("材料2").GetComponent<TextMeshProUGUI>();craftAxeBTN = toolsScreenUl.transform.Find("背景").Find("内容").Find("斧头").Find("制作按钮").GetComponent<Button>();craftAxeBTN.onClick.AddListener(delegate { CraftAnyltem(AxeBLP); });
}//制作事件
void CraftAnyltem(Blueprint blueprintToCraft)
{InventorySystem.Instance.AddToInventory(blueprintToCraft.itemName);//按需求的总数,删除对应的物品if (blueprintToCraft.numOfRequirements == 1){InventorySystem.Instance.RemoveItem(blueprintToCraft.Req1, blueprintToCraft.Req1amount);}else if (blueprintToCraft.numOfRequirements == 2){InventorySystem.Instance.RemoveItem(blueprintToCraft.Req1, blueprintToCraft.Req1amount);InventorySystem.Instance.RemoveItem(blueprintToCraft.Req2, blueprintToCraft.Req2amount);}
}//刷新需要的物品
private void RefreshNeededItems()
{int stone_count = 0; // 石头数量int stick_count = 0; // 树枝数量inventoryltemList = InventorySystem.Instance.itemList; // 获取物品清单foreach (string itemName in inventoryltemList) // 遍历物品清单{switch (itemName){case "小石头":stone_count += 1; // 统计石头数量break;case "树枝":stick_count += 1; // 统计树枝数量break;}}// 更新需求文本AxeReq1.text = "2 石头 [" + stone_count + "]"; // 显示需要的石头数量AxeReq2.text = "2 树枝 [" + stick_count + "]"; // 显示需要的树枝数量if (stone_count >= 2 && stick_count >= 2){craftAxeBTN.gameObject.SetActive(true); // 激活制作斧头按钮}else{craftAxeBTN.gameObject.SetActive(false); // 禁用制作斧头按钮}
}

效果
在这里插入图片描述

完结

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

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

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

在这里插入图片描述

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

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

相关文章

C#用DateTime.Now.ToString方法将日期格式化为指定格式

目录 一、DateTime.Now.ToString方法 二、实例 一、DateTime.Now.ToString方法 调用DateTime对象的ToString方法可以将当前DateTime对象的值转换为其等效的字符串表示形式&#xff0c;而且ToString方法提供了重载&#xff0c;可以在ToString方法中添加不同的参数&#xff0c;…

JAVA编程语言单词汇总

Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James Gosling和同事们共同研发&#xff0c;并在 1995 年正式推出。后来 Sun 公司被 Oracle &#xff08;甲骨文&#xff09;公司收购&#xff0c;Java 也随之成为 Ora…

Android 基础技术——Bitmap

笔者希望做一个系列&#xff0c;整理 Android 基础技术&#xff0c;本章是关于 Bitmap Bitmap 内存如何计算 占用内存 宽 * 缩放比例 * 高 * 缩放比例 * 每个像素所占字节 缩放比例 设备dpi/图片所在目录的dpi Bitmap加载优化&#xff1f;不改变图片质量的情况下怎么优化&am…

【一竞技DOTA2】Blacklist战队官宣租借Palos参加ESL伯明翰预选赛

1、Blacklist战队官宣租借Palos参加ESL伯明翰站最终预选赛。Palos自2022年2月份以来一直效力于同为东南亚赛区的Execration战队&#xff0c;这次租借是替补前不久刚刚离队的Raven。 2、俄罗斯未来运动会最近官宣nouns战队因故退出。另外还有Neon、Nigma&#xff0c;Entity&…

vue 和 react技术选型

相同点&#xff1a; 数据驱动页面&#xff0c;提供响应式的试图组件都有virtual DOM,组件化的开发&#xff0c;通过props参数进行父子之间组件传递数据&#xff0c;都实现了webComponents规范数据流动单向&#xff0c;都支持服务器的渲染SSR都有支持native的方法&#xff0c;r…

【Linux】第三十九站:可重入函数、volatile、SIGCHLD信号

文章目录 一、可重入函数二、volatile三、SIGCHLD信号 一、可重入函数 如下图所示&#xff0c;当我们进行链表的头插的时候&#xff0c;我们刚刚执行完第一条语句的时候&#xff0c;突然收到一个信号&#xff0c;然后我们这个信号的自定义捕捉方法中&#xff0c;正好还有一个头…

Compose | UI组件(九) | Column,Row - 线性布局

文章目录 前言Column 的含义Column 的使用给 Column 加边框Column 使用 verticalArrangement 定位子项位置Column 使用 horizontalAlignment 定位子组件位置Column 设置了大小&#xff0c;可使用Modifier.align修饰符设置子组件对齐方式 Row 的含义Row 的使用 总结 前言 传统的…

“值得一试的六个浏览器扩展推荐|让你的上网更加便捷和有趣!”

iTab新标签页(免费ChatGPT) iTab是新一代组件式标签页的首创者&#xff0c;简洁美观高效无广&#xff0c;是您打造个人学习工作台的浏览器必备插件。 详情请见&#xff1a; iTab新标签页(免费ChatGPT) - Microsoft Edge Addons AdGuard 广告拦截器 AdGuard 广告拦截器可有效的…

vueRouter中scrollBehavior实现滚动固定位置

使用前端路由&#xff0c;当切换到新路由时&#xff0c;想要页面滚到顶部&#xff0c;或者是保持原先的滚动位置&#xff0c;就像重新加载页面那样。 vue-router 能做到&#xff0c;而且更好&#xff0c;它让你可以自定义路由切换时页面如何滚动。 注意: 这个功能只在 HTML5 h…

GD32移植FreeRTOS+CLI过程记录

背景 之前我只在STM32F0上基于HAL库和CubeMX移植FreeRTOS&#xff0c;但最近发现国产化替代热潮正盛&#xff0c;许多项目都有国产化器件指标&#xff0c;而且国产单片机确实比意法的便宜&#xff0c;所以也买了块兆易创新的GD32F303开发板&#xff0c;试一试它的优劣。虽然GD…

详细PyTorch安装步骤

PyTorch的安装步骤可以参考以下教程&#xff1a; 安装Anaconda&#xff1a;首先需要安装Anaconda&#xff0c;这是一个Python发行版&#xff0c;包含了Python、pip、conda等常用工具。可以从Anaconda官网下载并安装最新版本的Anaconda。 创建虚拟环境&#xff1a;Anaconda中可…

【Web前端实操17】导航栏效果——滑动门

滑动门 定义: 类似于这种: 滑到导航栏的某一项就会出现相应的画面,里面有对应的画面出现。 箭头图标操作和引用: 像一些图标,如果需要的话,可以找字体图标,比如阿里巴巴矢量图标库:iconfont-阿里巴巴矢量图标库 选择一个——>添加至购物车——>下载代码 因…

Facebook的智能时代:AI技术在社交中的崛起

随着科技的快速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经深刻改变了我们的生活方方面面&#xff0c;而社交媒体领域也不例外。在这个信息爆炸的时代&#xff0c;Facebook正以令人瞩目的速度推动着AI技术在社交领域的崛起。本文将深入探讨Facebook如何在智能…

物化视图(Materialized view)详解

什么是物化视图 物化视图&#xff08;Materialized View&#xff09;是一种预先计算和存储的查询结果&#xff0c;类似于数据库中的表。与普通视图不同&#xff0c;物化视图在创建时会将查询的结果物理存储在内存或磁盘上&#xff0c;而不是在查询时动态计算。 物化视图与视图…

STM32控制DS18B20温度传感器获取温度

时间记录&#xff1a;2024/1/28 一、DS18B20温度传感器介绍 &#xff08;1&#xff09;测温范围-55℃~125℃&#xff0c;在-10℃到85℃范围内误差为0.4 &#xff08;2&#xff09;返回的温度数据为16位二进制数据 &#xff08;3&#xff09;STM32和DS18B20通信使用单总线协议…

Nginx解析漏洞复现

首先这个漏洞不是软件或代码的问题&#xff0c;是认为疏忽造成的。 一、环境搭建 从vulhub上面下载vulhub-master.zip文件&#xff0c;上传到服务器中&#xff0c;或者直接在服务器下载。 unzip vulhub-master.zip 进入漏洞目录 cd /vulhub-master/vulhub-master/nginx/ng…

【electron】打包问题处理

目录 项目无法在win7执行场景尝试处理 项目无法在win7执行 场景 使用electron25.0.1、electron-builder24.2.1&#xff0c;打出来的项目在win7系统上跑不起来&#xff0c;报错无法定位程序输入点DiscardVirtualMemoty于动态链接库KERNEL32.dll上。 尝试处理 通过百度发现ele…

高分文献解读|乳酸通过与可溶性腺苷酸环化酶结合调控铁代谢

乳酸(LA)的过量产生可能发生在运动期间或者许多疾病中&#xff0c;例如癌症中。个人伴有高乳酸血症的患者常表现为贫血、血清铁减少以及一种铁代谢关键调控因子—铁调素&#xff08;hepcidin&#xff09;升高。然而&#xff0c;目前尚不清楚乳酸是否以及如何调节铁调素的表达。…

微服务舞台上的“三步曲“:Spring Cloud 服务注册、服务发现与服务调用

在当今软件开发的舞台上&#xff0c;微服务架构已然成为引领潮流的主角。而在这场微服务的大戏中&#xff0c;Spring Cloud 以其强大的工具集成为关键演员&#xff0c;为我们呈现了一个完美的"三步曲"&#xff1a;服务注册、服务发现与服务调用。 第一步&#xff1a…

算法39:统计全 1 子矩形(力扣1504)----单调栈

题目: 给你一个 m x n 的二进制矩阵 mat &#xff0c;请你返回有多少个 子矩形 的元素全部都是 1 。 示例 1&#xff1a; 输入&#xff1a;mat [[1,0,1],[1,1,0],[1,1,0]] 输出&#xff1a;13 解释&#xff1a; 有 6 个 1x1 的矩形。 有 2 个 1x2 的矩形。 有 3 个 2x1 的矩…