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

news2024/9/24 11:21:00

最终效果

在这里插入图片描述

系列导航

文章目录

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

前言

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

在这里插入图片描述

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

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

相关文章

多元化、高辨识显示丨基于G32A1445的汽车尾灯解决方案

由刹车灯、倒车灯、转向灯、雾灯等组成的汽车尾灯&#xff0c;既能在光线低暗时发出照明信息&#xff0c;也可向周围环境传递车辆的行驶状态与意图信号&#xff0c;对于行车安全起着至关重要的作用。与传统尾灯相比&#xff0c;贯穿式汽车尾灯更加醒目、美观、安全&#xff0c;…

2024年将改变人类生活的七大技术

有没有想过未来会是什么样子&#xff1f;那么&#xff0c;不必等太久&#xff0c;因为2024年将会是充满惊人创新的一年&#xff0c;让你大开眼界。以下是七大新兴的科技创新趋势&#xff0c;它们无疑将在2024年改变我们的生活。 1. 人工智能技术 从智能手机、智能扬声器等日…

HI-TOP网关HT3S-DPM-ECS实现PROFIBUS DP大功率变频器与青岛港口汇川EtherCAT主站PLC通讯互联的案例研究

一、引言 随着工业自动化技术的不断发展&#xff0c;青岛港口寻求提升其物流自动化系统&#xff0c;以提高效率和可靠性&#xff0c;不同品牌和协议的工业设备之间的通讯互联成为了技术实现的重要挑战。在青岛港口&#xff0c;作为该系统核心的变频器和PLC之间需要无缝通讯&…

unity 学习笔记

一、 事件顺序 gameObjet Instantiate gameObjet.自定义函数 gameObjet.Start 二、预设体使用 例子&#xff1a;Button 点击创建 预设体 BagPanel

探索未来:Google I/O 2024 AI重磅发布一览

亲爱的读者们&#xff0c;大家期待已久的Google I/O开发者大会终于到来了&#xff01;今年的大会尤为特别&#xff0c;Google在发布会上大力强调了人工智能&#xff08;AI&#xff09;的重要性&#xff0c;可以说AI成为了绝对的主角。为了让大家快速了解今年的重点内容&#xf…

webpack生成模块关系依赖图示例:查看构建产物的组成部分 依赖关系图

npm i -D webpack-bundle-analyzer core-js babel-loaderwebpack.config.js const BundleAnalyzerPlugin require(webpack-bundle-analyzer).BundleAnalyzerPlugin; module.exports {entry: ./src/index.js,output: {filename: main.js,},// mode: production, // 或者 produ…

现货黄金在线交易有哪些优势_EE trade

现货黄金在线交易拥有几项独特优势&#xff0c;使其成为广受投资者青睐的贵金属投资方式&#xff1a; 1. 全天候交易 现货黄金市场几乎可以实现24小时不间断交易&#xff0c;投资者可以根据全球市场的变动随时参与交易&#xff0c;这提供了极大的灵活性和即时反应市场变化的能…

【全开源】JAVA同城组局同城找搭子系统源码支持微信小程序微信公众号H5APP

同城组局同城找搭子系统 特色功能&#xff1a; 智能匹配&#xff1a;该系统能够根据用户的兴趣、爱好、时间等信息&#xff0c;智能匹配最适合的搭子。无论是看电影、打桌游还是户外运动&#xff0c;用户都能轻松找到志同道合的伙伴。活动丰富&#xff1a;除了基本的组局功能…

7.学习STL中的string类:版本、组件、构造、操作及应用

目录 1. 什么是STL 2. STL的版本 3. STL的六大组件 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 2. 标准库中的string类 2.1 string类(了解) 2.2 string类的常用接口说明 1. string类对象的常见构造 2. string类对象的容量操作 reserve 3. string类对象…

Google Chrome GPU渲染抓包

非安全模式启动 "C:\Program Files\Google\Chrome\Application\chrome.exe" --ignore-certificate-errors --allow-running-insecure-content --disable-web-security 配置环境 set RENDERDOC_HOOK_EGL0 "C:/Program Files/Google/Chrome/Application/chrom…

哪款台灯护眼效果最好,护眼效果十足的五款台灯分享

在孩子学习过程中&#xff0c;有一样物品的重要性不容忽视&#xff0c;那就是一盏提供舒适光源的台灯。面对不断增加的学业负担&#xff0c;孩子们经常需要在夜晚借助台灯的光亮进行学习&#xff0c;这已经成为了家庭生活中普遍的情景。然而&#xff0c;我们必须给予足够的关注…

深圳比创达电子|EMC与EMI测试整改:确保电磁兼容性和干扰的设备

在电子设备的设计、生产和应用过程中&#xff0c;电磁兼容性&#xff08;EMC&#xff09;和电磁干扰&#xff08;EMI&#xff09;是两个不可忽视的关键因素。随着电子设备的普及和复杂性的增加&#xff0c;电磁兼容性问题愈发凸显其重要性。EMC与EMI测试整改作为确保电子设备电…

Vue 快速入门:Vue初级

语法规则 前端渲染 渲染有几种方式&#xff1a;原生js、js模板、Vue模板语法 原生js 使用字符串拼接 js模板语法 Vue.js 模板语法概述 Vue.js 是一个用于构建用户界面的渐进式框架&#xff0c;其模板语法非常灵活和直观。Vue 的模板语法基于 HTML&#xff0c;可以通过指令…

Pytorch读取自己的数据集

数据集 流程图 导包设置tfs创建datasets.ImageFolder创建torch.utils.data.DataLoader() import time import os from tqdm import tqdm import pandas as pd import numpy as np import torch import torchvision import torch.nn as nn import torch.nn.functional as F im…

UV:展uv

1.3dmax 选中物体 修改器列表选中“UV展开” 打开UV编辑器 断开圆圈 同理断开瓶底 展开侧面 剥离 拉直 排列 纹理盘格 用于查看排列位置 渲染UV模板 PS图片 将不要的部分填充为黑色 复制图片 删除多余 保存图片 添加材质球和位图 按M打开材质球编辑器 重置UV 将uv变为初始…

激光切割机价格多少钱一台?

随着科技的飞速发展&#xff0c;激光切割技术在制造业中的应用越来越广泛。它以高精度、高效率和高质量著称&#xff0c;是金属加工行业的理想选择。然而&#xff0c;对于初次接触或打算购买激光切割机的用户来说&#xff0c;最关心的问题之一就是价格。那么&#xff0c;激光切…

Google Veo发布:AI生成视频的重大突破

在Google I/O 2024大会上&#xff0c;Google推出了Veo&#xff0c;这是一款能够根据文本提示生成1080p视频的AI模型。这次发布标志着Google在生成式AI领域的又一重大突破。 Veo的强大功能 Veo不仅能够生成各种视觉和电影风格的视频片段&#xff0c;包括风景镜头和延时摄影&am…

RPKI资源公共密钥基础架构体系的搭建

Ubuntu系统下RPKI体系的搭建 Ubuntu安装Nginx 一、安装 apt-get update apt-get install nginx nginx -v #查看安装版本二、目录说明 /usr/sbin/nginx&#xff1a;主程序&#xff0c;启动文件 /etc/nginx&#xff1a;存放配置文件 /var/www/html&#xff1a;存放项目目录 …

python数据分析——数据可视化(图形绘制基础)

数据可视化&#xff08;图形绘制基础&#xff09; 前言一、图形绘制基础Matplotlib简介使用过程sin函数示例 二、常用图形绘制折线图的绘制plot示例 散点图的绘制plot示例 柱状图的绘制bar示例 箱型图绘制plot.box示例 饼状图的绘制pie示例 三、图形绘制的组合情况多个折线图的…

Google在我的网站显示不同的SEO元标题/描述

Rank Math使您可以比以往更轻松地为您的博客文章、页面和其他自定义帖子类型编写完美的SEO元标题和描述。但正如您可能已经注意到的那样&#xff0c;谷歌&#xff08;以及其他搜索引擎&#xff09;经常不简单地选择使用您设置的元描述&#xff0c;并且这种情况正变得越来越普遍…