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

学习目标:

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

参考视频:秦无邪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<Animator>();
        boxcollid2D = GetComponent<BoxCollider2D>();
        rb2D = GetComponent<Rigidbody2D>();
    }

    
    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

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,作为AI语言模型,我无法为您编写完整的Unity跳跃游戏项目。但是,我可以为您提供一些参考和指导。 首先,您需要创建一个空的Unity项目,并为其添加所需的组件和资源,例如角色模型、场景、音效和UI元素。然后,您可以按照以下步骤开始编写跳跃游戏: 1. 创建角色控制器:您需要为角色模型添加一个控制器组件,以便玩家可以通过键盘或游戏手柄控制角色的跳跃和移动。 2. 实现跳跃和移动逻辑:您需要编写代码来处理玩家输入,并使角色能够跳跃和在场景中移动。您可以使用Unity的物理引擎来模拟角色的运动,例如应用力和重力。 3. 创建障碍物和平台:您需要在场景中添加障碍物和平台,以增加游戏的挑战性和乐趣。您可以使用Unity的碰撞检测功能来检测角色与障碍物或平台之间的碰撞,并实现相应的游戏逻辑。 4. 实现计分和游戏结束逻辑:您需要编写代码来处理玩家得分和游戏结束的情况。例如,当角色掉落到场景底部或碰到障碍物时,游戏应该结束并显示最终得分。 5. 添加音效和UI元素:最后,您可以为游戏添加音效和UI元素,以增强游戏的视觉和听觉效果,并提供更好的用户体验。 以上是编写Unity跳跃游戏的一些基本步骤和考虑因素。当然,具体实现细节和游戏玩法可以根据您的创意和需求进行调整和扩展。祝您编写一个成功的跳跃游戏!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值