首先一阶贝塞尔曲线公式为:
/// <param name="t">0到1的值,0获取曲线的起点,1获得曲线的终点</param>
/// <param name="start">曲线的起始位置</param>
/// <param name="center">决定曲线形状的控制点</param>
/// <param name="end">曲线的终点</param>
public static Vector3 GetBezierPoint(float t, Vector3 start, Vector3 center, Vector3 end)
{
return (1 - t) * (1 - t) * start + 2 * t * (1 - t) * center + t * t * end;
}
在上述注释中,标明我们需要四个参数,分别是曲线的起点,曲线的终点,曲线的控制点和经过计算的浮点数t,那么我们写出如下代码传参数进去:
public override void BezierMove(Transform PlayerTrans, GameObject SkillPrefab, Vector3 point, float hight, float FlyTime)
{
var bezierControlPoint = (PlayerTrans.position +point ) * 0.5f+(Vector3.up*hight);
Vector3 startPoint = PlayerTrans.position;
Vector3 endPoint = point;
int resolution = 1000;
Vector3[] _path;
_path = new Vector3[resolution];
for (int i = 0; i < resolution; i++)
{
var t = (i+1) / (float)resolution;
_path[i] = GetBezierPoint(t,startPoint,bezierControlPoint,endPoint);
}
SkillPrefab.transform.DOPath(_path, FlyTime).SetLookAt(0).SetEase(Ease.Linear);
}
如上述代码,调用此代码的时候分别需要 PlayerTrans(在这里表示为曲线起点),SkillPrefab(在这里表示为需要投掷的物体),Point(在这里表示为曲线终点),hight(在这里表示为曲线最高点),FlyTime(物体飞行从起点到终点所需要的时间)
下面进行代码解释:
1.首先先计算代码的控制点,需要起始点,终点与曲线最高高度。
var bezierControlPoint = (PlayerTrans.position +point ) * 0.5f+(Vector3.up*hight);
2.其次定义一个起点和终点并基于赋值(重新命名好看一点,可以在传入的时候改一下),定义一个整形类型的resolution,这个值是决定此曲线中物体经过的点位的数量,也就是说resolution的值越大,物体运动的过程就会越平滑,相应的消耗的性能也会增加。
Vector3 startPoint = PlayerTrans.position;
Vector3 endPoint = point;
int resolution = 1000;
3.定义一个坐标数组形成我们的路径,又我们制定的点位绘制而成,之后把相应的参数传到贝塞尔曲线计算方法之中,之后我们用DoTween插件中的DoPath方法进移动即可。
Vector3[] _path;
_path = new Vector3[resolution];
for (int i = 0; i < resolution; i++)
{
var t = (i+1) / (float)resolution;
_path[i] = GetBezierPoint(t,startPoint,bezierControlPoint,endPoint);
}
SkillPrefab.transform.DOPath(_path, FlyTime).SetLookAt(0).SetEase(Ease.Linear);