贝塞尔曲线嚯嚯
private void flyStar(GameObject starObj, float angleRange)// 飞行的物体 , 偏移的角度
{
starObj.transform.DOPath(calcBezierPath(starObj.transform.position, targetPos, Mathf.Deg2Rad * UnityEngine.Random.Range(-angleRange, angleRange)), UnityEngine.Random.Range(0.8f, 1.5f)).SetEase(Ease.InSine).OnComplete(() => {
recycleStarResource(starObj);
}).SetDelay(0.15f);
}
//完成动作之后 初始化物体的状态和位置 存入对象池
private void recycleStarResource(GameObject starObj)
{
starObj.transform.DOKill();
}
/// 用贝塞尔曲线 生成路径
private Vector3[] calcBezierPath(Vector3 start, Vector3 end, float angleRad, int passPoint = 8)
{
var result = new Vector3[passPoint + 2];
result[0] = start;
result[passPoint + 1] = end;
var finalAngle = Mathf.Atan2(end.y - start.y, end.x - start.x) + angleRad;
var halfDistance = Vector3.Distance(start, end);
var controlPoint = new Vector3(Mathf.Cos(finalAngle) * halfDistance + start.x, Mathf.Sin(finalAngle) * halfDistance + start.y, 0);
for (var i = 0; i < passPoint; i++)
{
result[i + 1] = calculateCubicBezierPoint(((float)i + 1f) / (float)(passPoint + 1), start, controlPoint, end);
}
return result;
}
///设置路径点的偏移位置
private Vector3 calculateCubicBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2)
{
float u = 1 - t;
float tt = t * t;
float uu = u * u;
Vector3 p = uu * p0;
p += 2 * u * t * p1;
p += tt * p2;
return p;
}

浙公网安备 33010602011771号