unity 2d游戏跳跃移动 手把手教你

话不多说,直接上代码,注释来一步步分析

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

public class Move : MonoBehaviour

{
    
    

  public float speed = 5f;//人物移动速度
  public float jumpSpeed = 5f;//人物跳跃给的力
  public LayerMask ground;//环境的图层Layer(就是地面)
  public bool isGround;//判断游戏玩家是否在地面
  public bool isJump;//判断是否进行跳跃
  public Transform jiao;//在人物添加一个空物体 jiao 见下面图片

  private Rigidbody2D playRig;
  private Animator playAnim;
  private CircleCollider2D playCir;//玩家的collider



  // Start is called before the first frame update

  void Start()
  {
    
    
    playRig = GetComponent<Rigidbody2D>();
    playCir = GetComponent<CircleCollider2D>();
    playAnim = GetComponent<Animator>();
  }


  private void Update()//判断是否按下空格跳跃键(可以自行设置跳跃键)
  {
    
    
    if(Input.GetButtonDown("Jump"))
    {
    
    
      isJump = true;
    }
  }

  private void FixedUpdate()
  {
    
    
    isGround = Physics2D.OverlapCircle(jiao.position, 0.1f, ground);//该函数返回jiao的位置是否和图层ground发生碰撞重合,发生碰撞的话一定在地面上
    
    playMove();
    playJump();
    swtichaNima();
  }

  void playMove()

  {
    
    

    float hor = Input.GetAxisRaw("Horizontal");//移动用GetAxisRawK返回-1或0或1,反应迅速,人物没有一种需要加速的感觉,玩起来很平滑
    
    playRig.velocity = new Vector2(hor * speed * Time.fixedDeltaTime * 50, playRig.velocity.y);

    if (hor!=0)
    {
    
    
      transform.localScale = new Vector3(hor, 1, 1);//改变人物方向,左右切换,hor是0的时候,人物不发生改变
    }
  }


  void playJump()
  {
    
    
    if(isGround&&isJump)//只有当人物在地面并且按下跳跃键才可以出发跳跃
    {
    
    
      isJump = false;
      playRig.velocity = new Vector2(playRig.velocity.x, jumpSpeed * Time.fixedDeltaTime * 50);
    } 
    
    if(!isGround)//在空中的话isjump设为false,在此按下空格键不能跳跃
    {
    
    
      isJump = false;
    }   
  }



  void swtichaNima()//人物动画播放控制器
  {
    
    
    playAnim.SetFloat("speed",Mathf.Abs( playRig.velocity.x));//人物根据按下左右移动键来给speed赋值,来进行移动的动画播放   idle→run的条件int类型的speed,speed大于0就播放run,等于0就回到idle动画,此speed不是上面定义的speed
    if (isGround)//在地面的话,fall下落动画一定是禁止的
    {
    
    
      playAnim.SetBool("fall", false);
    }

    if(!isGround && playRig.velocity.y>1)//只有当不再地面,并且人物跳跃的时候,y轴的力是大于0才播放jump动画
    {
    
    
      playAnim.SetBool("jump", true);
    }

     if(!isGround && playRig.velocity.y<0)//当不在空中,y轴的力小于零说明人物下落,所以禁用jump动画,播放fall动画
    {
    
    
      playAnim.SetBool("jump", false);
      playAnim.SetBool("fall", true);
    }
    
    if(isGround&&playAnim.GetBool("fall")==false)//在地面并且下降fall动画是false播放idle动画
    {
    
    
      playAnim.SetBool("idle", true);
    }
  }
}


isGround的图片位置

图面中的isGround写错的…
人物脚的位置  isGound

动画转换逻辑图

动画转换逻辑图

猜你喜欢

转载自blog.csdn.net/m0_48554728/article/details/114543336