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

(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();
}

相关文章:

  • 深入Android S (12.0) 探索Framework之输入子系统InputReader的流程
  • notepad++: 插件fingertext 来创建代码块
  • 考研过后你如坐针毡,而有些人因选择中国人民大学与加拿大女王大学金融硕士而乐在其中
  • 网络中黑客攻击使用手段Top25漏洞常见参数,8个WAF绕过,一些用于查找敏感文件的语法
  • Windows ssh登录eNSP交换机
  • 直播录屏工具哪家强?让你的直播更精彩!
  • 【VRTK】【PICO】如何快速创建一个用VRTK开发的PICO项目
  • 【算法专题】动态规划之路径问题
  • alfred自定义谷歌翻译workflow
  • AcWing828.模拟栈
  • # 安徽锐锋科技IDMS系统简介
  • java web 校园健康管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • 【ARM Cortex-M 系列 1.1 -- Cortex-M33 与 M4 差异 详细介绍】
  • Python学习从0到1 day8 Python循环语句
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • 网络传输文件的问题
  • JS 中的深拷贝与浅拷贝
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • ➹使用webpack配置多页面应用(MPA)
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • C++入门教程(10):for 语句
  • Flannel解读
  • golang中接口赋值与方法集
  • IDEA常用插件整理
  • isset在php5.6-和php7.0+的一些差异
  • JS+CSS实现数字滚动
  • js对象的深浅拷贝
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • React系列之 Redux 架构模式
  • springboot_database项目介绍
  • spring学习第二天
  • vue-cli在webpack的配置文件探究
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 简单基于spring的redis配置(单机和集群模式)
  • 通信类
  • 网络应用优化——时延与带宽
  • 学习笔记TF060:图像语音结合,看图说话
  • 积累各种好的链接
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • $forceUpdate()函数
  • (ros//EnvironmentVariables)ros环境变量
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (十一)c52学习之旅-动态数码管
  • (转)http协议
  • ******之网络***——物理***
  • . NET自动找可写目录
  • ./configure、make、make install 命令
  • .NET : 在VS2008中计算代码度量值
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .Net Core与存储过程(一)
  • .NET 药厂业务系统 CPU爆高分析