最近在做一個小游戲,需要實現人物的跳躍效果。自己從簡單到復雜,把目前比較好的方法都試了一遍,這里簡單總結一下。
1.直接使用動畫位移
這個其實是美術在做動畫的時候已經做好的東西,跳躍的動畫本身就含有位移,只需要在應用動畫的時候勾選Apply Root Motion就可以了。但是簡單也有問題,就是跳躍的高度無法控制,不夠靈活。不過對於新手來說先試一下,至少人物能動起來,心里美滋滋。
2.使用剛體組件加作用力
這個其實就是利用Unity的剛體組件,模擬真實的物理效果。在跳躍的時刻給物體添加一個向上的瞬時作用力,這樣就能模擬跳躍的效果。這個使用場合還是很多的。但是也有毛病,剛體模擬跳躍還需要勾選重力(當然也可以給物體一個向下的恆力),但是大多數情況下我們是不需要重力的,而且使用物理會消耗更多資源(相比腳本)。這個網上也有很多例子,一行代碼搞定,不詳細介紹。
3.自己寫腳本模擬跳躍
這個是應用場景最多的方式。簡單的,可以定義跳躍的時間和高度,然后開協程每幀更新物體的高度,這樣就能實現跳躍,具體見下面代碼。但是這種跳躍是線性的,無法模擬真實跳躍,更加無法實現自定義跳躍的曲線。
1 public int jumpTime = 30; 2 public int fallTime = 20; 3 public float jumpHeight = 1f; 4 void JumpForSeconds() 5 { 6 StartCoroutine(jumpForSeconds()); 7 } 8 9 IEnumerator jumpForSeconds() 10 { 11 int time = jumpTime; 12 float speed = jumpHeight / jumpTime; 13 while(time>0) 14 { 15 time--; 16 transform.Translate(transform.up * speed); 17 yield return new WaitForEndOfFrame(); 18 } 19 time = fallTime; 20 speed = -jumpHeight / fallTime; 21 while(time>0) 22 { 23 time--; 24 transform.Translate(transform.up * speed); 25 yield return new WaitForEndOfFrame(); 26 } 27 }
4.使用AnimationCurve
這里只介紹簡單的使用方法。AnimationCurve是Unity可視化的曲線模擬組件,需要在掛載的腳本中public聲明一個AnimationCurve類型的變量,如public AnimationCurve jumpCurve; 此時可以發現inspector視圖中腳本多出來一個
單擊后面的編輯框即可打開編輯界面,打開后如圖
在這里可以編輯你想要的曲線類型,跳躍就是簡單的拋物線,你也可以自定義任何類型的曲線。具體如何編輯曲線,可以查看官方文檔https://docs.unity3d.com/Manual/EditingCurves.html,寫的十分詳細。吐槽一下這里的曲線只能用定義關鍵幀的方式來畫,並沒有預定義好的曲線。如果能做成matlab那樣強大就好了,當然也可能是游戲中其實不需要那么復雜的曲線。
接下來如何使用這條曲線呢,其實你可以把剛才定義的變量jumpCurve理解為這條曲線,它提供了很多方法,最常用的就是Evaluate函數,這個函數參數為x,返回y值,也就是你可以根據橫軸任意一點得到曲線上的某一點。在跳躍的例子中,橫軸就是時間,縱軸就是高度,那么我們稍微修改一下方法3,高度由這個曲線每幀獲取,然后定義物體高度就可以了。
1 void JumpForSeconds() 2 { 3 StartCoroutine(jumpForSeconds()); 4 } 5 6 IEnumerator jumpForSeconds() 7 { 8 int time = 0; 9 float x = 0; 10 float z = 0; 11 float height = 0; 12 while(time<=jumpTime) 13 { 14 x = transform.position.x; 15 z = transform.position.z; 16 height = jumpCurve.Evaluate(time); 17 transform.position = new Vector3(x, height, z); 18 yield return new WaitForEndOfFrame(); 19 time++; 20 } 21 }
順便再多說一點,這個AnimationCurve十分強大,像道路生成、運動軌跡等都可以使用。