当前位置: 首页 > news >正文

Unity3D学习FPS游戏(13)玩家血量控制

玩家血量控制

  • 血条UI
    • 玩家Canvas下的Slider
    • 血量逻辑控制
  • 子弹攻击掉血
    • 子弹发射者的区分
    • 玩家受伤逻辑
    • 子弹碰撞检测
  • 效果

血条UI

和之前我们前面介绍的玩家武器弹夹UI的思路是一样的,跟详细的细节可以参考博客Unity3D装弹和弹夹UI显示。

玩家Canvas下的Slider

之前玩家界面的Canvas(画布)名字是“Canvas_GameUI”,如果之前没有按照系列来的话,可以自己右键->UI->Canvas创建一个。

在Canvas_GameUI下面,右键->UI->Slider,创建一个滑动条。重命名Slider为“HPSlider”,方便阅读和项目管理。

对Slider进行简化,把Handle Slider Area删了,滑动条末尾小球用不上。把Fill Area中的Fill拖到和Backgroud平级,Fill Area作用不大可以删掉只是更好约束了Fill的strech。
在这里插入图片描述
调整Fill和Background都为上下左右全伸展。
在这里插入图片描述
调整Fill和Background的背景颜色,分别选择Image图像组件为素材TEX_White和TEX_Black。然后调整Fill的Image图像组件颜色为红色。
在这里插入图片描述
让血条常驻左下角,通过修改属性中的锚点为左下角,并调整到合适的位置和合适的位置。可以参考弹夹UI的位置坐标和大小,做一个对称的效果。
在这里插入图片描述
血量UI就做好了。

血量逻辑控制

打开PlayerController 的代码,添加如下变量。

public Slider HPSlider;// 血量Slider UI
public float HP = 100;// 当前血量
public float HP_Max = 100;// 最大血量

在Start函数的时候进行一些HPSlider的初始化工作。

void Start()
{if (HPSlider){HPSlider.maxValue = HP_Max;HPSlider.value = HP;}
}

保存代码回到Unity中,把HPSlider拖到代码上。

子弹攻击掉血

之前我们写过敌人攻击玩家的逻辑,但是并没有给子弹附加让玩家掉血的效果。
之前子弹的逻辑是生成之后,碰撞到的物体如果是敌人就让敌人掉血。

现在开始子弹除了要区别碰撞到的是敌人和玩家,还要判断子弹是谁发射出来的。
玩家发出子弹对敌人才有用,敌人发出的子弹对玩家才有用。

子弹发射者的区分

BulletController文件中,在Class外面添加一个枚举类型enume,记录子弹发出者。
设置为publice,这样别的代码也能调用。

// 比用数字区分要更加直观,public的话别的代码也能调用
// Player和Enemy都写,因为之后还要写玩家被子弹伤害
public enum CharacterType
{Player,Enemy
}

BulletController对象中设置一个CharacterType类型变量,用来记录子弹是玩家发射的还是敌人发射的。

在玩家发射子弹和敌人发射子弹的时候,给子弹设置对应的CharacterType,用来记录发射者是什么类型。
WeaponController:

GameObject CreateBullet()
{GameObject obj = Instantiate(bullet, shootPoint);obj.GetComponent<BulletController>().characterType = CharacterType.Player;// characterType赋值obj.GetComponent<BulletController>().bulletPool = bulletPool;return obj;
}

EnemyWeaponController:

GameObject CreateBullet()
{GameObject obj = Instantiate(bullet, shootPoint);obj.GetComponent<BulletController>().characterType = CharacterType.Enemy;// characterType赋值obj.GetComponent<BulletController>().bulletPool = bulletPool;return obj;
}

玩家受伤逻辑

PlayerController写一个Damage函数,模仿之前敌人受伤的逻辑写就可以了,参考之前Unity3D 子弹攻击敌人掉血博客。

单独写一个Damage函数是为了方便子弹碰撞检测调用用的。

Damage函数逻辑如下,每次受伤之后让HP减少即可,暂时先不考虑HP为0后怎么办,这个涉及到游戏管理,也就Game Over,后面会补充的。目前暂时HP为0后,HP条就不变化了。

思路为,每次受伤之后让HP减少,减少为0后不变化。
PlayerController:

public void Damage(float damage)
{if (HP > 0){HP -= damage;if (HPSlider)HPSlider.value = HP;}
}

子弹碰撞检测

子弹碰撞检测时候识别一下发出者和碰撞对象。
发出者是玩家,碰撞对象是敌人,就让敌人掉血,子弹销毁;
发出者是敌人,碰撞对象是玩家,就让玩家掉血,子弹销毁。

private void OnCollisionEnter(Collision collision)
{if (collision.gameObject.CompareTag("Enemy")){if (characterType == CharacterType.Player){collision.gameObject.GetComponent<EnemyController>().Damage(attackNum);Destroy(this.gameObject);}}else if (collision.gameObject.CompareTag("Player")){if (characterType == CharacterType.Enemy){collision.gameObject.GetComponent<PlayerController>().Damage(attackNum);Destroy(this.gameObject);}}else{Destroy(this.gameObject);}
}

效果

在这里插入图片描述

相关文章:

Unity3D学习FPS游戏(13)玩家血量控制

玩家血量控制 血条UI玩家Canvas下的Slider血量逻辑控制 子弹攻击掉血子弹发射者的区分玩家受伤逻辑子弹碰撞检测 效果 血条UI 和之前我们前面介绍的玩家武器弹夹UI的思路是一样的&#xff0c;跟详细的细节可以参考博客Unity3D装弹和弹夹UI显示。 玩家Canvas下的Slider 之前玩…...

TDesign:Switch开关

Switch 开关 文档地址 view TDSwitch(isOn: controller.isDefault, // 默认是否开启状态trackOnColor: AppColors.mainColor,onChanged: ((bool value){controller.onTapSwitch(value);return value;}), ),controller bool isDefault true; // 是否默认 void onTapSwitch(bool…...

AI在SEO中的应用与关键词优化探讨

内容概要 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术为搜索引擎优化&#xff08;SEO&#xff09;带来了革命性的改变。传统的SEO主要依赖于人为的经验和判断&#xff0c;而AI则通过算法分析海量数据&#xff0c;提供更加精准和高效的方式优化关键词…...

[docker中首次配置git环境与时间同步问题]

11月没写东西&#xff0c;12月初赶紧水一篇。 刚开始搭建docker服务器时&#xff0c;网上找一堆指令配置好git后&#xff0c;再次新建容器后忘记怎么配了&#xff0c;&#xff0c;这次记录下。 一、git ssh指令法&#xff0c;该方法不用每次提交时输入密码 前期准备&#xff0…...

使用lumerical脚本语言创建绘制波导并进行数据分析(纯代码实现)(1)

使用lumerical脚本语言创建绘制波导、配置二维模式求解器、计算模式轮廓、计算有效折射率(neff)和群折射率(ng)随波长的变化关系、计算有效折射率(neff)随波导宽度的变化关系及针对有效折射率法进行相关数据处理(代码均有注释详解)。 一、绘制波导结构 1.1 代码实现 w…...

redis.conf

tracking-table-max-keys tracking-table-max-keys 是 Redis 中的一个配置选项&#xff0c;它与 Key Tracking 功能有关。Key Tracking 是 Redis 6.0 引入的一项功能&#xff0c;用于追踪哪些键在被客户端操作时发生了变化。 tracking-table-max-keys 的作用&#xff1a; 该配置…...

泷羽sec学习打卡-shell命令8

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于shell的那些事儿-shell8 until循环(直到为止)case语句func函数定义实践是检验真理的唯一标准 别问&…...

割草机器人架构设计和技术应用

题目&#xff1a;割草机器人项目的系统架构设计与技术应用 摘要&#xff1a; 随着智能家居和自动化技术的发展&#xff0c;割草机器人作为一种便捷的园艺工具逐渐进入市场。本论文以我参与管理和开发的割草机器人项目为例&#xff0c;详细阐述了项目中采用的关键技术、系统架…...

基于SSM闪光点映像摄影工作室预约系统JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…...

Windows 和 Linux 系统命令行操作详解:从文件管理到进程监控

1.切换盘符与目录操作 在命令行中&#xff0c;切换盘符和目录是最常见的操作。尽管 DOS 和 Linux 在这些操作上有所不同&#xff0c;但它们都能实现相似的功能。 (1)切换盘符 ①DOS命令&#xff1a;在 DOS 中&#xff0c;切换盘符非常简单&#xff0c;使用 盘符名:&#xff…...

【Calibre-Web】Calibre-Web服务器安装详细步骤(个人搭建自用的电子书网站,docker-compose安装)

文章目录 一、Calibre-Web和Calibre的区别是什么&#xff1f;使用场景分别是什么&#xff1f;二、服务器安装docker和docker-compose三、服务器安装Calibre-Web步骤1、安装完成后的目录结构2、安装步骤3、初始配置4、启动上传 四、安装Calibre五、docker-compose常用命令六、客…...

服务器数据恢复—服务器raid0阵列硬盘指示灯显示黄颜色的数据恢复案例

服务器数据恢复环境&故障情况&#xff1a; 某品牌服务器上有一组由两块SAS硬盘组建的raid0阵列&#xff0c;上层是windows server操作系统ntfs文件系统。服务器上一个硬盘指示灯显示黄颜色&#xff0c;该指示灯对应的硬盘离线&#xff0c;raid不可用。 服务器数据恢复过程…...

.nii.gz文件读取方式

".nii.gz"文件的介绍: ".nii.gz"文件是一种常见的用于存储神经影像数据的格式&#xff0c;它通常包含了三维或四维的图像体素数据&#xff0c;以及与磁共振扫描相关的一些重要元数据&#xff0c;比如扫描参数、特征描述等等。而".nii"表示未经压…...

Kube-Prometheus-Stack安装时初始化导入自定义Grafana dashboards

获取Grafana dashboards的JSON文件 这里是获取已经编辑好的Grafana dashboards的JSON文件&#xff1b;以便内置到Kube-Prometheus-Stack的helm charts的安装zip文件中。 编辑自定义dashboards JSON文件 获取dashboards JSON文件模板 其实Kube-Prometheus-Stack内部本身已经内…...

【SNIP】《An Analysis of Scale Invariance in Object Detection – SNIP》

CVPR-2018 Singh B, Davis L S. An analysis of scale invariance in object detection snip[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2018: 3578-3587. https://github.com/bharatsingh430/snip?tabreadme-ov-file 文章目录 …...

JAVA基础学习笔记_异常

文章目录 异常异常的作用处理异常的方式异常中的常见方法捕获异常自定义异常 异常 应该知道出了异常怎么处理 java.lang.Throwable Error(错误,硬件出错或内存不足,不是程序员能解决的) Exception(异常) RuntimeException(运行时异常),代码出错导致程序出现的问题 其他异…...

Modern Effective C++条款三十四:考虑lambda而非std::bind

C11中的std::bind是C98的std::bind1st和std::bind2nd的后续&#xff0c;C11 lambda几乎总是比std::bind更好的选择。 从C14开始&#xff0c;lambda的作用不仅强大&#xff0c;而且是完全值得使用的。与item32中一样&#xff0c;我们将从std::bind返回的函数对象称为bind对象(bi…...

lyapunov指数的绘制

有如下方程&#xff1a; %% 方程式 % x(n1)1y(n)-a*x(n)^2 % y(n1)b*x(n)绘制其对应的lyapunov指数。 MATLAB实现方式&#xff1a; clc; clearvars; close all;%% 方程式 % x(n1)1y(n)-a*x(n)^2 % y(n1)b*x(n)%% 代码 N 1000; a (0:0.001:1.4); b 0.3; na length(a…...

Ansible 运维工具

安装 apt install ansible /etc/ansible/hosts , 指定密码或密钥访问分组机器 [k8s_masters] master0.c0.k8s.sb[k8s_nodes] node0.c0.k8s.sb node1.c0.k8s.sb[k8s:children] k8s_masters k8s_nodes[k8s_masters:vars] ansible_ssh_usersbadmin ansible_ssh_pass"***&q…...

【AI系统】MobileNet 系列

MobileNet 系列 在本文会介绍 MobileNet 系列&#xff0c;重点在于其模型结构的轻量化设计&#xff0c;主要介绍详细的轻量化设计原则&#xff0c;基于这原则&#xff0c;MobileNetV1 是如何设计成一个小型&#xff0c;低延迟&#xff0c;低功耗的参数化模型&#xff0c;可以满…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

动态规划-1035.不相交的线-力扣(LeetCode)

一、题目解析 光看题目要求和例图&#xff0c;感觉这题好麻烦&#xff0c;直线不能相交啊&#xff0c;每个数字只属于一条连线啊等等&#xff0c;但我们结合题目所给的信息和例图的内容&#xff0c;这不就是最长公共子序列吗&#xff1f;&#xff0c;我们把最长公共子序列连线起…...

python打卡第47天

昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a; 热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图&#xff0c;展示模…...

基于小程序老人监护管理系统源码数据库文档

摘 要 近年来&#xff0c;随着我国人口老龄化问题日益严重&#xff0c;独居和居住养老机构的的老年人数量越来越多。而随着老年人数量的逐步增长&#xff0c;随之而来的是日益突出的老年人问题&#xff0c;尤其是老年人的健康问题&#xff0c;尤其是老年人产生健康问题后&…...

Pandas 可视化集成:数据科学家的高效绘图指南

为什么选择 Pandas 进行数据可视化&#xff1f; 在数据科学和分析领域&#xff0c;可视化是理解数据、发现模式和传达见解的关键步骤。Python 生态系统提供了多种可视化工具&#xff0c;如 Matplotlib、Seaborn、Plotly 等&#xff0c;但 Pandas 内置的可视化功能因其与数据结…...