Unity 贝塞尔曲线实现抛物线运动,投掷功能实现
贝塞尔曲线公式/// <param name=&#34;t&#34;>0到1的值,0获取曲线的起点,1获得曲线的终点</param>
/// <param name=&#34;start&#34;>曲线的起始位置</param>
/// <param name=&#34;center&#34;>决定曲线形状的控制点</param>
/// <param name=&#34;end&#34;>曲线的终点</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;
}
start(p0),center(p1),end(p2)三点确定一条贝塞尔曲线,传入t获取曲线上的坐标
确认起点,终点,和贝塞尔曲线的中间点
起点:警察的坐标
public Transform startTrans;
终点:地面上某个点
public Transform endTrans;
中间点:这里设置为起点和终点的向量相加再乘0.5,再加一个高度,所以应该是起点和终点的中间再偏上的位置,这样应该能得到一个对称的抛物线
var bezierControlPoint = (startPoint + endPoint) * 0.5f+(Vector3.up*height);
获取路径点
知道了起点,终点,和中间点我们就可以取得这个抛物线的曲线了
var startPoint = startTrans.position;
var endPoint=endTrans.Position;
var bezierControlPoint = (startPoint + endPoint) * 0.5f+(Vector3.up*height);
_path = new Vector3;//resolution为int类型,表示要取得路径点数量,值越大,取得的路径点越多,曲线最后越平滑
for (int i = 0; i < resolution; i++)
{
var t = (i+1) / (float)resolution;//归化到0~1范围
_path = GetBezierPoint(t,startPoint,bezierControlPoint,endPoint);//使用贝塞尔曲线的公式取得t时的路径点
}
绘制曲线
绘制曲线得方法有很多种,如直接在路径点上生成小球或其他指数物,以及使用lineRenderer绘制。
这里我选择使用LineRenderer
public LineRenderer lineRender;
使用之前得到的路径点给它赋值
_lineRender.positionCount = _path.Length;
_lineRender.SetPositions(_path);
沿路径运动
在玩家确定路径之后应该让物体沿着路径移动到目的地
使用Dotween插件的DoPath直接移动最为简单
grenade.DOPath(path, 0.8f).SetEase(Ease.Linear);
想让物体一直朝着路径方向需要再加上SetLookAt(0)
grenade.DOPath(path, 0.8f).SetLookAt(0).SetEase(Ease.Linear);
如果路径点较少,看起来不够平滑可以使用CatmullRom曲线插值类型运动,默认PathType.Linear
grenade.DOPath(path, 0.8f,PathType.CatmullRom); t是啥 你可以理解成方程式中的x,区间在0到1,如果你想获取抛物线起点的位置,就传入t=0,如果你想获得中间点的位置,t=0.5f,如果你想获得终点的位置,t=1. var time = (i+1) / (float)resolution; 是不是应该是 var t = (i+1) / (float)resolution; 是 那起点和终点不在一个水平面上的话是不是就不行了 不是,终点在哪都行 请教下,我按着你的教程实现了物体沿抛物线移动,但是加了setlookat之后物体就不见了,你知道是什么原因吗,我做的是2d的
页:
[1]