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

news2024/9/27 21:31:22

敌人的创建

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;
    }
    else
        currentHealth = 0;
    
    //触发一次伤害,就变成无敌
    TriggerInvulnerable();
}

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

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

相关文章

关于标准那些事——第十篇 分类标准

最近要赶一个极其重要的CANS认证项目&#xff0c;这会是全中国第一个完全数字化CNAS认证的实验室项目&#xff0c;内容分享进度会比较慢。其实&#xff0c;大多数情况也并不是没有时间&#xff0c;俗话说&#xff1a;时间嘛&#xff0c;挤挤总是有的&#xff01;其实影响进度更…

php低版本(7.4)配置过程中遇到的问题及基本解决手段

目前php不支持较低版本的安装&#xff0c;如果安装低版本必须借助第三方库shivammathur //将第三方仓库加入brewbrew tap shivammathur/php //安装PHPbrew install shivammathur/php/php7.4 可能出现的问题 像这样突然中止然后报错&#xff0c;一般是网络问题&#xff0c;或…

Socket实现服务器和客户端

Socket 编程是一种用于在网络上进行通信的编程方法&#xff0c;以下代码可以实现在不同主机之间传输数据。 Socket 编程中服务器端和客户端的基本步骤&#xff1a;服务器端步骤&#xff1a; 1.创建 Socket&#xff1a; int serverSocket socket(AF_INET, SOCK_STREAM, 0);…

git 对象压缩及垃圾对象清理

git 对象压缩及垃圾对象清理 这篇文章让我们来看看 git 的对象压缩机制&#xff0c;前面的几篇文章我们提到&#xff0c;在执行 git add 命令会会把文件先通过 zlib 压缩后放入到「暂存区」&#xff0c;我们先看看这个步骤&#xff1a; 我们这个实例中有一个 1.28m 的 index.…

网工内推 | 国企、合资公司IT专员,13薪,NA以上即可

01 上海新徐汇&#xff08;集团&#xff09;有限公司 招聘岗位&#xff1a;IT运维 职责描述&#xff1a; 1.负责制定网络体系搭建、IP地址分配、网络拓扑图、无线网络等&#xff1b; 2.负责桌面运维技术支持&#xff0c;确保各类系统和终端设备正常工作&#xff1b; 3.负责弱电…

信号量机制解决经典同步互斥问题

生产者 / 消费者问题、读者 / 写者问题和哲学家问题是操作系统的三大经典同步互斥问题。本文将介绍这三个问题的基本特点以及如何用信号量机制进行解决。 在分析这三个问题之前&#xff0c;我们首先需要了解用信号量机制解决同步互斥问题的一般规律&#xff1a; 实现同步与互斥…

IDCNBSAIS-财务报表功能范围取值管理费用、销售费用、研发费用排除指定科目的实现

IDCNBSAIS-财务报表功能范围取值管理费用、销售费用、研发费用排除指定科目的实现 公司遇到的一个问题&#xff0c;目前报表有些项目是按照功能范围取值的&#xff0c;发现取多了。需要排除某些科目。 下面这例子就是要排除6601010204/05/06 这3个对应的科目 研究了很多方法…

【立创EDA-PCB设计基础完结】7.DRC设计规则检查+优化与丝印调整+打样与PCB生产进度跟踪

前言&#xff1a;本文为PCB设计基础的最后一讲&#xff0c;在本专栏中【立创EDA-PCB设计基础】前面已经将所有网络布线铺铜好了&#xff0c;接下来进行DRC设计规则检查优化与丝印调整打样与PCB生产进度跟踪 目录 1.DRC设计规则检查 2.优化与丝印调整 1.过孔连接优化 2.泪滴…

巧学三极管

NPN型三极管&#xff0c;由三块半导体构成&#xff0c;其中两块N型和一块P型半导体组成&#xff0c;P型半导体在中间&#xff0c;两块N型半导体在两侧&#xff0c;三极管是电子电路中最重要的器件&#xff0c;他主要的功能是电流放大和开关的作用。 工作原理 实际上&#xff0…

QCustomPlot开源库使用

1.简介 QCustomPlot是用于绘图和数据可视化的Qt C 小部件。它没有进一步的依赖关系&#xff0c;并且有据可查。该绘图库专注于制作美观&#xff0c;出版质量的2D绘图&#xff0c;图形和图表&#xff0c;以及为实时可视化应用程序提供高性能。看一下“ 设置”和“ 基本绘图”教…

C++补充篇- C++11 及其它特性

目录 explicit 关键字 左值和右值的概念 函数返回值当引用 C11 新增容器 - array C的类型转换 static_cast reinterpret_cast dynamic_cast const_cast C智能指针 auto_ptr 使用详解 (C98) unique_ptr 使用详解 (C11) auto_ptr的弊端 unique_ptr严谨auto_ptr的弊端 unique_…

开始学习Vue2(组件的生命周期和数据共享)

一、组件的生命周期 1. 生命周期 & 生命周期函数 生命周期&#xff08;Life Cycle&#xff09;是指一个组件从创建 -> 运行 -> 销毁的整个阶段&#xff0c;强调的是一个时间段。 生命周期函数&#xff1a;是由 vue 框架提供的内置函数&#xff0c;会伴随着 组件…

luceda ipkiss教程 57:画微环调制器

案例分享&#xff1a;画微环调制器 全部代码如下&#xff1a; from si_fab import all as pdk from ipkiss3 import all as i3class DC(i3.PCell):straight_length i3.PositiveNumberProperty(default200)radius i3.PositiveNumberProperty(default50)spacing i3.Positive…

推荐系统算法 协同过滤算法详解(二)皮尔森相关系数

目录 前言 协同过滤算法(简称CF) 皮尔森(pearson)相关系数公式 算法介绍 算法示例1&#xff1a; 算法示例2 前言 理解吧同胞们&#xff0c;实在是没办发把wps公式复制到文章上&#xff0c;只能截图了&#xff0c;我服了&#xff01;&#xff01;&#xff01; 协同过滤算法…

基于中文垃圾短信数据集的经典文本分类算法实现

垃圾短信的泛滥给人们的日常生活带来了严重干扰&#xff0c;其中诈骗短信更是威胁到人们的信息与财产安全。因此&#xff0c;研究如何构建一种自动拦截过滤垃圾短信的机制有较强的实际应用价值。本文基于中文垃圾短信数据集&#xff0c;分别对比了朴素贝叶斯、逻辑回归、随机森…

数据结构——排序算法代码实现、包含注释易理解可运行(C语言,持续更新中~~)

一、排序 1.1 直接插入排序 1.1.1 思想 插入排序的核心操作是将待排序元素与已排序序列中的元素进行比较&#xff0c;并找到合适的位置进行插入。这个过程可以通过不断地将元素向右移动来实现。 插入排序的优势在于对于小规模或基本有序的数组&#xff0c;它的性能非常好。…

【经验分享】豆瓣小组的文章/帖子怎么删除?

#豆瓣小组的文章/帖子怎么删除&#xff1f;# 第一步&#xff1a; 手机登录豆瓣app ↓ 点右下角“我” ↓ 然后在页面点击我的小组 ↓ 点我发布的 ↓ ↓ 再任意点开一个帖子 ↓ 在文章和帖子的右上角有一个笔状的图标&#xff0c;切记不是右上角的横三点… ↓ ↓ 最后点下边的…

odoo 一日一技 owl Registry示例 在用户菜单增加开发者模式开关

# 示例介绍 在Odoo中&#xff0c;开发者模式是一个非常有用的工具&#xff0c;它允许开发人员对系统进行调试。如果每次都要去设置中打开调试模式将非常麻烦&#xff0c;上篇文章讲述了如何使用 owl registry&#xff0c;这篇我们来进行实操。 本文将介绍如何在Odoo的用户菜单…

令人感动的创富故事编号001:27岁Python程序员年入$600万+

27岁Python程序员年入$600万 27岁的你&#xff0c;在做什么&#xff1f; 为家庭生计而努力搬砖&#xff0c;辛勤工作&#xff1f; 还是放弃挣扎&#xff0c;选择躺平呢&#xff1f; 当我们还在为未来道路感到困惑之际&#xff0c;年仅27岁的Reilly已经迈向了财富自由的大门…

Socket 文件描述符

文件描述符的作用是什么&#xff1f; 每一个进程都有一个数据结构 task_struct&#xff0c;该结构体里有一个指向「文件描述符数组」的成员指针。该数组里列出这个进程打开的所有文件的文件描述符。数组的下标是文件描述符&#xff0c;是一个整数&#xff0c;而数组的内容是一…