Unity2D_角色移动&跳跃

水平移动

Rigidbody2D

使用Unity自带的刚体组件,通过修改刚体物品中Rigidbody2D的属性velocity速度来实现物体移动

  1. 声明Rigidbody2D属性,以及角色移动速度

    public float playerSpeed = 5f;
    private Rigidbody2D rigidbody2D;
    
  2. 在Start方法中将rigidbody2D绑定上物体的对应组件

    void Start()
    {
        rigidbody2D = GetComponent();
    }
    
  3. 读取键盘,并修改rigidbody2D的velocity,以实现移动

    private void move()
    {
        //读取键盘的水平方向输入
        //这里hotizontal的取值为[-1,1],根据按键时长变化
        float horizontal = Input.GetAxis("Horizontal");
        //修改rigidbody2D的速度,这里只修改水平方向速度,竖直方向保持原状
        rigidbody2D.velocity = new Vector2(horizontal*playerSpeed, rigidbody2D.velocity.y);
    }
    

    GetAxisRaw()的返回值就只有1和-1,不是线性变化

    可以通过上述方法修改角色朝向,修改transform.localScale即可实现角色翻转

    float forward = Input.GetAxisRaw("Horizontal");
    if (forward != 0)
    {
     transform.localScale = new Vector3(transform.localScale.x * forward, transform.localScale.y, transform.localScale.z);
    }
    
  4. 将我们自定义的方法在Update()中调用即可

    void Update()
    {
        move();
    }
    

Transform

直接利用sprite的transform中的position属性,直接在该属性的基础上加上一个new Vector3即可

//获取键盘水平输入
float horizontal = Input.GetAxisRaw("Horizontal");
//在本身位置基础上向量位移
transform.position = transform.position + new Vector3(horizontal * playerSpeed * Time.deltaTime, 0, 0);

其中Time.deltaTime是帧之间间隔的时间(由于这里是直接改变物体位置,Update()是每帧执行一次,乘上后代表每秒移动的距离

transform有2个position相关的属性:

  1. position:世界坐标系下物体的坐标
  2. localPosition:父坐标系下物体的坐标

跳跃

跳跃实现

这里同样使用Rigidbody2D来实现角色的跳跃

在给物体施加有重力的情况下,给物体施加一个向上的初速度,同时要考虑到角色的跳跃判定,即接触到地面时才能进行跳跃

  1. 定义物体跳跃的初速度

    public float jumpSpeed = 5f
    
  2. 给物体设定跳跃次数

    //初始设定的跳跃次数
    public int jumpTimes;
    //Player还能跳跃的次数
    private int canJump;
    
    void Start()
    {
        //初始Player在空中,可将跳跃次数赋为0
        canJump = 0;
    }
    
  3. 判断物体是否还在地面上

    //Player落地,跳跃次数重置
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if(collision.gameObject.layer == 3)
        {
            canJump = jumpTimes;
        }
    }
    
    //Player离开地面,跳跃次数相应减一(跳离地面不算)
    private void OnCollisionExit2D(Collision2D collision)
    {
        if (collision.gameObject.layer == 3 && rigidbody2D.velocity.y<=0)
        {
            canJump--;
        }
    }
    

    layer==3是根据在unity的Layer中设置的3为Ground并将地面都设为Ground

  4. 检测到跳跃键,给物体施加向上的初速度

    private void jump()
    {
        //判断是否按下空格
        bool isJump = Input.GetKeyDown(KeyCode.Space);
        //能跳且还有跳跃次数
        if(isJump && canJump>0)
        {
            //给个跳跃初速度
            rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, jumpSpeed);
            //跳跃次数-1
            canJump--;
        }
    }
    
  5. 在Update()中调用jump()函数即可

    void Update()
    {
        jump();
    }
    

注意,实际游戏场景中有的墙会有摩擦导致物体挂在墙上

新建一个Physics Material 2D将摩擦调为0即可

手感优化

2D横版跳跃闯关游戏中最经典的就是马里奥了,通过某UP分析了马里奥的跳跃方式后发现:

  1. 马里奥的跳跃会根据按键时间的长短来控制跳跃的高度
  2. 马里奥上升与下降的帧数对比,大约是18:10

因此,可以根据这些分析得出以下优化思路:

  1. 跳跃实现时给的是初速度,跳跃高度无非就是由加速度决定,而在无附加情况下加速度只由重力决定。因此,可以根据是否按住按键为角色附加向上的加速度(抵消部分重力加速度带来的减速),以此增加角色的跳跃高度。
  2. 下落时比上升时要快,同样可以给下落时增加一个加速度,使物体能够快速下落。
  3. 如果觉得物体滞空时间太长,可以考虑增加物体的初速度,并增大全局重力(Project Settings -> Physics 2D -> Gravity),使跳跃高度不变的情况下滞空时间减少

示例:

//跳跃初速度
public float jumpSpeed = 8f;
//初始设定的跳跃次数
public int jumpTimes;
//Player还能跳跃的次数
private int canJump;
//上升时抵消几倍的重力加速度
public float upAddAce = 0.5f;
//下降时附加几倍重力加速度
public float fallAddAce = 1.0f;

private void jump()
{
    //判断是否按下空格
    bool isJump = Input.GetKeyDown(KeyCode.Space);
    //能跳且还有跳跃次数
    if(isJump && canJump>0)
    {
        //给个跳跃初速度
        rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, jumpSpeed);
        //跳跃次数-1
        canJump--;
    }

    //判断是否按住空格
    bool holdJump = Input.GetKey(KeyCode.Space);
    //按住空格且物体在上升状态则附加一个向上的加速度
    if (holdJump && rigidbody2D.velocity.y > 0)
    {
        rigidbody2D.velocity += Vector2.down * Physics2D.gravity.y * upAddAce * Time.deltaTime;
    }
    //物体在下落时,附加向下加速度
    if(rigidbody2D.velocity.y < 0)
    {
        rigidbody2D.velocity += Vector2.up * Physics2D.gravity.y * fallAddAce * Time.deltaTime;
    }
}

你可能感兴趣的:(Unity2D,unity)