(M)unity2D敌人的创建、人物属性设置,遇敌掉血

敌人的创建

1.敌人添加与组件设置

1)添加敌人后,刚体添加,碰撞体添加(一个碰撞体使猪在地上走,不接触人,另一个碰撞体组件使人和猪碰在一起产生伤害)

①刚体
刚体添加

②碰撞体一

设置的只在脚下,只需要敌人可以站在场景中就可以
但存在添加碰撞体积后,会和其他移动的人物或敌人产生碰撞使得无法擦肩而过的效果,通过组件中的layer overrides解决敌人与player碰撞问题,通过触发器trigger解决人物碰到猪以后掉血的情况

在这里插入图片描述

layer overrides

注意低版本(譬如2022.1.24)unity编辑器在box collider组件中没有layer overrides,需要安装新的editor重新打开项目。版本可能不适应,换了许多版本editor,用最新的。

1.图层重载是指在layer中可以剔除掉不想发生碰撞的角色

在这里插入图片描述

2.添加两种图层类型

不需要与player和enemy产生碰撞,则增加这两种图层类型
在这里插入图片描述

3.选中敌人,赋值,同理选中玩家

在这里插入图片描述
4.给猪剔除这两种图层

在这里插入图片描述

trigger

③ 碰撞体二

猪是触发器,成为触发器后猪就没有碰撞体积了
可以触发到猪的不包含enemy,防止敌人之间相互碰撞产生伤害
在这里插入图片描述
添加代码测试触发器的触发

用方法OnTriggerStay2D

在这里插入图片描述

private void OnTriggerStay2D(Collider2D collision)
{Debug.Log(collision.name);
}

可见触发器在接触到没有被屏蔽的碰撞体时被触发了

在这里插入图片描述


解决报错

Screen position out of view frustum

方法:

增大摄像机的size
在这里插入图片描述


人物属性设置、遇敌掉血

1.代码创建

在人物与敌人身上都需要挂这个代码,用于记录人物最大血量与当前血量等属性

在这里插入图片描述例如

public class Character : MonoBehaviour
{[Header("基本属性")]public float maxHealth;public float currentHealth;
}

2.在每一次触发攻击时减少character中的当前血量

创建attack脚本

在这里插入图片描述
攻击属性一般包括伤害、攻击范围、攻击频率等,此次添加猪给人的接触伤害,挂在猪身上

猪的攻击,每次接触到人,就会持续被触发,触发后对触发者中扣血函数进行调用

public class Attack : MonoBehaviour
{public int damage;public float attackRange;public float attackRate;//作为触发器被别的碰撞体collition触发后,collition会扣血private void OnTriggerStay2D(Collider2D collision){collision.GetComponent<Character>().TakeDamage(this); }
}

player的受伤代码

public class Character : MonoBehaviour
{[Header("基本属性")]public float maxHealth;public float currentHealth;private void Start(){currentHealth = maxHealth;}//受伤public void TakeDamage(Attack attacker){currentHealth = currentHealth - attacker.damage;}
}

3.扣血过多,计时器 设置一次受伤后触发无敌状态

Time.deltaTime: 时间的修正,完成上一帧所用的时间(s)

触发伤害过程:触发,检测是否为无敌状态
无敌状态:直接返回;
不是无敌状态,触发一次伤害,进入无敌状态,无敌状态计时器开始倒数,倒数到<=0,脱离无敌状态,此时又可以受伤害了。

public class Character : MonoBehaviour
{[Header("基本属性")]public float maxHealth;public float currentHealth;[Header("无敌状态")]//无敌时间public float invulnerableTime;//计时器private float invulnerableCounter;//状态public bool invulnerable;private void Start(){currentHealth = maxHealth;}//每次update都检测是否为无敌状态private void Update(){if (invulnerable){invulnerableCounter -= Time.deltaTime;if (invulnerableCounter <= 0){invulnerable = false;}}}//受伤public void TakeDamage(Attack attacker){//如果无敌,则直接返回if (invulnerable){return;}//Debug.Log(attacker.damage);currentHealth = currentHealth - attacker.damage;//触发一次伤害,就变成无敌triggerInvulnerable();}//触发无敌状态函数private void triggerInvulnerable(){if (!invulnerable){invulnerable = true;invulnerableCounter = invulnerableTime;}}
}

对于以下代码,需要确定触发触发器的碰撞体上含有组件脚本Character,
如果对方没有这个脚本,在被触发时会报错

private void OnTriggerStay2D(Collider2D collision)
{collision.GetComponent<Character>().TakeDamage(this); 
}

解决方法:

添加对对方是否存在该组件的判断:

在这里插入图片描述


检测血量,扣血不要减到0还在减少,
增加判断,如果血量大于一次伤害,则扣血;如果不大于,则归零

public void TakeDamage(Attack attacker)
{//如果无敌,则直接返回if (invulnerable){return;}if (currentHealth - attacker.damage > 0){currentHealth -= attacker.damage;}elsecurrentHealth = 0;//触发一次伤害,就变成无敌TriggerInvulnerable();
}

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

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

相关文章

Sqoop与Spark的协作:高性能数据处理

将Sqoop与Spark协作是实现高性能数据处理的关键步骤之一。Sqoop用于将数据从关系型数据库导入到Hadoop生态系统中&#xff0c;而Spark用于大规模数据处理和分析。本文将深入探讨如何使用Sqoop与Spark协作&#xff0c;提供详细的步骤、示例代码和最佳实践&#xff0c;以确保能够…

Java基于沙箱环境实现支付宝支付

一、支付宝沙箱环境介绍 沙箱环境是支付宝开放平台为开发者提供的安全低门槛的测试环境&#xff0c;开发者在沙箱环境中调用接口无需具备所需的商业资质&#xff0c;无需绑定和开通产品&#xff0c;同时不会对生产环境中的数据造成任何影响。合理使用沙箱环境&#xff0c;可以…

【好用的AI工具Kimi Chat】帮助提高面试效率

一、背景 年前裁员潮&#xff0c;不少人离职找工作&#xff0c;以及年后金三银四&#xff0c;也是求职高峰期。如何更高效的复习技术知识&#xff0c;以及特别是横纵向比对有总结性的问题。本文以面试【测试开发】的岗位为例&#xff0c;对面试题进行拓展&#xff0c;让AI帮助…

立体视觉几何 (二)

1.视差 2.立体匹配 立体匹配的基本概念: 匹配目标: 在立体匹配中&#xff0c;主要目标是确定左图像中像素的右图像中的对应像素。这个对应像素通常位于相同的行。视差&#xff08;Disparity&#xff09;: 视差 d 是右图像中对应像素 xr 和左图像中像素 xl 之间的水平位置差。视…

《移动通信原理与应用》——QAM调制解调仿真

目录 一、QAM调制与解调仿真流程图&#xff1a; 二、仿真结果&#xff1a; 三、Matlab仿真程序代码如下&#xff1a; 一、QAM调制与解调仿真流程图&#xff1a; QAM调制仿真流程图&#xff1a; QAM解调仿真流程图&#xff1a; 二、仿真结果&#xff1a; &#xff08;1&…

本地读取Excel文件并进行数据压缩传递到服务器

在项目开发过程中&#xff0c;读取excel文件&#xff0c;可能存在几百或几百万条数据内容&#xff0c;那么对于大型文件来说&#xff0c;我们应该如何思考对于大型文件的读取操作以及性能的注意事项。 类库&#xff1a;Papa Parse - Powerful CSV Parser for JavaScript 第一步…

OpenCV书签 #直方图算法的原理与相似图片搜索实验

1. 介绍 直方图算法&#xff08;Image Histogram Algorithm&#xff09; 通过统计图像中各个颜色值的分布情况来提供关于图像颜色特征的信息&#xff0c;它可以用来衡量两张图片在颜色分布上的相似度&#xff0c;进而可以用来进行图像相似度的比较&#xff0c;因此&#xff0c…

小型园区组网实例

目录 拓扑需求IP规划路由配置交换机配置NAT配置ACL配置DHCP配置配置过程&#xff1a;配置结果&#xff1a; OSPF配置链路聚合配置配置过程&#xff1a; 网络测试 拓扑 需求 企业网络信息服务平台需实现功能&#xff1a;企业网站服务器、FTP服务器、DNS服务器。企业ip分配地址段…

Linux系统Shell脚本 ----- 编程规范和变量详细解读(一)

一、程序编程风格 面向过程语言 开发的时候 需要 一步一步 执行 做一件事情&#xff0c;排出个步骤&#xff0c;第一步干什么&#xff0c;第二步干什么&#xff0c;如果出现情况A&#xff0c;做什么处理&#xff0c;如果出现了情况B&#xff0c;做什么处理 问题规模小&#…

力扣hot100 合并两个有序链表 递归 双指针

Problem: 21. 合并两个有序链表 文章目录 &#x1f496; 递归思路 &#x1f496; 双指针 &#x1f496; 递归 思路 &#x1f468;‍&#x1f3eb; 参考地址 n , m n,m n,m 分别为 list1 和 list2 的元素个数 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) &#x1f30e; 空间复杂…

仓储管理系统——软件工程报告(可行性研究报告及分析)①

可行性研究报告及分析 一、问题定义 1.1项目背景 随着社会的发展以及企业规模的扩大和业务的复杂化&#xff0c;仓库管理变得愈发重要。传统的手工管理方式已经导致了一系列问题&#xff0c;包括库存准确性低、订单处理效率慢等。为了提高仓库运作效率、降低成本并优化库存管…

TCP三握四挥(面试需要)

TCP建立连接需要三次握手过程&#xff0c;关闭连接需要四次挥手过程 三次握手 从图中可以看出&#xff0c;客户端在发起connect时&#xff0c;会发起第一次和第三次握手。服务端在接收客户端连接时&#xff0c;会发起第二次握手。 这三次握手&#xff0c;都会通过SYNACK的方式…