|
贝塞尔曲线公式
/// <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];//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); |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|