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写错的…