【制作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

相关文章

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

MyCat分库分表的项目实践

《MyCat分库分表的项目实践》分库分表解决大数据量和高并发性能瓶颈,MyCat作为中间件支持分片、读写分离与事务处理,本文就来介绍一下MyCat分库分表的实践,感兴趣的可以了解一下... 目录一、为什么要分库分表?二、分库分表的常见方案三、MyCat简介四、MyCat分库分表深度解析1. 架构原理2. 分

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日

使用python制作一款文件粉碎工具

《使用python制作一款文件粉碎工具》这篇文章主要为大家详细介绍了如何使用python制作一款文件粉碎工具,能够有效粉碎密码文件和机密Excel表格等,感兴趣的小伙伴可以了解一下... 文件粉碎工具:适用于粉碎密码文件和机密的escel表格等等,主要作用就是防止 别人用数据恢复大师把你刚删除的机密的文件恢

java 恺撒加密/解密实现原理(附带源码)

《java恺撒加密/解密实现原理(附带源码)》本文介绍Java实现恺撒加密与解密,通过固定位移量对字母进行循环替换,保留大小写及非字母字符,由于其实现简单、易于理解,恺撒加密常被用作学习加密算法的入... 目录Java 恺撒加密/解密实现1. 项目背景与介绍2. 相关知识2.1 恺撒加密算法原理2.2 Ja

在.NET项目中嵌入Python代码的实践指南

《在.NET项目中嵌入Python代码的实践指南》在现代开发中,.NET与Python的协作需求日益增长,从机器学习模型集成到科学计算,从脚本自动化到数据分析,然而,传统的解决方案(如HTTPAPI或... 目录一、CSnakes vs python.NET:为何选择 CSnakes?二、环境准备:从 Py