Unity人物跳躍效果


  最近在做一個小游戲,需要實現人物的跳躍效果。自己從簡單到復雜,把目前比較好的方法都試了一遍,這里簡單總結一下。

  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十分強大,像道路生成、運動軌跡等都可以使用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM