Unity2D学习笔记Day9:添加敌人——受伤效果及反弹效果(补8.16)
学习资源: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)相关推荐
- Unity2D学习笔记Day12:敌人统一死亡动画+Class的继承(含虚函数virtual,重写override)
学习资源:B站 M_Studio<Unity教程2D入门>17 Unity Assets:Sunnyland Day12 调用frog死亡动画效果 这里我没有完全按照教程的方法,是自己写的 ...
- unity2D学习笔记-角色动画
unity2D学习笔记-角色动画 角色移动 动画效果(重点!!!!!) 创建:Animator与Animation 状态转换 跳跃 从fall到idle Hierarchy中创建一个Sprite作为载 ...
- Unity2D学习笔记Day13:添加音效Audio
学习资源:B站 M_Studio<Unity教程2D入门>18 Unity Assets:Sunnyland Day13 Audio Listener:耳朵,用来听声音的--一般放在mai ...
- OpenWRT 学习笔记 -- 用户自定义添加app的开机自启动
参考自:OpenWRT编译 – 用户自定义添加app的开机自启动 OpenWRT 学习笔记-19 OpenWRT开机自启动服务 文章目录 一.概述 二.自启动实现方式一 三.自启动实现方式二 四.自启 ...
- Apm飞控学习笔记之添加我的飞行模式-Cxm
目录 PX4/APM/飞控的学习笔记前言-Cxm_chen_taifu的博客-CSDN博客开始了 开始了终于有时间可以学习飞控了此文章是用来当目录,我会持续更新我的学习之旅,希望能对各位有所帮助如果有 ...
- unity2D学习(11)角色受伤弹开、用UI Text显示血量
1 角色受伤弹开 想法:角色如果碰撞到敌人,就会显示受伤动画,且受伤后会向和敌人碰撞的相反方向弹开. 动画转移: idle->hurt:injured为true hurt->idle:in ...
- Apm飞控学习笔记之添加我的设备或单片机串口通信-Cxm
目录 PX4/APM/飞控的学习笔记前言-Cxm_chen_taifu的博客-CSDN博客开始了 开始了终于有时间可以学习飞控了此文章是用来当目录,我会持续更新我的学习之旅,希望能对各位有所帮助如果有 ...
- 1学习笔记之知乎话题:多轴插补为什么普遍使用梯形速度曲线?
机械臂-轨迹规划-速度规划-学习笔记 学习对象:知乎话题:多轴插补为什么普遍使用梯形速度曲线? ICRA2014 Joonyoung PPT 了解一下运动控制器 从工业角度讲:算法与硬件平台的关系 韩 ...
- unity 学习笔记 受伤机制与反弹效果
学习链接:M_Studio的个人空间_哔哩哔哩_Bilibili 现在,我要增加踩到怪物头上获得一个起跳反馈效果 并且横向碰到怪物也会被弹开,且受伤害 这样就可以了吗? No! 进入游戏发现没有横向碰 ...
最新文章
- 365天带薪休假 VS 折现,当事人这么选...
- crontab 运行pyhon脚本
- OkHttp实现文件上传进度
- 新闻发布项目——业务逻辑层(categoryTBService)
- 04-图像的阈值操作
- 计算机在社区健康档案管理中的作用,某社区卫生中心对辖区居民的健康档案信息进行电子化。一直建档居民的年龄范围在1..._考试资料网...
- VC 2008 Express 编译OpenCV2.0/2.1
- vlc学习计划(2)---二进制包安装及使用
- Leetcode 561.数组拆分I
- ToDesk安全流畅远控软件!
- html网页简单代码
- 苹果电脑安装计算机一级,苹果电脑安装Win10系统的详细步骤
- 机器人方队解说词_创想机器人博物馆介绍配音解说词
- 易语言 精易模块 网页_访问 获取显示验证码图片
- Java新人入职第十天
- 红外接收二极管为什么正反都能通_为什么在电路板中测量二极管正反都通
- 马赛克也被破解了!宅男的福音
- backdrop-filter: blur() safari 浏览器 无效 解决
- VS2005中(_CRT_SECURE_NO_DEPRECATE)警告
- 做一个软件需要了解的知识