【制作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&…

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

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

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

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

GD32移植FreeRTOS+CLI过程记录

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

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

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

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

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

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;目前尚不清楚乳酸是否以及如何调节铁调素的表达。…

算法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 的矩…

ERP定制费用怎么算?详解跨境电商成本控制策略

在全球化数字经济的浪潮中&#xff0c;跨境电商行业具有潜在的高利润和巨大的发展空间&#xff0c;吸引着众多创业者的关注和投入。然而&#xff0c;与潜在利润相伴随的是种种挑战&#xff0c;成本控制便是其中关键的一环。在这一行业中&#xff0c;ERP定制费用作为一个重要的成…

第十三章认识Ajax(四)

认识FormData对象 FormData对象用于创建一个表示HTML表单数据的键值对集合。 它可以用于发送AJAX请求或通过XMLHttpRequest发送表单数据。 以下是FormData对象的一些作用&#xff1a; 收集表单数据&#xff1a;通过将FormData对象与表单元素关联&#xff0c;可以方便地收集表…

C++笔记之RTTI、RAII、MVC、MVVM、SOLID在C++中的表现

C++笔记之RTTI、RAII、MVC、MVVM、SOLID在C++中的表现 —— 杭州 2024-01-28 code review! 文章目录 C++笔记之RTTI、RAII、MVC、MVVM、SOLID在C++中的表现1.RTTI、RAII、MVC、MVVM、SOLID简述2.RAII (Resource Acquisition Is Initialization)3.RTTI (Run-Time Type Informat…

Springboot响应数据详解

功能接口 Controller下每一个暴露在外的方法都是一个功能接口 功能接口的请求路径是RequestMapping定义的路径&#xff0c;浏览器需要请求该功能则需要发出该路径下的请求。 RestController RestControllerControllerResponseBody(响应数据的注解) ResponseBody 类型&#…

【数据分析】numpy基础第二天

文章目录 前言数组的形状变换reshape的基本介绍使用reshapereshape([10, 1])运行结果reshape自动判断形状reshape([-1, 1])运行结果 合并数组使用vstack和hstackvstack和hstack的运行结果使用concatenateconcatenate运行结果 分割数组array_split运行结果 数组的条件筛选条件筛…

Matlab|【完全复现】基于价值认同的需求侧电能共享分布式交易策略

目录 1 主要内容 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序完全复现《基于价值认同的需求侧电能共享分布式交易策略》&#xff0c;针对电能共享市场的交易机制进行研究&#xff0c;提出了基于价值认同的需求侧电能共享分布式交易策略&#xff0c;旨在降低电力市…