Unity進階提升-2D遊戲跳躍手感最佳化(跳起下落)

清風扶雲霧發表於2023-10-28

在進行2D遊戲開發時,跳躍是不可缺少的一個重要功能。但是我們在Unity開發時Unity本身的物理引擎並不能提供很好的的手感,下落的時候輕飄飄的,這操作起來顯然非常不舒服。所以,我們需要自己對跳躍進行最佳化,以此來獲得更好的手感。我們不難發現,在絕大多數2D遊戲的跳躍中,下落的速度比上升的速度要快上很多,下落的用時是上升的一半左右。

提示,在最佳化跳躍時,將使用剛體元件

首先,我們需要對Unity物體跳躍階段進行分析:

圖中,跳躍共分為兩個階段,第一階段就是跳起,人物上升階段,第二階段就是下落階段

在第一階段中,剛體向上速度為正,即velocity.y>0;第二階段下落,物體的velocity.y<0,所以我們可以透過velocity.y的正負來確定物體所處哪一個階段,進而對物體可以有更精確的操作。

接下來,我們就要對物體跳躍階段進行操作,首先我們需要判定物體受否在面上,並且按下了W或其它跳躍按鍵,觸發跳躍後,我們給物體的velocity.y賦一個初始值V,代表初始速度,那麼最終跳躍高度的變化為h=Vt-1/2gt2(g為重力加速度,t為時間),物體速度velocity.y=V-gt,當velocity.y=0時,物體到達最高點,此時物體高度(最高點)H=(V2)/(2g)。

接下來,物體仍然受到重力加速度的作用,物體速度velocity.y的值繼續減小,變為了負值,而這也標誌著物體開始下落。從圖中可以看出當物體只具有一個向上的初速度並且只受重力時,它的上升時間和下落時間是一樣的,T=V/g。所以,我們為了確保下落用時是上升的一半,所以我們需要改變物體的重力加速度,使它變為原來的二倍,即修改Physics2D.gravity的值,使它的y的值乘2。

這樣我們就完成了一個跳躍的最佳化。程式碼如下:

//提示!本程式碼使用射線檢測物體是否位於地面
//提示!各變數含義
//rb                   剛體元件
//jumpSpeed            跳躍初始速度
//fullSpeed            下落重力加速度倍數
//isGround             玩家是否在地面
//rayDistance          射線距離
//groundLayerMask      地面的圖層
void Update()
    {
        Ground();
        if (Input.GetKeyDown(KeyCode.W) && isGround)
        {
            Jump();
        }
        if (rb.velocity.y <= 0)
        {
            Full();
        }
    }
    private void Jump()
    {
        rb.velocity = Vector2.up * jumpSpeed;
    }
    private void Full()
    {
        //重力加速度變為fullSpeed倍
        Physics2D.gravity = new Vector2(0, -9.8f * fullSpeed);
    }
    //射線檢測,是否在地面
    private void Ground()
    {
        // 從物體下方投射一條射線,看它是否與地面碰撞
        RaycastHit2D hit=
        Physics2D.Raycast(transform.position,Vector2.down,rayDistance,groundLayerMask);
        if (hit.collider != null)
        {
            isGround = true;
        }
        else
        {
            isGround = false;
        }
    }

相關文章