【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏6(附项目源码)
本节最终效果演示

文章目录
- 本节最终效果演示
- 系列目录
- 前言
- 生命 食物 水
- 简单绘制UI
- 玩家状态脚本
- 生命值控制
- 饱食度控制
- 水分控制
- 源码
- 完结
系列目录
前言
欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中,我们将探索如何制作一个类似于七日杀和森林的生存游戏。
本篇内容会比较多,我会分几篇来实现,感兴趣的可以关注一下,以免错过内容更新。
本节主要实现了玩家生命 食物 水状态控制的功能。
生命 食物 水
简单绘制UI

玩家状态脚本
public class PlayerState : MonoBehaviour
{public static PlayerState Instance { get; set; } // 单例对象[Header("玩家的健康状态")] public float currentHealth; // 当前生命值public float maxHealth; // 最大生命值[Header("玩家的饱食度状态")]public float currentCalories; // 当前饱食度public float maxCalories; // 最大饱食度[Header("玩家的水分状态")]public float currentHydrationPercent; // 当前水分百分比public float maxHydrationPercent; // 最大水分百分比private void Awake(){if (Instance == null){Instance = this;}else{Destroy(gameObject);}}private void Start(){currentHealth = maxHealth;}
}
挂载脚本,配置参数

生命值控制
新增HealthBar脚本
public class HealthBar : MonoBehaviour
{private Image slider; // 用于显示血条的图片组件public TextMeshProUGUI healthCounter; // 用于显示当前生命值的文本组件private float currentHealth; // 当前生命值private float maxHealth; // 最大生命值void Awake(){slider = GetComponent<Image>();}void Update(){currentHealth = PlayerState.Instance.currentHealth; // 获取当前生命值maxHealth = PlayerState.Instance.maxHealth; // 获取最大生命值float fillValue = currentHealth / maxHealth; // 计算血条的填充值slider.fillAmount = fillValue; // 设置填充的值healthCounter.text = currentHealth + "/" + maxHealth; // 设置生命值文本}
}
挂载脚本,配置参数

运行效果

饱食度控制
修改PlayerState
[Header("玩家的饱食度状态")]
public float currentCalories; // 当前饱食度
public float maxCalories; // 最大饱食度
float distanceTravelled = 0;// 已行进距离
Vector3 lastPosition;// 上一帧位置
public GameObject playerBody;// 玩家角色对象private void Start()
{currentHealth = maxHealth;currentCalories = maxCalories;
}private void Update()
{//根据行进距离扣除饱食度distanceTravelled += Vector3.Distance(playerBody.transform.position, lastPosition); // 计算已行进距离lastPosition = playerBody.transform.position;// 更新上一帧位置if (distanceTravelled >= 5)// 当已行进距离超过5时{distanceTravelled = 0;// 重置已行进距离currentCalories -= 1;// 减少饱食度}
}
配置参数

新增CaloriesBar,控制饱食度状态栏
public class CaloriesBar : MonoBehaviour
{public TextMeshProUGUI caloriesCounter;private Image slider;private float currentCalories;private float maxCalories;void Awake(){slider = GetComponent<Image>();}void Update(){currentCalories = PlayerState.Instance.currentCalories;maxCalories = PlayerState.Instance.maxCalories;float fillValue = currentCalories / maxCalories;slider.fillAmount = fillValue;caloriesCounter.text = currentCalories + "/" + maxCalories;}
}
配置

效果

水分控制
修改PlayerState
[Header("玩家的水分状态")]
public float currentHydrationPercent; // 当前水分百分比
public float maxHydrationPercent; // 最大水分百分比private void Start()
{currentHealth = maxHealth;currentCalories = maxCalories;currentHydrationPercent = maxHydrationPercent;StartCoroutine(decreaseHydration());
}//携程扣水分
IEnumerator decreaseHydration()
{while (true){currentHydrationPercent -= 1;yield return new WaitForSeconds(10f);}
}
新增HydrationBar,控制水分显示
public class HydrationBar : MonoBehaviour
{public TextMeshProUGUI hydrationCounter;private Image slider;private float currentHydration;private float maxHydration;void Awake(){slider = GetComponent<Image>();}void Update(){currentHydration = PlayerState.Instance.currentHydrationPercent;maxHydration = PlayerState.Instance.maxHydrationPercent;float fillValue = currentHydration / maxHydration;slider.fillAmount = fillValue;hydrationCounter.text = currentHydration + "%";}
}
配置

效果

源码
源码不出意外的话我会放在最后一节
完结
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!
好了,我是向宇,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

相关文章:
【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏6(附项目源码)
本节最终效果演示 文章目录 本节最终效果演示系列目录前言生命 食物 水简单绘制UI玩家状态脚本生命值控制饱食度控制水分控制 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中…...
Cache Lab:Part A【模拟出使用LRU策略的高速缓存存储器组织结构】
目录 任务描述 知识回顾 实验内容 测试结果 Cache Lab 对应《CS:APP》6.3节至第六章结束的内容。 任务描述 Your job for Part A is to fill in the csim.c file so that it takes the same command line arguments and produces the identical output as the reference …...
操作系统基础:死锁
🌈个人主页:godspeed_lucip 🔥 系列专栏:OS从基础到进阶 🐦1 死锁的概念🦢1.1 总览🦢1.2 什么是死锁🦢1.3 死锁、饥饿、死循环的区别🐧1.3.1 概念🐧1.3.2 区别…...
Ubuntu server如何使用 Daphne + Nginx + supervisor部署 Django
Django从 3.0版开始加入对ASGI的支持,使Django开始具有异步功能。 截止目前的5.0版,对异步支持逐步也越来越好,相信在未来的版本中异步将会支持的更加完善。 所以说,我们也需要适时的更新我们的技能,学会在asgi异步服务器环境中部署django项目! 在部署之前我们所有的依…...
Android 12.0 应用中监听系统收到的通知
1. 需求 在系统内置应用中或者在第三方应用中,获取Android系统收到的通知的内容. 2. NotificationListenerService 接口 Android 系统预留了专门的API, 即 NotificationListenerService 接口,它的源码路径为: 源码路径 : /frameworks/base/core/java/android/service/notifi…...
SpringBoot+Redis如何实现用户输入错误密码后限制登录(含源码)
点击下载《SpringBootRedis如何实现用户输入错误密码后限制登录(含源码)》 1. 引言 在当今的网络环境中,保障用户账户的安全性是非常重要的。为了防止暴力破解和恶意攻击,我们需要在用户尝试登录失败一定次数后限制其登录。这不…...
kotlin中的初始化问题纪录
1. init 代码块的顺序问题 init代码块和成员变量实质上是按先后顺序执行的。若果init{} 中有成员变量使用。要把成员变量放到代码块之前。 2. init代码块之中的函数问题 下面是一段错误的代码: class mkotlin{val info:Stringinit {getInfoMethod()info "adad…...
Web中的转发与重定向
转发与重定向 一、转发和重定向的概念1.转发2.重定向 二、JavaWeb 中的转发和重定向三、SpringMVC 中的转发和重定向1.转发(1) 默认的方式(2) 完整的方式 2.重定向 四、总结 一、转发和重定向的概念 在 Web 应用中,转发和重定向都是用于将请求从一个页面传递到另一…...
交叉注意力融合时域、频域特征的FFT + CNN-Transformer-CrossAttention轴承故障识别模型
目录 往期精彩内容: 前言 1 快速傅里叶变换FFT原理介绍 第一步,导入部分数据 第二步,故障信号可视化 第三步,故障信号经过FFT可视化 2 轴承故障数据的预处理 2.1 导入数据 2.2 制作数据集和对应标签 3 交叉注意力机制 …...
STM32读取MPU6050数据并通过角度值控制舵机运动(STM32、GY-521 MPU6050、SG90舵机、MG946舵机)
通过STM32F103C8T6读取MPU6050数据控制舵机运动(STM32、GY-521 MPU6050、SG90舵机、MG946舵机) 最终现象一、MPU6050数据读取二、舵机控制原理①什么是PWM?②STM32F103C8T6如何生成PWM?③控制舵机需要什么样的PWM波? 三…...
Unity_Playable工具使用
Unity_Playable工具使用 目录 Unity_Playable工具使用 1. Default Playables(Timeline扩展) 2. PlayableGraph Visualizer&#x...
Flutter canvas 画一条波浪线 进度条
之前用 Flutter Canvas 画过一个三角三角形,html 的 Canvas 也画过一次类似的, 今天用 Flutter Canvas 试了下 感觉差不多: html 版本 大致效果如下: 思路和 html 实现的类似: 也就是找出点的位置,使用二阶…...
Java技术栈 —— Spring MVC 与 Spring Boot
参考文章或视频链接[1] Spring vs. Spring Boot vs. Spring MVC[2] Key Differences Between Spring vs Spring Boot vs Spring MVC...
跟着cherno手搓游戏引擎【16】Camera和Uniform变量的封装
相机封装: OrthographicCamera.h: #pragma once #include <glm/glm.hpp> namespace YOTO {class OrthographicCamera{public:OrthographicCamera(float left,float right , float bottom,float top);const glm::vec3& GetPosition()const { return m_Pos…...
微服务中间件 RabbitMq学习
1、为什么需要Mq 例如在用户注册业务中,用户注册成功后 需要发注册邮件和注册短信,传统的做法有两种 1.串行的方式;2.并行的方式 ; 假设三个业务节点分别使用50ms,串行方式使用时间150ms,并行使用时间10…...
3D Gaussian Splatting-实时辐射场渲染技术
引用自:https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gaussian_splatting_high.pdf 概述: 该论文介绍了一种用于实时辐射场渲染的3D高斯点渲染技术。 其基本原理是: 一:首先从SfM校准的图像及其对应的稀疏点云…...
vue中nextTick()
在 Vue.js 中,nextTick() 是一个非常有用的方法,用于在下一个 DOM 更新循环结束后执行延迟回调。这在你需要读取或写入刚刚更新的 DOM 时非常有用。 下面是一个简单的示例代码,用于解析 nextTick() 的用法: <template> &…...
Redis 布隆过滤器
布隆过滤器 这一篇文章主要是记录布隆过滤器的使用和认识 主要参考了如下的blog https://blog.csdn.net/weixin_42972832/article/details/131211665 他讲的还不错 简单的来说,布隆过滤器,实际上就像是一个集合,拿redis的key来举例来说,布隆过滤器的设置就是去过滤不属于redi…...
中国的茶文化:现代生活中的茶文化
中国的茶文化:现代生活中的茶文化 引言 在现代社会的快节奏生活中,茶文化并未随时间流逝而褪色,反而以其独特的方式融入了全球各地人们的日常生活。它超越了饮品本身的范畴,成为一种连接历史、人文与现代生活方式的艺术形式。本文…...
Python正则表达式语法
正则表达式是一种强大的文本处理工具,它可以用来搜索、匹配和替换特定的字符模式。在Python中,正则表达式常常被用于处理字符串数据,例如文本搜索、数据提取、格式验证等任务。本文将深入介绍Python中正则表达式的语法,帮助读者全…...
小白也能懂:将SPIRAN ART SUMMONER图像生成API封装成IDEA插件
小白也能懂:将SPIRAN ART SUMMONER图像生成API封装成IDEA插件 1. 为什么需要这个插件? 作为一名开发者,我经常遇到这样的场景:正在编写游戏角色设定文档时,突然需要一张概念图;设计UI界面时,想…...
8款实用AI论文生成工具(包括爱毕业aibiye)及新手详细指南
在学术研究领域,AI技术的应用显著提升了论文写作的效率与质量。以下推荐8款功能强大的智能工具,涵盖文献解析、内容生成、文本优化等关键环节,助力研究者高效完成从资料收集到论文润色的全流程工作。这些创新解决方案能够有效简化研究过程&am…...
InfluxDB新手必看:从安装到基本操作的完整指南(Windows版)
InfluxDB Windows实战指南:从零搭建时序数据库系统 时序数据正成为物联网、DevOps和业务监控领域的核心资产。想象一下,您需要每秒处理数千台设备的温度读数,或者分析应用程序每分钟的性能指标——传统关系型数据库在这种高频写入场景下往往…...
如何用Planck-Pi实现低成本嵌入式开发?基于F1C200s的全栈方案解析
如何用Planck-Pi实现低成本嵌入式开发?基于F1C200s的全栈方案解析 【免费下载链接】Planck-Pi Super TINY & Low-cost Linux Develop-Kit Based On F1C200s. 项目地址: https://gitcode.com/gh_mirrors/pl/Planck-Pi Planck-Pi作为一款基于全志F1C200s芯…...
深入浅出MIPI D-PHY:对比HS高速模式与LP低功耗模式,揭秘手机摄像头省电又流畅的底层原理
解密MIPI D-PHY:手机摄像头如何实现高速与低功耗的完美平衡 当你用手机拍摄4K视频时,是否想过为什么画面如此流畅,而电量消耗却相对可控?这背后隐藏着一项关键技术——MIPI D-PHY物理层协议。作为现代移动设备图像传输的核心通道&…...
Keras图像分割模型训练完整指南:从参数配置到性能评估
Keras图像分割模型训练完整指南:从参数配置到性能评估 【免费下载链接】image-segmentation-keras Implementation of Segnet, FCN, UNet , PSPNet and other models in Keras. 项目地址: https://gitcode.com/gh_mirrors/im/image-segmentation-keras 图像分…...
重新定义交通安全研究范式:基于无人机轨迹数据的数字孪生解决方案
重新定义交通安全研究范式:基于无人机轨迹数据的数字孪生解决方案 【免费下载链接】UCF-SST-CitySim1-Dataset 项目地址: https://gitcode.com/gh_mirrors/ucf/UCF-SST-CitySim-Dataset 在自动驾驶技术快速发展的今天,传统交通安全研究面临着一个…...
UE5.0.3打包Linux报错?手把手教你搞定BlueprintJson插件缺失问题
UE5.0.3 Linux打包报错终极指南:BlueprintJson插件问题的深度解析与实战修复 当你满怀期待地在UE5.0.3中点击"打包Linux"按钮,却看到屏幕上弹出关于BlueprintJson插件的红色错误信息时,那种挫败感我深有体会。作为一名经历过无数次…...
3个核心模块揭秘:Python量化投资如何免费获取通达信专业数据
3个核心模块揭秘:Python量化投资如何免费获取通达信专业数据 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 你是否在量化投资中为数据获取而烦恼?商业接口太贵,…...
零基础如何用罗技鼠标宏实现绝地求生自动压枪?高效配置指南
零基础如何用罗技鼠标宏实现绝地求生自动压枪?高效配置指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 你是否在《绝地求生》中因…...
