在進行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;
}
}