您的位置:首页 > 其它

游戏中关于跳跃的函数图像的推导以及应用

2018-01-31 22:26 513 查看
跳跃应该是游戏开发中一个最常见的功能之一,实现的方法也有很多,这里我来讲一个我以前用的一个方法.

正常的跳跃,如果使用物理引擎的话,就直接给一个向上的力就可以了,但是有一些游戏,例如跑酷,角色的移动速度都是越来越快的,而如果还是只给一个向上的力的话,跳跃的距离就会相应的变远,这样肯定是不行的,所以为了让角色能够按照固定的路径来跳跃,我们就需要设计一个函数能够模拟出跳跃的效果。下面我会给出函数的推导过程。

首先从最基础的开始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的函数图像



可以看到,这就是我们想要的~~~

关于数学部分的内容很简单,都是初中的学习内容,重要的还是要活学活用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  函数 数学