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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图书管理系统-Python

相关代码&#xff1a; # Time: 2024/1/23 16:16 # Author: 马龙强 # File: 图书管理系统.py # software: PyCharm class Book():def __init__(self,name,auther,status,bookindex):self.name nameself.auther autherself.status statusself.bookindex bookindexdef __str…

【第十五课】数据结构:堆 (“堆”的介绍+主要操作 / acwing-838堆排序 / c++代码 )

目录 关于堆的一些知识的回顾 数据结构&#xff1a;堆的特点 "down" 和 "up"&#xff1a;维护堆的性质 down up 数据结构&#xff1a;堆的主要操作 acwing-838堆排序 代码如下 时间复杂度分析 确实是在写的过程中频繁回顾了很多关于树的知识&…

华为发布 HarmonyOS NEXT 鸿蒙星河版

文章目录 个人简介 在 2024-01-18 下午于深圳举办的鸿蒙生态千帆启航仪式上&#xff0c;华为常务董事兼终端BG CEO余承东宣布了HarmonyOS NEXT&#xff08;鸿蒙星河版&#xff09;的开发者预览版面向开发者开放申请。这一版本旨在实现六大极致原生体验&#xff0c;包括原生精致…

【某某大学的探索之旅】奇怪的登录框概率性布尔报错盲注绕过

在某某大学的探索过程中&#xff0c;发现了一个比较奇怪的布尔报错盲注 它这里本来登录有一个滑动验证码&#xff0c;token是滑动验证码每次校验生成的&#xff0c;从处理逻辑讲&#xff0c;这里的token是不能复用的&#xff0c;但是这里的token却是可以复用&#xff0c;这本来…

【分布式技术】消息队列Kafka

目录 一、Kafka概述 二、消息队列Kafka的好处 三、消息队列Kafka的两种模式 四、Kafka 1、Kafka 定义 2、Kafka 简介 3、Kafka 的特性 五、Kafka的系统架构 六、实操部署Kafka集群 步骤一&#xff1a;在每一个zookeeper节点上完成kafka部署 ​编辑 步骤二&#xff1a…

喜讯 | 华院计算摘得“2023大数据产业年度创新技术突破”奖

2024年1月17日&#xff0c; 由数据猿和上海大数据联盟主办&#xff0c;上海市经济和信息化委员会、上海市科学技术委员会指导的“第六届金猿季&魔方论坛——大数据产业发展论坛”在上海市四行仓库举行。论坛以“小趋势大未来”为主题&#xff0c;围绕大数据产业的各个领域展…

〖大前端 - ES6篇①〗- ES6简介

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

【表情识别阅读笔记】Towards Semi-Supervised Deep FER with An Adaptive Confidence Margin

论文名&#xff1a; Towards Semi-Supervised Deep Facial Expression Recognition with An Adaptive Confidence Margin 论文来源&#xff1a; CVPR 发表时间&#xff1a; 2022-04 研究背景&#xff1a; 对大量图片或视频进行手工标注表情是一件极其繁琐的事情&#xff0c;因此…

UDP和TCP代理协议有什么区别?哪个更好

在互联网的世界里&#xff0c;数据传输的方式有很多种&#xff0c;其中 UDP 和 TCP 是两种常见的传输协议。而代理协议则是为了在网络中传输数据时提供安全、稳定和高效的传输环境。那么&#xff0c;UDP 和 TCP 代理协议有什么区别呢&#xff1f;哪个更好呢&#xff1f;接下来&…

C++版QT:电子时钟

digiclock.h #ifndef DIGICLOCK_H #define DIGICLOCK_H ​ #include <QLCDNumber> ​ class DigiClock : public QLCDNumber {Q_OBJECT public:DigiClock(QWidget* parent 0);void mousePressEvent(QMouseEvent*);void mouseMoveEvent(QMouseEvent*); public slots:voi…

docker - compose 部署 Tomcat

目录 下面用 docker-compose 方法部署 Tomcat 1、准备工作 2、部署容器 启动容器 查看新启动的容器 3、总结 下面用 docker-compose 方法部署 Tomcat 1、准备工作 先在主机创建工作文件夹&#xff0c;为了放置 Tomcat 的配置文件等。创建文件夹的方法&#xff0c;自己搞…

Kubernetes operator(一)client-go篇【更新中】

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列第一篇&#xff0c;主要对client-go进行学习&#xff0c;从源码阅读角度&#xff0c;学习client-go各个组件的实现原理、如何协同工作等参考视频&#xff1a;Bilibili 2022年最新k…

应用app的服务器如何增加高并发

增强服务器的高并发能力是现代网络应用非常关键的需求。面对用户数量的不断增长和数据量的膨胀&#xff0c;服务器必须能够处理大量并发请求。以下是一些提高服务器高并发能力的常用方法和具体实施细节&#xff1a; 优化服务器和操作系统配置 服务器和操作系统的默认配置不一定…

大模型学习与实践笔记(十二)

将RAG生成模型部署到openxlab 平台 代码仓库&#xff1a;https://github.com/AllYoung/LLM4opencv 1&#xff1a;创建代码仓库 在 GitHub 中创建存放应用代码的仓库&#xff0c;其代码大致目录树如下&#xff1a; ├─GitHub repo │ ├─app.py # …

多场景建模:阿里多场景多任务元学习方法M2M

multi-scenario multi-task meta learning approach (M2M) 背景 广告领域大部分是针对用户建模的&#xff0c;像点击率预估&#xff0c;很少有针对广告主需求建模&#xff08;广告消耗预估、活跃率/流失率预估、广告曝光量预估&#xff09;&#xff0c;广告的类型较多&#x…

数据库-分库分表初探

文章目录 分库策略垂直切分垂直分库&#xff08;专库专用&#xff09;垂直分表&#xff08;拆表&#xff09;优点缺点 水平(Sharding)切分水平分表库内分表分库分表优点缺点 分表策略hash取模方案range范围区间取值方案映射表方案 分库分表问题事务一致性问题跨节点关联查询跨节…

隐藏服务器源IP的几种方法

为网络管理员的我们多知道遇到过服务器因为拒绝服务攻击(DDOS攻击)遇到网站瘫痪的情况是很糟心&#xff0c;随着客户信息越来越受到公司企业的重视&#xff0c;网站服务器的安全也越来越受到关注&#xff0c;但无法避免的是会遇到黑客使用DDoS攻击业务。 下面简单介绍一下隐藏i…

PolarDB无感切换特性助力游戏领域高可用实践

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

前端使用css去除input框的默认样式

关键点&#xff1a; /* 关键点&#xff0c;让输入框无边框 */outline:none; border:none; 1.效果图 2.html <div class"container"><input type"text" placeholder"请输入用户名"><input type"text" placeholder&q…

如何在WordPress中使用 AI 进行 SEO(12 个工具)

您想在 WordPress 中使用 AI 进行 SEO 吗&#xff1f; 人工智能正在对 SEO 行业产生重大影响。已经有优秀的人工智能 SEO 工具&#xff0c;您可以使用它们来提高您的 SEO 排名&#xff0c;而无需付出太多努力。 在本文中&#xff0c;我们将向您展示如何通过我们精心挑选的工具…