unity繪制一條流動(dòng)的弧線(貝塞爾線)
本文實(shí)例為大家分享了unity繪制一條流動(dòng)弧線的具體代碼,供大家參考,具體內(nèi)容如下
最終效果


把下面腳本復(fù)制,直接拖上腳本,設(shè)置兩個(gè)點(diǎn)(物體)的位置
GameObject1是開始點(diǎn)的位置,GameObject2是結(jié)束點(diǎn)的位置
public Transform[] controlPoints;
public LineRenderer lineRenderer;
public float centerPoint =0.1f;
private int layerOrder = 0;
//生成弧線中間的點(diǎn)數(shù)
private int _segmentNum = 20;
//偏移
float m_offset;
float m_speed = 0.5f;
void Start()
{
if (!lineRenderer)
{
lineRenderer = GetComponent<LineRenderer>();
}
lineRenderer.sortingLayerID = layerOrder;
//調(diào)用畫貝斯?fàn)柧€
GetBeizerList(controlPoints[0].position, (controlPoints[0].position + controlPoints[1].position) * 0.5f + new Vector3(0, centerPoint, 0), controlPoints[1].transform.position, _segmentNum);
}
private void Update()
{
m_offset = m_offset - m_speed * Time.deltaTime;
//控制offset使材質(zhì)移動(dòng)
GetComponent<LineRenderer>().material.mainTextureOffset = new Vector2(m_offset, 0);
}
/// <summary>
/// 根據(jù)T值,計(jì)算貝塞爾曲線上面相對(duì)應(yīng)的點(diǎn)
/// </summary>
/// <param name="t"></param>T值
/// <param name="p0"></param>起始點(diǎn)
/// <param name="p1"></param>控制點(diǎn)
/// <param name="p2"></param>目標(biāo)點(diǎn)
/// <returns></returns>根據(jù)T值計(jì)算出來的貝賽爾曲線點(diǎn)
private static 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;
}
/// <summary>
/// 獲取存儲(chǔ)貝塞爾曲線點(diǎn)的數(shù)組
/// </summary>
/// <param name="startPoint"></param>起始點(diǎn)
/// <param name="controlPoint"></param>控制點(diǎn)
/// <param name="endPoint"></param>目標(biāo)點(diǎn)
/// <param name="segmentNum"></param>采樣點(diǎn)的數(shù)量
/// <returns></returns>存儲(chǔ)貝塞爾曲線點(diǎn)的數(shù)組
public Vector3[] GetBeizerList(Vector3 startPoint, Vector3 controlPoint, Vector3 endPoint, int segmentNum)
{
Vector3[] path = new Vector3[segmentNum];
for (int i = 1; i <= segmentNum; i++)
{
float t = i / (float)segmentNum;
Vector3 pixel = CalculateCubicBezierPoint(t, startPoint,
controlPoint, endPoint);
//設(shè)置lineRenderer的control Points
lineRenderer.positionCount = i;
lineRenderer.SetPosition(i - 1, pixel);
//存儲(chǔ)Point
path[i - 1] = pixel;
Debug.Log(path[i - 1]);
}
return path;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#動(dòng)態(tài)加載dll擴(kuò)展系統(tǒng)功能的方法
這篇文章主要介紹了C#動(dòng)態(tài)加載dll擴(kuò)展系統(tǒng)功能的方法,涉及C#動(dòng)態(tài)加載dll擴(kuò)展的相關(guān)技巧,需要的朋友可以參考下2015-04-04
C#文件內(nèi)容檢索的功能實(shí)現(xiàn)代碼
本文詳細(xì)介紹了如何構(gòu)建和優(yōu)化一個(gè)高效的文件內(nèi)容檢索系統(tǒng),包括索引構(gòu)建、多線程處理、文件監(jiān)控、搜索優(yōu)化、錯(cuò)誤處理和日志記錄等方面的內(nèi)容,并提供了一個(gè)簡(jiǎn)化的C#demo示例,感興趣的朋友一起看看吧2024-10-10
C#調(diào)用打印機(jī)實(shí)現(xiàn)打印
這篇文章介紹了C#調(diào)用打印機(jī)實(shí)現(xiàn)打印的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
C#使用分部類設(shè)計(jì)實(shí)現(xiàn)一個(gè)計(jì)算器
分部類是C#4.5中的一個(gè)新特性,它的出現(xiàn)使得程序的結(jié)構(gòu)更加合理,代碼組織更加緊密,本文將使用分部類設(shè)計(jì)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)算器,感興趣的小伙伴可以了解下2024-02-02
C#利用Windows自帶gdi32.dll實(shí)現(xiàn)抓取屏幕功能實(shí)例
這篇文章主要介紹了C#利用Windows自帶gdi32.dll實(shí)現(xiàn)抓取屏幕功能,是C#程序設(shè)計(jì)中常見的一個(gè)重要技巧,需要的朋友可以參考下2014-08-08

