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

本文主要是介绍【制作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是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

在这里插入图片描述

这篇关于【制作100个unity游戏之26】unity2d横版卷轴动作类游戏4(附带项目源码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/991937

相关文章

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.