学习资源:B站 M_Studio《Unity教程2D入门》14

Unity Assets:Sunnyland

Day9

受伤并反弹

预期效果:若在地面上碰到敌人,会触发受伤动画并反弹。

    private void OnCollisionEnter2D(Collision2D collision){//碰到敌人的时候if(collision.gameObject.tag == "Enemy"){//如果是下落状态if (anim.GetBool("isFalling")){//敌人才会消失Destroy(collision.gameObject);//踩完后垫着敌人小跳一下rb.velocity = new Vector2(rb.velocity.x, jumpforce * Time.deltaTime);anim.SetBool("isJumping", true);}//否则,如果在左侧碰到敌人else if(transform.position.x < collision.transform.position.x){//向左反弹rb.velocity = new Vector2(-speed * Time.deltaTime, rb.velocity.y);}//右侧同理else if (transform.position.x < collision.transform.position.x){//向右反弹rb.velocity = new Vector2(speed * Time.deltaTime, rb.velocity.y);}}}

但是这里存在一个问题:

Movement每帧都在调用,速度值就会一直被改写,而无法实现反弹一段距离的效果。

解决方法:在FixUpdate函数中加一个hurt判断条件。

if(!isHurt)
{Movement();
}
            //否则,如果在左侧碰到敌人else if(transform.position.x < collision.transform.position.x){isHurt = true;//向左反弹rb.velocity = new Vector2(-speed * Time.deltaTime, rb.velocity.y);}//右侧同理else if (transform.position.x > collision.transform.position.x){isHurt = true;//向右反弹rb.velocity = new Vector2(speed * Time.deltaTime, rb.velocity.y);}

什么时候才可以让ishurt重归为false呢?

移动一段距离、经历一段时间、又或是velocity的速度减小为0

这里用的是最后一个方法,请注意,最后一个方法默认的是有摩擦力,也就是速度确实是在不断减小的,我们可以把Player–>Rigidbody–>linear Drag改大一些

在SwitchAnim中添加:

     else if(isHurt){if(Mathf.Abs(rb.velocity.x) <0.1f){isHurt = false;}}

接下来,Player切换受伤效果动画

1.需要添加一个bool参数记录受伤状态

2.动画间的关系如下,idle、run、jump都可能切换到hurt状态,hurt结束后,切换至idle
(最后hurt应该能回到状态idle 条件为 hurt==false且idle==true)

3.切换时的参数调整记得注意

这里其实可以直接用动画效果里设置的hurt参数来替代原来设置的私有变量isHurt。用getbool来获取isHurt的布尔值,用setbool来改变它的布尔值。

现在的代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class PlayerController : MonoBehaviour
{public float speed = 400;public float jumpforce = 400;[Space]public LayerMask ground;//获取地面信息public Collider2D coll;[Space]public int cherry;public Text cherryNumber;private Rigidbody2D rb;private Animator anim;// Start is called before the first frame updatevoid Start(){rb = GetComponent<Rigidbody2D>();anim = GetComponent<Animator>();cherry = 0;//物品数量初始化为0}// Update is called once per framevoid FixedUpdate(){if(!anim.GetBool("isHurt")){Movement();}SwitchAnim();}void Movement(){float horizontalmove = Input.GetAxis("Horizontal");float direction = Input.GetAxisRaw("Horizontal");//角色移动if(horizontalmove!=0){rb.velocity = new Vector2(speed * horizontalmove * Time.deltaTime, rb.velocity.y);anim.SetBool("isRunning", true);}else{anim.SetBool("isRunning", false);}//角色朝向if(direction!=0){transform.localScale = new Vector3(direction, 1, 1);}//角色跳跃if(Input.GetButtonDown("Jump") && coll.IsTouchingLayers(ground)){rb.velocity = new Vector2(rb.velocity.x, jumpforce * Time.deltaTime);anim.SetBool("isJumping", true);anim.SetBool("isIdle", false);}}void SwitchAnim(){//最高点切换为下落动画if(anim.GetBool("isJumping")){if(rb.velocity.y < 0){anim.SetBool("isJumping", false);anim.SetBool("isFalling", true);}}else if(anim.GetBool("isHurt")){anim.SetBool("isRunning", false);if(Mathf.Abs(rb.velocity.x) <0.1f){anim.SetBool("isHurt", false);anim.SetBool("isIdle", true);}}//碰到地面切换为idleelse if(coll.IsTouchingLayers(ground)){anim.SetBool("isFalling", false);anim.SetBool("isIdle", true);}}private void OnTriggerEnter2D(Collider2D collision){//如果碰撞体的tag是Collection,则销毁if(collision.tag == "Collection"){Destroy(collision.gameObject);cherry += 1;cherryNumber.text = cherry.ToString();}}private void OnCollisionEnter2D(Collision2D collision){//碰到敌人的时候if(collision.gameObject.tag == "Enemy"){//如果是下落状态if (anim.GetBool("isFalling")){//敌人才会消失Destroy(collision.gameObject);//踩完后垫着敌人小跳一下rb.velocity = new Vector2(rb.velocity.x, jumpforce * Time.deltaTime);anim.SetBool("isJumping", true);}//否则,如果在左侧碰到敌人else if(transform.position.x < collision.transform.position.x){//向左反弹rb.velocity = new Vector2(-6, rb.velocity.y);anim.SetBool("isHurt", true);}//右侧同理else if (transform.position.x > collision.transform.position.x){anim.SetBool("isHurt", true);//向右反弹rb.velocity = new Vector2(6, rb.velocity.y);}}}
}

Unity2D学习笔记Day9:添加敌人——受伤效果及反弹效果(补8.16)相关推荐

  1. Unity2D学习笔记Day12:敌人统一死亡动画+Class的继承(含虚函数virtual,重写override)

    学习资源:B站 M_Studio<Unity教程2D入门>17 Unity Assets:Sunnyland Day12 调用frog死亡动画效果 这里我没有完全按照教程的方法,是自己写的 ...

  2. unity2D学习笔记-角色动画

    unity2D学习笔记-角色动画 角色移动 动画效果(重点!!!!!) 创建:Animator与Animation 状态转换 跳跃 从fall到idle Hierarchy中创建一个Sprite作为载 ...

  3. Unity2D学习笔记Day13:添加音效Audio

    学习资源:B站 M_Studio<Unity教程2D入门>18 Unity Assets:Sunnyland Day13 Audio Listener:耳朵,用来听声音的--一般放在mai ...

  4. OpenWRT 学习笔记 -- 用户自定义添加app的开机自启动

    参考自:OpenWRT编译 – 用户自定义添加app的开机自启动 OpenWRT 学习笔记-19 OpenWRT开机自启动服务 文章目录 一.概述 二.自启动实现方式一 三.自启动实现方式二 四.自启 ...

  5. Apm飞控学习笔记之添加我的飞行模式-Cxm

    目录 PX4/APM/飞控的学习笔记前言-Cxm_chen_taifu的博客-CSDN博客开始了 开始了终于有时间可以学习飞控了此文章是用来当目录,我会持续更新我的学习之旅,希望能对各位有所帮助如果有 ...

  6. unity2D学习(11)角色受伤弹开、用UI Text显示血量

    1 角色受伤弹开 想法:角色如果碰撞到敌人,就会显示受伤动画,且受伤后会向和敌人碰撞的相反方向弹开. 动画转移: idle->hurt:injured为true hurt->idle:in ...

  7. Apm飞控学习笔记之添加我的设备或单片机串口通信-Cxm

    目录 PX4/APM/飞控的学习笔记前言-Cxm_chen_taifu的博客-CSDN博客开始了 开始了终于有时间可以学习飞控了此文章是用来当目录,我会持续更新我的学习之旅,希望能对各位有所帮助如果有 ...

  8. 1学习笔记之知乎话题:多轴插补为什么普遍使用梯形速度曲线?

    机械臂-轨迹规划-速度规划-学习笔记 学习对象:知乎话题:多轴插补为什么普遍使用梯形速度曲线? ICRA2014 Joonyoung PPT 了解一下运动控制器 从工业角度讲:算法与硬件平台的关系 韩 ...

  9. unity 学习笔记 受伤机制与反弹效果

    学习链接:M_Studio的个人空间_哔哩哔哩_Bilibili 现在,我要增加踩到怪物头上获得一个起跳反馈效果 并且横向碰到怪物也会被弹开,且受伤害 这样就可以了吗? No! 进入游戏发现没有横向碰 ...

最新文章

  1. 365天带薪休假 VS 折现,当事人这么选...
  2. crontab 运行pyhon脚本
  3. OkHttp实现文件上传进度
  4. 新闻发布项目——业务逻辑层(categoryTBService)
  5. 04-图像的阈值操作
  6. 计算机在社区健康档案管理中的作用,某社区卫生中心对辖区居民的健康档案信息进行电子化。一直建档居民的年龄范围在1..._考试资料网...
  7. VC 2008 Express 编译OpenCV2.0/2.1
  8. vlc学习计划(2)---二进制包安装及使用
  9. Leetcode 561.数组拆分I
  10. ToDesk安全流畅远控软件!
  11. html网页简单代码
  12. 苹果电脑安装计算机一级,苹果电脑安装Win10系统的详细步骤
  13. 机器人方队解说词_创想机器人博物馆介绍配音解说词
  14. 易语言 精易模块 网页_访问 获取显示验证码图片
  15. Java新人入职第十天
  16. 红外接收二极管为什么正反都能通_为什么在电路板中测量二极管正反都通
  17. 马赛克也被破解了!宅男的福音
  18. backdrop-filter: blur() safari 浏览器 无效 解决
  19. VS2005中(_CRT_SECURE_NO_DEPRECATE)警告
  20. 做一个软件需要了解的知识

热门文章

  1. C4D-1.基础知识
  2. BeautifulSoup+pandas 爬取新浪国内新闻
  3. 沉降变形观测方案(转载)
  4. 计算机网络——运输层(来看看,你不会后悔的)
  5. layui的layui.table.cache只能获取当前页的所有数据问题解决(layui实现添加行操作遇到分页)
  6. 数据流程图和数据结构是需求分析中不可缺少的一环
  7. Linux新手入门系列:Linux图形界面
  8. 华为 HCIA 基础
  9. 【Go实战 | 电商平台】(7) 图片上传到七牛云
  10. Java输入输出处理