您当前的位置: 首页 >  dangoxiba unity

【Unity2D】实现人物跳跃二段跳以及掉落的动画和代码

dangoxiba 发布时间:2022-01-25 16:59:03 ,浏览量:4

学习目标:

实现人物跳跃二段跳以及掉落的动画和代码

参考视频:秦无邪OvO的个人空间_哔哩哔哩_Bilibili

上一篇文章:CSDN

学习Idle,Walk,Jump的切换:

首先先实现Idle,Walk,Jump的切换,需要现在ProjectSetting上找到这个Jump

然后再Animator动画系统中创建四个条件

接着再加入每个Animation的Condition中,它们都不需要等待时间

 

 

 

再代码中封装一个叫SwitchAnimation的方法,再用一个地面检测的方法

void CheckOnGround()     {         isGround = boxcollid2D.IsTouchingLayers(LayerMask.GetMask("Ground"));     }

并在Jump中先添加

void Jump()     {         if (Input.GetButtonDown("Jump"))         {             if (isGround)             {                 myAnim.SetBool("Jump", true);                 Vector2 jumpVel = new Vector2(0, jumpSpeed);                 rb2D.velocity = Vector2.up * jumpVel;                              }         }     } 

切换动画

void SwitchAnimation()     {         myAnim.SetBool("Idle", false);         if (myAnim.GetBool("Jump"))         {             if(rb2D.velocity.y < 0.0f)             {                 myAnim.SetBool("Jump", false);                 myAnim.SetBool("Fall", true);             }         }         else if(isGround)         {             myAnim.SetBool("Fall", false);             myAnim.SetBool("Idle", true);         }     }

 

 

实现二段跳:

下面来实现一个二段跳的动画

首先要有个DoubleJump,DoubleFall的动画(我DoubleFall和Fall的动画是一样的,二段跳我用了帝王之翼的动画)

加多两个条件,然后其它Transition和第一段是一样的。

代码如下:

using System.Collections; using System.Collections.Generic; using UnityEngine;

public class PlayerController : MonoBehaviour {     public float walkSpeed;     public float jumpSpeed;     public float doubleJumpSpeed;

    private Animator myAnim;     private BoxCollider2D boxcollid2D;     private Rigidbody2D rb2D;

    private bool isGround = false;     private bool canDoubleJump = false;     void Start()     {         myAnim = GetComponent();         boxcollid2D = GetComponent();         rb2D = GetComponent();     }

         void Update()     {         CheckOnGround();         Flip();         Walk();         Jump();         SwitchAnimation();     }     void CheckOnGround()     {         isGround = boxcollid2D.IsTouchingLayers(LayerMask.GetMask("Ground"));     }     void Flip()     {         // Mathf.Epsilon是一个很小的浮点值         bool isPlayerHasXAxis = Mathf.Abs(rb2D.velocity.x) > Mathf.Epsilon;         //如果x轴上有速度         if (isPlayerHasXAxis)         {             //如果速度的方向是向右             if(rb2D.velocity.x > 0.1f)             {                 transform.localRotation = Quaternion.Euler(0, 0, 0);             }             //如果速度的方向是向左             if (rb2D.velocity.x < -0.1f)             {                 transform.localRotation = Quaternion.Euler(0,180, 0);             }         }     }     void Walk()     {         float moveDir = Input.GetAxis("Horizontal");         Vector2 playerVel = new Vector2(moveDir * walkSpeed, rb2D.velocity.y);         rb2D.velocity = playerVel;         bool isPlayerHasXAxis = Mathf.Abs(rb2D.velocity.x) > Mathf.Epsilon;         //true则向右,false则向左         myAnim.SetBool("Walk", isPlayerHasXAxis);     }

    void Jump()     {         if (Input.GetButtonDown("Jump"))         {             //如果在地面上             if (isGround)             {                 myAnim.SetBool("Jump", true);                 Vector2 jumpVel = new Vector2(0, jumpSpeed);                 rb2D.velocity = Vector2.up * jumpVel;                 //将可以doublejump设置为true                 canDoubleJump = true;             }             else             {                 if (canDoubleJump)                 {                     myAnim.SetBool("DoubleJump", true);                     Vector2 doubleJumpVel = new Vector2(0, doubleJumpSpeed);                     rb2D.velocity = Vector2.up * doubleJumpVel;                     canDoubleJump = false;                 }             }         }     }     void SwitchAnimation()     {         myAnim.SetBool("Idle", false);         if (myAnim.GetBool("Jump"))         {             if(rb2D.velocity.y < 0.0f)             {                 myAnim.SetBool("Jump", false);                 myAnim.SetBool("Fall", true);             }         }         else if(isGround)         {             myAnim.SetBool("Fall", false);             myAnim.SetBool("Idle", true);         }

        if (myAnim.GetBool("DoubleJump"))         {             if (rb2D.velocity.y < 0.0f)             {                 myAnim.SetBool("DoubleJump", false);                 myAnim.SetBool("DoubleFall", true);             }         }         else if (isGround)         {             myAnim.SetBool("DoubleFall", false);             myAnim.SetBool("Idle", true);         }     } }别忘了设置Player上的参数

 

 

 

 

 

 

 

实际效果:

 

 

要想清楚各个动画之间的关系,是否要停留时间,还要设置好条件,

同时代码中,也要有bool类型来判断是否可以二段跳,二段跳后不能再跳跃,跳跃同样要站在Ground的Layer层上才允许跳跃,膨胀检测IsTouchingLayer,利用跳跃到最高点后速度小于0来判断动画到下落的条件

 myAnim.SetBool("条件名", bool值);来给条件名设置bool

关注
打赏
1688896170
查看更多评论

dangoxiba

暂无认证

  • 4浏览

    0关注

    55博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.2729s