Unity3D学习FPS游戏(10)子弹攻击敌人掉血(碰撞检测)

前言:前面最然创造出带有血条的敌人,但子弹打中敌人并没有效果。所以本篇将实现子弹攻击敌人,并让敌人掉血。

子弹攻击敌人掉血

  • 整体思路
    • 目标
    • 补充知识-碰撞检测
  • 准备工作
    • 刚体和碰撞器添加
    • 添加刚体后子弹代码优化
    • 补充知识-标签系统
    • Tag添加
  • 碰撞检测代码编写
    • 敌人受伤
    • 子弹OnCollisionEnter函数
  • 效果

整体思路

目标

子弹碰到敌人后,进行一个碰撞检测。
判断碰敌人到后,子弹会被对象池回收,然后敌人会掉血,敌人血量掉到最低会自动销毁。
判断碰底板到后,子弹会被对象池回收。

补充知识-碰撞检测

Unity中默认生成的GameObject是没有物理也没有碰撞的,transform坐标移到哪里就是哪里。

Unity碰撞检测要求:

  • 两个物体都有碰撞器(Collider)
  • 运动的物体有刚体(Rigidbody)

关于刚体(Rigidbody)和碰撞器(Collider)组件的介绍:

  • 刚体(Rigidbody):使游戏对象在物理系统的控制下来运动,具有力的作用。
  • 碰撞器(Collider):碰撞器是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞,碰撞器的大小形状规定物体发生碰撞的范围。

为什么碰撞检测不能只有碰撞器没有刚体?
因为判断碰撞就是需要计算力,刚体才能受到力的作用。

碰撞检测方法通常分为两种Collision碰撞和Trigger触发:

  • Collision碰撞
    函数:OnCollisionEnter/OnCollisionStay/OnCollisionExit
    效果:有一个相互作用的力,造成回弹的效果。
    条件:双方都有Collider,至少有一个运动的物体有Rigidbody。如果有Collider勾选了isTrigger或者刚体勾选了Kinematic,则碰撞无效。
  • Trigger触发
    函数:OnTriggerEnter/OnTriggerStay/OnTriggerExit
    效果:不会发生物体碰撞,也不会受到重力等物理作用力的影响,双方会直接穿过。
    条件:双方都有Collider,至少有一个运动的物体有Rigidbody。至少有一个碰撞体勾选IsTrigger。

Collision碰撞和Trigger触发的碰撞检测函数含义:

  • Enter事件表示两个物体接触瞬间,会执行一次事件。
  • Stay事件表示两个物体一直接触,会持续执行这个事件。
  • Exit事件表示两个物体分开瞬间,会执行一次事件。

isTrigger就是碰撞器中的一个属性,勾选之后可以就是触发器,不会发生碰撞,可以用做一些金币检测。
Kinematic是刚体的一个属性,在碰撞期间的行为类似于不可移动的对象,不受力的作用,但是可以进行速度操控。

准备工作

刚体和碰撞器添加

这里使用Collision碰撞,在FPS游戏中,常常会有打中怪的时候,怪往后退的效果,例如以前玩的“穿越火线”。

给子弹还有敌人添加胶囊形状碰撞体(Capsule Collider),不同碰撞体其实就是形状上的不太一样。
在这里插入图片描述
给子弹添加刚体。
在这里插入图片描述
添加新的组件后,子弹预制体如何更新。
在这里插入图片描述
敌人也加上胶囊碰撞体,因为碰撞检测需要碰撞双方都有碰撞体。
在这里插入图片描述

添加刚体后子弹代码优化

之前我们是通过计算transform位移更新子弹位置的,现在我们可以直接调用刚体的速度进行更新子弹位置。射程可以用时间来判断,速度恒定,调整移动时间其实也就规定了射程。

public class BulletController : MonoBehaviour
{private Rigidbody bulletRigidbody;// 刚体[Header("子弹数值")]public float bulletSpeed=100;// 子弹射速public float lifeTime = 10;// 子弹生存时间public ObjectPool<GameObject> bulletPool;private void Start(){bulletRigidbody = GetComponent<Rigidbody>();}private void FixedUpdate(){bulletRigidbody.velocity=transform.forward * bulletSpeed;lifeTime -= Time.fixedDeltaTime;if (lifeTime <= 0){//Destroy(this.gameObject);bulletPool.Release(this.gameObject);}}public void BulletReset(){transform.localPosition = new Vector3(0,0,0);lifeTime = 10;}
}

补充知识-标签系统

标签 (Tag) 是可分配给一个或多个游戏对象的参考词。

标签有助于识别游戏对象以便于编写脚本。例如,可为玩家控制的角色定义“Player”标签,并为非玩家控制的角色定义“Enemy”标签。

标签对碰撞体控制脚本中的触发器很有用;例如,需要通过标签确定玩家是否与敌人、道具或可收集物进行交互。

Tag添加

给建筑物体添加Plane标签;玩家添加Player标签;敌人添加Enemy标签。

标签添加方式如下:
在这里插入图片描述
在这里插入图片描述

碰撞检测代码编写

有了前面的准备,现在要做的事情就很简单了,主要是把OnCollisionEnter函数部分编写好,以及敌人受伤。

敌人受伤

创建一个新的代码命名为EnemyController。

敌人血条的逻辑联动和之前武器的弹夹数量是一样的,初始化的时候设置好Slider大小和当前大小,每次血量减少的时候就更新血条。
设置好敌人的血量,编写一个Damage函数,让子弹碰撞的时候调用,进行血量的更新操作。

public class EnemyController : MonoBehaviour
{[Header("血量数值")]public Slider HPSlider;// 血量Slider UIpublic float HP = 100;// 血量void Start(){if (HPSlider){HPSlider.maxValue = HP;HPSlider.value = HP;}}public void Damage(float damage){if (HP > 0)// 有血量{HP -= damage;if(HPSlider)// 更新血条HPSlider.value = HP;}if (HP <= 0)// 敌人无血量则销毁Destroy(this.gameObject);}
}

子弹OnCollisionEnter函数

子弹主要是添加OnCollisionEnter函数,碰撞检测时候,如果碰到是敌人,调用敌人的Damge函数,再销毁子弹。

public float attackNum = 20;// 子弹攻击力
private void OnCollisionEnter(Collision collision)
{if (collision.gameObject.CompareTag("Enemy"))// 通过Tag判断是不是敌人{collision.gameObject.GetComponent<EnemyController>().Damage(attackNum);// 调用敌人攻击代码}Destroy(this.gameObject);// 碰到别的碰撞体就销毁
}

效果

在这里插入图片描述

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

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

相关文章

Tornado简单使用

Tornado简单使用 1 介绍 Tornado 是一个基于Python的Web服务框架和 异步网络库&#xff0c;它最初由 FriendFeed 开发&#xff0c;后来被 Facebook 收购并开源&#xff0c;通过利用非阻塞网络 I/O, Tornado 可以承载成千上万的活动连接&#xff0c;完美的实现了 长连接、WebS…

倍思获喜马拉雅年度最佳协作之星,打造移动数码品牌跨界新体验

近日,在“听见,共建,同行”——2024喜马拉雅有声之夜年度创作者大会暨峰爆榜颁奖典礼上,移动数码品牌Baseus倍思凭借其卓越的技术实力与创新的品牌理念,荣获“年度最佳协作之星”奖项。这一荣誉肯定了倍思在行业的深耕细作,也树立起品牌与喜马拉雅平台跨界合作、共同演绎音频生…

[单例模式]

[设计模式] 设计模式是软件工程中的一种常见做法, 它可以理解为"模板", 是针对一些常见的特定场景, 给出的一些比较好的固定的解决方案. 不同语言适用的设计模式是不一样的. 这里我们接下来要谈到的是java中典型的设计模式. 而且由于设计模式比较适合有一定编程经…

内部知识库:优化企业培训流程的关键驱动力

在当今快速变化的商业环境中&#xff0c;企业培训的重要性日益凸显。内部知识库作为整合、管理和分享企业内部学习资源的关键工具&#xff0c;正逐步成为优化企业培训流程的核心。以下将探讨内部知识库如何通过多种功能&#xff0c;助力企业提升培训效率、质量和员工满意度。 …

Ubuntu - 进入紧急模式,无法进入桌面

目录 一、问题 二、分析原因 三、解决 四、参考 一、问题 重新安装VMVare之后&#xff0c;将之前的虚拟机加载不进来 二、分析原因 查看系统错误日志 journalctl -xb | grep Failed mnt挂载找不到了 三、解决 查看系统错误日志 如果是磁盘错误&#xff0c;此时终端会有…

I.MX6U 裸机开发3. GPIO操作控制LED灯

I.MX6U 裸机开发3. GPIO操作控制LED灯 一、创建项目目录及源文件1. 新建目录2. 远程开发环境3. 创建源文件 二、代码编写1. 打开时钟2. 配置端口复用功能为GPIO3. 配置端口电气属性4. 设置GPIO方向&#xff08;GDIR寄存器&#xff09;5. 输出6. 死循环等待 三、编译程序1. 整体…

java ssm 公司内部员工管理系统 员工信息管理 企业员工 源码 jsp

一、项目简介 本项目是一套基于SSM的公司内部员工管理系统&#xff0c;主要针对计算机相关专业的和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本、软件工具等。 项目都经过严格调试&#xff0c;确保可以运行&#xff01; 二、技术实现 ​后端技术&am…

数据分析:宏基因组DESeq2差异分析筛选差异物种

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍原理:计算步骤:结果:加载R包准备画图主题数据链接导入数据Differential abundance (No BP vs 2BP TA)构建`countData`矩阵过滤低丰度物种构建DESeq数据对象DESeq2差异分析画图Di…

Spark的yarn集群环境搭建

一.为什么要搭建yarn集群 为什么要将Spark的程序运行在YARN上&#xff0c;不运行在自带的 Standalone集群上&#xff1f; 1、统一化资源管理 Standalone是Spark专用的资源管理集群&#xff0c;只能用于运行 Spark程序 YARN是功能的分布式资源管理平台&#xff0c;可以运行各种分…

51单片机教程(六)- LED流水灯

1 项目分析 基于点亮LED灯、LED灯闪烁&#xff0c;扩展到构成最简单、花样流水灯。 2 技术准备 1 流水灯硬件及原理图 流水灯是由多个LED灯组成的 2 C语言知识点 数组 数组声明&#xff1a;长度不可变 数据类型 数组名称[长度n] // 整数型默认为0&#xff0c;小数型默认…

PyQt5实战——翻译的实现,第一次爬取微软翻译经验总结(八)

个人博客&#xff1a;苏三有春的博客 系类往期文章&#xff1a; PyQt5实战——多脚本集合包&#xff0c;前言与环境配置&#xff08;一&#xff09; PyQt5实战——多脚本集合包&#xff0c;UI以及工程布局&#xff08;二&#xff09; PyQt5实战——多脚本集合包&#xff0c;程序…

前端好用的网站分享——CSS(持续更新中)

1.CSS Scan 点击进入CSS Scan CSS盒子阴影大全 2.渐变背景 点击进入color.oulu 3.CSS简化压缩 点击进入toptal 4.CSS可视化 点击进入CSS可视化 这个强推&#xff0c;话不多说&#xff0c;看图! 5.Marko 点击进入Marko 有很多按钮样式 6.getwaves 点击进入getwaves 生…

理解Web登录机制:会话管理与跟踪技术解析(三)-过滤器Filter

在Java Web应用中&#xff0c;Filter&#xff08;过滤器&#xff09;是实现登录校验的常见方式。通过Filter&#xff0c;我们能够在请求到达实际的业务逻辑之前&#xff0c;对其进行拦截和处理&#xff0c;从而完成身份校验、权限验证等操作。本文将深入探讨登录校验的实现方法…

FreeBSD将操作系统支持时间从5年缩短为4年 继续与AMD合作

FreeBSD 项目今天发布了 2024 年第三季度进度报告&#xff0c;概述了该开源 BSD 操作系统在上一季度的改进情况。FreeBSD 开发人员仍然非常忙碌&#xff0c;他们在 2024 年第三季度取得的一些成就包括&#xff1a; FreeBSD 发布团队决定将支持时限从五年缩短为四年。 AMD 与 F…

kafka如何获取 topic 主题的列表?

大家好&#xff0c;我是锋哥。今天分享关于【kafka如何获取 topic 主题的列表&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka如何获取 topic 主题的列表&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Kafka中&#xff0c;可以…

【网络-交换机】生成树协议、环路检测

路由优先级 路由优先级决定了在多种可达的路由类型中&#xff0c;哪种路由将被用来转发数据包。路由优先级值越低&#xff0c;对应路由的优先级越高&#xff0c;优先级值255表示对应的路由不可达。一般情况下&#xff0c;静态路由的优先级为1&#xff0c;OSPF路由优先级为110&a…

基于Spring Boot的在线装修管理系统的设计与实现,LW+源码+讲解

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…

【数字图像处理】图像旋转中三种常见插值方法的效果比较:最近邻插值、双线性插值和双三次插值

引言 插值是一种数学方法&#xff0c;用于在已知的数据点之间估计新的数据点。在图像处理中&#xff0c;插值通常用于图像缩放、旋转和其他形态变换。 原始图像 最近邻插值&#xff08;Nearest-neighbor interpolation&#xff09; 这是最简单的插值方法&#xff0c;也是计算…

“方块兽神仙猿点石成金”游戏搭建开发

“方块兽神仙猿点石成金”是一款结合了策略和运气的休闲游戏。玩家需在规定时间内向不同的山头投入矿石&#xff0c;等待神仙猿降临并随机选择一座山进行“点石成金”。根据神仙猿的选择&#xff0c;玩家将获得不同的奖励。 游戏核心机制 矿石投入&#xff1a;玩家在游戏开始…

C/C++每日一练:实现选择排序

选择排序 选择排序是一种简单直观的排序算法&#xff0c;时间复杂度为&#xff0c;其中 n 是数组长度&#xff0c;不适合大数据集的排序&#xff0c;适合于元素较少且对性能要求不高的场景。 选择排序的基本思想是&#xff1a;每次从未排序部分选择最小的元素&#xff0c;将其放…