Unity2D人物跳跃移动功能

在制作竖版2D游戏时,经常需要对用到进行人物的跳跃功能的实现,如果是一个简单的跳跃是非常好实现的,但是有时候我们可能会需要实现到多段跳和长按空格让人物跳跃的更高等功能,对于入门unity的人来说可能就难以实现了,这里我一起把这些功能整合到一起实现了,希望对需要的朋友们有所帮助。

在完成一次多段跳的情况下,先设置两个布尔值,一个是用来判断玩家是否在地面上,而另一个则是判断玩家是否按下了跳跃键起跳,但是在实际使用中,我设置第三个布尔变量,检测玩家的状态是否发生了改变,之后会说明为什么需要设置第三个布尔值变量。

设置具有多段跳和长按增加跳跃高度的按键需要用到的属性(没错非常的多)

    [Header("第一次跳跃高度")]
    public float Jump_High;
    [Header("长按跳跃增幅")]
    public float Jump_Add;
    [Header("二段跳增幅")]
    public float Jump_Add2;
    [Header("增幅时间")]
    public float Jump_MaxAdd_time;
    private float Jump_CurrentAdd_time;//已经增幅过的时间
    [Header("最大跳跃次数")]
    public int Jump_Max_Sum;
    private int Jump_Num;//可跳跃次数
    private bool Jumping;//已经在跳跃中
    private bool Is_Ground;//是否在地面上
    private bool Is_Change;//发生了跳跃状态上的改变

首先需要明白的是,GetButtonDown和GetButton的处理方式,GetButtonDown只会在首次按下对应键位时返回true直到你放开按键再次按下才能生效,而GetButton会持续生效,这正好对应了长按跳跃增幅和一次大的跳跃,长按跳跃属于第一次跳跃的部分,因此对于长按跳跃部分的处理不需要对跳跃次数做操作,然后,第一次跳跃时,玩家应该是位于地面上并且可跳跃的大于0,当玩家第一次跳跃结束后,后续再次按下跳跃键时,才能判定为N段跳,由于我设置的长按跳跃加成属于第一次起跳部分,故只有第一次跳跃加成时间结束后才能进行第二次跳跃,根据你的需要自行选择和使用。

以下是判断跳跃部分的代码。

        //纵向跳跃的控制
        if (Input.GetButtonDown("Jump") && Jump_Num > 0)
        {
            if (!Jumping && Is_Ground)//第一次但跳跃
            {
                Jump_CurrentAdd_time = 0;
                Jumping = true;
                To_Jumping(Jump_High);
                Jump_Num--;
            }
            else if (Jump_CurrentAdd_time > Jump_MaxAdd_time)//后续的多段跳
            {
                Anim.SetBool("Jumping2", true);
                To_Jumping(Jump_Add2);
                Jump_Num--;
            }
        }//可增幅的第一次跳跃
        else if (Input.GetButton("Jump") && Jump_Num > 0 && Jump_CurrentAdd_time < Jump_MaxAdd_time)
        {
            Jump_CurrentAdd_time += Time.deltaTime;
            To_Jumping(Jump_Add);
        }
        else if(Jump_CurrentAdd_time < Jump_MaxAdd_time)
        {
            Jump_CurrentAdd_time += Time.deltaTime;
        }

如何判断玩家什么时候落到地面呢?我个人最推荐的方式是使用射线检测,分别在玩家碰撞体的两端发射朝向下极短的射线,如果射线检测到了地面,就说明玩家在地面上了,这个射线不能够太长,否则明明已经跳起来了却还是会被判定在地面上。以下是射线检测是否在地面上的代码。

    /// <summary>
    /// 判断玩家是否在地面上,如果是则设置Is_Ground为true
    /// </summary>
    private void On_Ground()
    {
        Vector2 Right_Ground = new(transform.position.x - Rigid_Wide, transform.position.y);
        Vector2 Left_Ground = new(transform.position.x + Rigid_Wide, transform.position.y);
        Is_Ground = (RayCast2D(Right_Ground, Vector2.down, Rigid_High + 0.1f) || RayCast2D(Left_Ground, Vector2.down, Rigid_High + 0.1f));
    }

    /// <summary>
    /// 对地面进行射线检测的方法
    /// </summary>
    /// <param name="Start">射线开始发出的位置</param>
    /// <param name="End">射线的发射朝向,注意不是结束位置</param>
    /// <param name="Length">射线检测的长度</param>
    /// <returns>返回射线检测的结果</returns>
    private RaycastHit2D RayCast2D(Vector2 Start,Vector2 End,float Length)
    {
        RaycastHit2D Rayhits = Physics2D.Raycast(Start, End, Length, Layer);
        return Rayhits;
    }

    /// <summary>
    /// 给予玩家一个向上的力使得玩家跳跃起来移动
    /// </summary>
    /// <param name="JumpAdd">向上力的大小</param>
    private void To_Jumping(float JumpAdd)
    {
        Rigid2D.AddForce(new Vector2(0, JumpAdd), ForceMode2D.Impulse);
    }

最后,当检测到玩家是在地面上的时候,恢复玩家的跳跃次数和判定的布尔值就可以了,如果你天真的以为这样就就可以了那只能说你太天真了,那第三个布尔值还没有用上呢,如果你前面的步骤按着我的说明去做,你就发现当进行多段跳时,玩家总是能够多跳一次,这个问题就出在射线检测的问题上,因为Unity执行一次Update的时间是非常短的,当你按下跳跃键的一瞬间,玩家还并未与地面脱离,但是代码在执行时,很可能以及多次进行射线检测的判断,然后被判定在地面上,导致你第一次起跳的时候跳跃次数重置了一次,并没有起到作用,解决的就是设置布尔值,检测在射线检测值得变化,当只有从判定为是空中到地面的情况(false->true)的情况才是真正的需要重置跳跃次数。


        if (Is_Ground)
        {
            if (Is_Ground != Is_Change)//如果脱离地面的状态发生了改变才会改变,因为在脱离地面前方可能执行了多次
            {
                Jumping = false;
                Is_Change = Is_Ground;
                Jump_Num = Jump_Max_Sum;
            }
        }
        else
        {
            Is_Change = Is_Ground;
        }

不过在写的时候我突然想到了其实只要把跳跃次数设置为可进行多段跳的次数,然后第一次跳的时候不进行判断跳跃次数就可以了......

最后的效果图如下:

 

扫描二维码关注公众号,回复: 15444689 查看本文章

猜你喜欢

转载自blog.csdn.net/WEIWEI6661012/article/details/130376284
今日推荐