挂上脚本,放入gameObject即可看到效果
/*
* t = [0, 1]
* 一阶贝塞尔曲线公式:a = (1 - t) * P0
* b = t * P1
* B = a + b
* 二阶贝塞尔公式:a = (1 - t) * (1 - t) * P0
* b = 2 * t * (1 - t)P1
* c = t * t * P2
* B = a + b + c
* 三阶贝塞尔曲线: a = (1 - t) * (1 - t) * (1 - t) * P0
* b = 3 * t * (1 - t) * (1 - t) * P1
* c = 3 * t * t * (1 - t) * P2
* d = t * t * t * P3
* B = a + b + c + d
*/
using System;
using System.Collections;
using UnityEngine;
public class Bezier : MonoBehaviour
{
private IEnumerator coTmp;
private float moveSpeed;
[Range(0, 1)] public float tt = 0f;
public Transform obj;
public Transform p0;
public Transform p1;
public Transform p2;
// Start is called before the first frame update
void Start()
{
coTmp = NumberADD(tt, 1, 0.01f, 0.01f, (f) => { tt = f; });
StartCoroutine(coTmp);
}
// Update is called once per frame
void Update()
{
obj.position = Bezier2(tt, p0.position, p1.position, p2.position);
}
// 数值递增
public IEnumerator NumberADD( float curNum, float targetNum,float le , float time, Action<float> func)
{
for (; curNum <= targetNum; curNum += le)
{
yield return new WaitForSeconds(time);
func(curNum);
}
coTmp = NumberADD(curNum, targetNum, le, time, func);
StopCoroutine(coTmp);
}
/// <summary>
/// 二阶贝塞尔曲线
/// </summary>
/// <param name="t">[0, 1]</param>
/// <param name="P0">起点</param>
/// <param name="P1">中间点,越远弯曲越大</param>
/// <param name="P2">终点</param>
/// <returns></returns>
Vector3 Bezier2(float t, Vector3 P0, Vector3 P1, Vector3 P2)
{
Vector3 a = (1 - t) * (1 - t) * P0;
Vector3 b = 2 * t * (1 - t) * P1;
Vector3 c = t * t * P2;
Vector3 pos = a + b + c;
return pos;
}
}