Unity貝塞爾曲線和DOTween聯合使用動畫方案


背景

開發過程中有時會用到做貝塞爾曲線動畫,單單有DoTween有時候達不到效果,此時可以采用此方案解決。擴展下,可以通過更換控制點,隨機更多曲線動畫。

核心代碼

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;

public class TestBezier : MonoBehaviour
{
    private float _times=3f;
    private float _pointCount = 5f;
    public GameObject obj;
    public GameObject startObj;
    public GameObject controlObj;
    public GameObject endObj;
   
    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            DoAnim();
        }
    }
    private void DoAnim()
    {
        obj.transform.position = startObj.transform.position;
        Vector3[] pathvec = Bezier2Path(startObj.transform.position, controlObj.transform.position, endObj.transform.position);
        obj.transform.DOPath(pathvec, _times);
    }
    //獲取二階貝塞爾曲線路徑數組
    private  Vector3[] Bezier2Path(Vector3 startPos, Vector3 controlPos, Vector3 endPos)
    {
        Vector3[] path = new Vector3[(int)_pointCount];
        for (int i = 1; i <= _pointCount; i++)
        {
            float t = i / _pointCount;
            path[i - 1] = Bezier2(startPos, controlPos, endPos, t);
        }
        return path;
    }
    // 2階貝塞爾曲線
    public static Vector3 Bezier2(Vector3 startPos, Vector3 controlPos, Vector3 endPos, float t)
    {
        return (1 - t) * (1 - t) * startPos + 2 * t * (1 - t) * controlPos + t * t * endPos;
    }

    // 3階貝塞爾曲線
    public static Vector3 Bezier3(Vector3 startPos, Vector3 controlPos1, Vector3 controlPos2, Vector3 endPos, float t)
    {
        float t2 = 1 - t;
        return t2 * t2 * t2 * startPos
            + 3 * t * t2 * t2 * controlPos1
            + 3 * t * t * t2 * controlPos2
            + t * t * t * endPos;
    }
}

可參考以下鏈接理解貝塞爾曲線和公式:
https://blog.csdn.net/cfan927/article/details/104649623/
https://blog.csdn.net/weixin_42513339/article/details/83019610


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM