【制作100个unity游戏之26】unity2d横版卷轴动作类游戏4(附带项目源码)

最终效果

在这里插入图片描述

系列导航

文章目录

  • 最终效果
  • 系列导航
  • 前言
  • 添加敌人
  • 受击动画
    • 第一种 配置闪烁动画
    • 第二种
  • 受伤击退效果
  • 人物死亡
  • 源码
  • 完结

前言

欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第26篇中,我们将探索如何用unity制作一个unity2d横版卷轴动作类游戏,我会附带项目源码,以便你更好理解它。

本节主要是添加敌人,人物受伤合死亡

添加敌人

素材切片
在这里插入图片描述

配置刚体和新增触发器,判断对玩家造成伤害
在这里插入图片描述
新增敌人身体碰撞体,碰撞体我们只要在野猪脚下放置一点就可以了,因为他的作用只是不让我们的野猪不掉下去
在这里插入图片描述

我们希望敌人身体和敌人身体、敌人身体和玩家之间不发生碰撞,可以去除图层之间的碰撞,注意前面要设置好对应的图层
在这里插入图片描述

新增Attack,攻击代码

public class Attack : MonoBehaviour {

    public int damage;
    
    private void OnTriggerStay2D(Collider2D other)
    {
        other.GetComponent<Character>()?.TakeDamage(this);
    }
}

给敌人配置代码脚本
在这里插入图片描述

新增属性代码,人物和敌人都可以挂载这个代码

public class Character : MonoBehaviour
{
    [Header("基本属性")]
    public float maxHealth;// 最大生命值
    public float currentHealth;// 当前生命值
    [Header("受伤无敌")]
    public float invulnerableDuration;// 无敌持续时间
    public bool invulnerable;// 是否处于无敌状态

    private void Start()
    {
        currentHealth = maxHealth;// 初始化当前生命值为最大生命值
    }

    public void TakeDamage(Attack attacker)
    {
        if (invulnerable) return;

        if (currentHealth - attacker.damage > 0)// 如果扣除伤害后生命值大于0
        {
            currentHealth -= attacker.damage;// 扣除伤害值
            StartCoroutine(InvulnerableTimer()); // 启动无敌状态计时器
        }
        else
        {
            currentHealth = 0;
            //TODO: 死亡逻辑
        }

    }

    private IEnumerator InvulnerableTimer()
    {
        invulnerable = true; // 设为无敌状态
        yield return new WaitForSeconds(invulnerableDuration); // 等待无敌持续时间
        invulnerable = false; // 取消无敌状态
    }
}

给玩家配置血量和2秒的无敌
在这里插入图片描述
效果,玩家触碰后会扣除当前的血量
在这里插入图片描述

受击动画

这里有两种方式

第一种 配置闪烁动画

新增动画图层 混合设置为叠加 权重设置为1
在这里插入图片描述
配置闪烁动画,在不同阶段给角色设置不同的透明度
在这里插入图片描述

第二种

配置图层为1 覆盖
在这里插入图片描述
配置击退动画
在这里插入图片描述

触发条件
在这里插入图片描述
在这里插入图片描述
修改PlayerAnimation

//播放受击动画
public void PlayHurt(){
    anim.SetTrigger("hurt");
}

修改Character, 新增受伤事件,传入一个tranform,预留做人物受伤反弹效果

public UnityEvent<Transform> OnTakeDamage;

public void TakeDamage(Attack attacker)
{
    if (invulnerable) return;

    Debug.Log(gameObject.name + "受伤");

    if (currentHealth - attacker.damage > 0)// 如果扣除伤害后生命值大于0
    {
        currentHealth -= attacker.damage;// 扣除伤害值
        StartCoroutine(InvulnerableTimer()); // 启动无敌状态计时器

        //执行受伤
        OnTakeDamage?.Invoke(attacker.transform);
    }
    else
    {
        currentHealth = 0;
        //TODO: 死亡逻辑
    }
}

配置
在这里插入图片描述
配置闪红效果
在这里插入图片描述
效果
在这里插入图片描述

受伤击退效果

修改PlayerController,定义受伤击退效果和受伤禁止移动

public float hurtForce;//击退力
public bool isHurt;//是否受伤

private void FixedUpdate()
{
    //受伤禁止移动
    if(!isHurt) Move();
}
 
//击退   
public void GetHurt(Transform attacker){
    isHurt = true;
    rb.velocity = Vector2.zero;
    Vector2 dir = new Vector2((transform.position.x - attacker.position.x), 0).normalized;
    rb.AddForce(dir * hurtForce, ForceMode2D.Impulse);
}

配置
在这里插入图片描述
运行测试会,发现人物停不下来而且无法操作,那是因为我们把isHurt=true之后,并没有地方将他还原回false

我们可以在animator创建动画状态机控制
在这里插入图片描述
在动画播放完时,设置isHurt我为false
在这里插入图片描述
效果
在这里插入图片描述

人物死亡

配置死亡动画 和过渡条件
在这里插入图片描述

重新开始游戏玩家想要活过来,所以需要退出
在这里插入图片描述

修改Character

public UnityEvent OnDie;

public void TakeDamage(Attack attacker)
{
    if (invulnerable) return;

    Debug.Log(gameObject.name + "受伤");

    if (currentHealth - attacker.damage > 0)// 如果扣除伤害后生命值大于0
    {
        currentHealth -= attacker.damage;// 扣除伤害值
        StartCoroutine(InvulnerableTimer()); // 启动无敌状态计时器

        //执行受伤
        OnTakeDamage?.Invoke(attacker.transform);
    }
    else
    {
        currentHealth = 0;
        // 死亡逻辑
        OnDie?.Invoke();
    }
}

修改PlayerController,死亡禁止玩家操作

public bool isDead;//是否死亡

//死亡
public void PlayerDead(){
    isDead = true;
    inputControl.Player.Disable();
}

修改PlayerAnimation,播放死亡动画

private PlayerController playerController;

playerController = GetComponent<PlayerController>();

public void SetAnimation()
{
    // 。。。
    anim.SetBool("isDead", playerController.isDead);
}

配置
在这里插入图片描述

记得取消死亡动画循环播放
在这里插入图片描述

效果
在这里插入图片描述

源码

源码不出意外的话我会放在最后一节

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

在这里插入图片描述

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

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

相关文章

一文读懂:低代码

引言 在数字化转型的时代&#xff0c;软件开发已经成为企业迅速响应市场需求和创新的关键。然而&#xff0c;传统的软件开发模式往往面临着繁琐的代码编写、长周期的开发时间以及对技术专业知识的依赖&#xff0c;这使得许多企业在追求创新和业务扩展的过程中倍感束手无策。 …

dragonbones 5.6.3不能导出的解决办法

问题描述 使用dragonbones 5.6.3导出资源时无反应。 解决方法 第一步安装node.js&#xff0c;我这里使用的是V18.16.0第二步进入到DragonBonesPro\egretlauncher\server\win目录&#xff0c;然后把里面的node.exe替换为刚刚下载的node文件夹即可&#xff0c;如下图&#xff…

Synchronize 底层实现原理

1 、加锁实现原理 public class SynchronizedTest {public void get(){synchronized (this){ // 这个是同步代码块System.out.println("你好呀");}}public synchronized void f(){ //这个是同步方法System.out.println("Hello world");}public s…

数据生命周期管理:从提取到治理再到安全保障的全面策略

在大数据的时代背景下&#xff0c;数据已经成为企业运营不可或缺的资源。然而&#xff0c;数据的管理并非易事&#xff0c;特别是在数据的整个生命周期中——从数据的提取、治理到安全保障&#xff0c;每一个环节都至关重要。本文将探讨如何制定一个全面的数据生命周期管理策略…

单片机开发板上外设资源讲解

单片机开发电路板上简单外设 开发板上各基础外设LED灯按键&#xff1a;数码管介绍液晶屏矩阵键盘扫描的概念LED点阵屏实时时钟蜂鸣器存储器 温度传感器&单总线 开发板上各基础外设 LED灯 中文名&#xff1a;发光二极管 外文名&#xff1a;Light Emitting Diode 简称&…

elasticsearch(下载安装、基本操作、查询、聚合、SpringData-Elasticsearch)

文章目录 1. 了解搜索技术1.1. 什么是搜索1.2. 新业务需求1.3. 搜索引擎1.4. 倒排索引(Inverted index)1.5. 认识lucene1.6. 什么是全文检索 2.下载安装2.1. elastic2.2 下载2.2.1 elasticsearch2.2.2 kibana地址2.2.3 ik中文分词器地址 2.3 安装elasticsearch2.3.1 安装elasti…

AI Agent LangChain使用方法记录

B站教程OpenAI官网获取密钥&#xff1a; OPENAI官网获取KEY 报错“Did not find openai_api_key, please add an environment variable OPENAI_API_KEY”

智能网红主播直播手机:助您轻松卖货、卖团购卷、拓客利器!

在当下快速发展的电商行业中&#xff0c;直播销售已经成为无可忽视的一大趋势。智能网红主播直播手机的出现&#xff0c;让人们无需拥有专业设备和经验&#xff0c;便可轻松参与直播销售&#xff0c;享受销售乐趣。本文将介绍智能网红主播直播手机的操作简单、易上手以及其在卖…

JSON格式化输出html——数组+对象+JSON字符串+汉字——基础积累——@pgrabovets/json-view

昨天写了一篇关于JSON格式化输出到页面上——数组对象JSON字符串汉字——基础积累的文章&#xff0c;效果是可以实现的 但是如果要实现右侧部分的展开/折叠&#xff0c;则可以使用到下面的插件了pgrabovets/json-view github链接&#xff1a;https://github.com/pgrabovets/j…

【C语言】水仙花数

问题 水仙花数&#xff08;Narcissistic number&#xff09;也被称为超完全数字不变数&#xff08;pluperfect digital invariant, PPDI&#xff09;、自恋数、自幂数或阿姆斯壮数数&#xff08;Armstrong number&#xff09;。 它是指一个n位数&#xff08;n≥3&#xff09;…

什么样的开放式耳机好用舒服?五款高人气质量绝佳产品力荐!

​随着人们越来越注重个人的身体健康问题&#xff0c;掀起了一股运动浪潮&#xff0c;现在大家都会喜欢跑跑步&#xff0c;运动一下使自己的身体更好&#xff0c;那么在运动时候如果能有音乐听的话&#xff0c;人们的运动状态就能达到更好的水平。鉴于传统入耳式耳机给用户带来…

特征模态分解(FMD):一种小众而又新颖的分解方法

​ 声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 今天为大家介绍一个小众而又新颖的信号分…

【全开源】Java同城信息付费系统家政服务房屋租赁房屋买卖房屋装修信息发布平台小程序APP公众号源码

同城信息付费系统&#xff1a;家政服务的新篇章 在快节奏的现代生活中&#xff0c;家政服务已成为许多家庭不可或缺的一部分。然而&#xff0c;如何快速、准确地找到合适、可靠的家政服务人员&#xff0c;一直是困扰着许多家庭的问题。为了解决这一难题&#xff0c;我们推出了…

JVS物联网、无忧企业文档、规则引擎5.14功能新增说明

项目介绍 JVS是企业级数字化服务构建的基础脚手架&#xff0c;主要解决企业信息化项目交付难、实施效率低、开发成本高的问题&#xff0c;采用微服务配置化的方式&#xff0c;提供了 低代码数据分析物联网的核心能力产品&#xff0c;并构建了协同办公、企业常用的管理工具等&am…

谷歌 I/O 2024大会全面硬钢OpenAI;腾讯宣布旗下的混元文生图大模型;阿里巴巴技术下的AI自动视频剪辑工具

✨ 1: 谷歌 I/O 2024 谷歌 I/O 2024 发布了众多新技术&#xff0c;包括 Gemini AI、大语言模型和通用 AI 智能体等&#xff0c;全面颠覆搜索体验。 谷歌 I/O 2024发布会带来许多令人兴奋的新功能和技术创新&#xff1a; Gemini 1.5 Pro&#xff1a;一个极其强大的语言模型&am…

消息队列选型

一、要解决的问题 1.1 异步 分析&#xff1a; 需要根据场景来判断。若整体链路的逻辑中&#xff0c;某些逻辑是不需要强实时的&#xff0c;滞后一段时间是允许的&#xff0c;同时又不会对用户带来不好的体验&#xff0c;那么可以使用MQ完成异步操作。 例如&#xff1a;秒杀场…

x264 帧类型代价计算原理:slicetype_frame_cost 函数分析

slicetype_frame_cost 函数 函数功能 这个函数的核心是计算编码一系列帧(从 p0 到p1,以 b 为当前帧)的代价 cost,并根据这个代价 cost来辅助帧类型决策。它考虑了运动搜索的结果、帧间和帧内预测的成本,并且可以并行处理以提高效率。该函数在帧类型决策、MBtree 分析、场…

消防物资存储|基于SSM+vue的消防物资存储系统的设计与实现(源码+数据库+文档)

消防物资存储系统 目录 基于SSM&#xff0b;vue的消防物资存储系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1用户功能模块 2 管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介…

天锐绿盾 | 如何防止电脑内文件遭到泄露?

天锐绿盾是一款专为企业设计的数据防泄漏软件系统&#xff0c;它通过一系列综合性的安全措施来有效防止电脑内文件遭到泄露。 PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是天锐绿盾防止文件泄露的主要功能和方法&a…

酒店刷脸设备遭批量扔进「垃圾桶」,为啥所有人都叫好……

最近&#xff0c;不知道柴油们有没有关注到这么一个热点&#xff0c;就是大量酒店曾经动辄几千上万买来的刷脸设备&#xff0c;大批量的被挂在二手平台1折甩卖了…… 昔日花大几千&#xff0c;甚至上万买来的设备&#xff0c;如今年低至三四百&#xff1f;打折打到脚底板&#…