1. 程式人生 > >遊戲中關於跳躍的函式影象的推導以及應用

遊戲中關於跳躍的函式影象的推導以及應用

跳躍應該是遊戲開發中一個最常見的功能之一,實現的方法也有很多,這裡我來講一個我以前用的一個方法.

正常的跳躍,如果使用物理引擎的話,就直接給一個向上的力就可以了,但是有一些遊戲,例如跑酷,角色的移動速度都是越來越快的,而如果還是隻給一個向上的力的話,跳躍的距離就會相應的變遠,這樣肯定是不行的,所以為了讓角色能夠按照固定的路徑來跳躍,我們就需要設計一個函式能夠模擬出跳躍的效果。下面我會給出函式的推導過程。

首先從最基礎的開始y=x^2,它是這樣的


但這個看上去和一點也不像跳躍的路徑,我們還需要把它翻轉過來,翻轉的話我們在前面加上一個負號就可以了,像這樣:


這下比較像了,但是從0,0點出發就直接往下掉了,跳躍肯定是要先向上的,我們還需要把它往右上方平移,我們把x^2寫成x*x,這樣比較方便修改。我們給第一個x減去2,公式變成:y=-(x-2)*x,它長這個樣子:


這下看上去就和正常的跳躍差不多了,但是實際遊戲中我們還需要調節手感以及和策劃同學編輯的關卡對應上,所以我們還需要調節跳躍的距離和高度,我們繼續來修改我們的公式,,我們來看一下這個公式:

y=-(x-w)*x;

其中w為一個常數,代表了y>0的部分的長度,即跳躍的距離,高度為(w/2)^2,很明顯現在的高度是隨著距離的增加而增加的,並不能隨意調節,所以我們還需要增加一個引數b,來對y軸進行縮放。像這樣:

y=-(x-w)*x*b;


那現在我們應該如何確定我們公式中的b應該取多少呢?

我們假設寬度已知為w,想要的高度為h,則有(w/2)^2*b = h;

可以推匯出 b =  h/(w/2)^2

所以我們把公式中的b替換一下:

y=-(x-w)*x*(h/(w/2)^2);

這就是我們的最終公式,其中w代表跳躍的寬度,h代表跳躍的高度。

讓我們在專案裡試一下看看效果~

建立指令碼Test,內容如下:

public class Test : MonoBehaviour {
	
	const int w = 10;
	const int h = 2;

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		float x = transform.position.x + Time.deltaTime;
		float y = JumpFormula(x);

		Debug.Log(x + "///" + y);
		transform.position = new Vector3(x,y,transform.position.z);
		
	}

	float JumpFormula(float x){
		return -(x-w)*x*(h/Mathf.Pow((w/2),2));
	}
}
在場景中建立一個物體,放到0,0點,並新增此指令碼,我們來看看效果:

這是w=10,h=2的函式影象


可以看到,這就是我們想要的~~~

關於數學部分的內容很簡單,都是初中的學習內容,重要的還是要活學活用。