zt3ff3n 发表于 2022-11-28 17:50

Unity 贝塞尔曲线实现抛物线运动,投掷功能实现

贝塞尔曲线公式

/// <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;
}
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);

maltadirk 发表于 2022-11-28 17:59

t是啥

DomDomm 发表于 2022-11-28 18:09

你可以理解成方程式中的x,区间在0到1,如果你想获取抛物线起点的位置,就传入t=0,如果你想获得中间点的位置,t=0.5f,如果你想获得终点的位置,t=1.

ChuanXin 发表于 2022-11-28 18:16

var time = (i+1) / (float)resolution; 是不是应该是 var t = (i+1) / (float)resolution;

LiteralliJeff 发表于 2022-11-28 18:20

JamesB 发表于 2022-11-28 18:20

那起点和终点不在一个水平面上的话是不是就不行了

DomDomm 发表于 2022-11-28 18:21

不是,终点在哪都行

LiteralliJeff 发表于 2022-11-28 18:22

请教下,我按着你的教程实现了物体沿抛物线移动,但是加了setlookat之后物体就不见了,你知道是什么原因吗,我做的是2d的
页: [1]
查看完整版本: Unity 贝塞尔曲线实现抛物线运动,投掷功能实现