C#實(shí)現(xiàn)貝塞爾曲線的方法
本文實(shí)例為大家分享了C#實(shí)現(xiàn)貝塞爾曲線的具體代碼,供大家參考,具體內(nèi)容如下
話不多直接上代碼
public Transform[] controlPoints; //曲線的控制點(diǎn) ,最少三個(gè),起點(diǎn),弧度點(diǎn),終點(diǎn) ? ? public GameObject codeGameObject; //要?jiǎng)拥奈矬w ? ? private int _segmentNum = 50; //運(yùn)動(dòng)物體過程分的段數(shù) ? ? private int numIndex = 1; ? ?? void Start() ? ? { ? ? ? ? moveGameObject(2); ? ? } void moveGameObject(float time) ? ? { ? ? ? ? numIndex = 1; ? ? ? ? InvokeRepeating("setInterval", 0, time/50); ? ? } void setInterval() ? ? { ? ? ? ? int nodeIndex = 0; ? ? ? ? float t = numIndex / (float)_segmentNum; ? ? ? ? Vector3 pixel = CalculateCubicBezierPoint(t, controlPoints[nodeIndex].position, ? ? ? ? ? ? controlPoints[nodeIndex + 1].position, controlPoints[nodeIndex + 2].position); ? ? ? ? codeGameObject.gameObject.transform.position= pixel; ? ? ? ? numIndex++; ? ? ? ? if(numIndex> _segmentNum) ? ? ? ? { ? ? ? ? ? ? CancelInvoke("setInterval"); ? ? ? ? } ? ? } 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; ? ? }
項(xiàng)目里的截圖:
運(yùn)行就可以看到球在三個(gè)方塊之間移動(dòng)的曲線了
第二種方案使用DOTweenPath
/** ? ? ? ? ?* @brief ? 播放道具飛行動(dòng)畫 ? ? ? ? ?* ? ? ? ? ?* @param ? prop ? ?道具 ? ? ? ? ?* @param ? sendPos 起始點(diǎn) ? ? ? ? ?* @param ? endP ? ?終點(diǎn) ? ? ? ? ?* @param ? fHeight 貝塞爾曲線中間點(diǎn)的高度(控制曲線) ? ? ? ? ?* ? ? ? ? ?* @return ?飛行動(dòng)畫時(shí)間 ? ? ? ? ?*/ ? ? public float PlaySendFlyAnim(GameObject prop, Vector3 sendPos, Vector3 endP, float fHeight, float time) ? ? { ? ? ? ? float fTime = 0.0f; ? ? ? ? if (prop == null) ? ? ? ? { ? ? ? ? ? ? return fTime; ? ? ? ? } ? ? ? ?? ? ? ? ? Vector3 startP = sendPos; ? ? ? ? prop.transform.position = startP; ? ? ? ? float x = Mathf.Min(startP.x, endP.x) + Mathf.Abs(startP.x - endP.x) / 2f; ? ? ? ? float y = Mathf.Min(startP.y, endP.y) + Mathf.Abs(startP.y - endP.y) / 2f; ? ? ? ? float z = startP.z; ? ? ? ? Vector3 midP = new Vector3(x, y, z); ? ? ? ? double length = Math.Sqrt(Math.Pow(sendPos.x - midP.x, 2) + Math.Pow(sendPos.y - midP.y, 2)); ? ? ? ? //midP.x = fHeight / (float)length * (sendPos.x - midP.x) + midP.x; ? ? ? ? //midP.y = fHeight / (float)length * (sendPos.y - midP.y) + midP.y; ? ? ? ? int rangeRadomNum = UnityEngine.Random.Range(0, 2); ? ? ? ? if(rangeRadomNum == 1) ? ? ? ? { ? ? ? ? ? ? midP.x = fHeight / (float)length * (endP.x - midP.x) + midP.x; ? ? ? ? ? ? midP.y = endP.y; ? ? ? ? } ? ? ? ? else ? ? ? ? { ? ? ? ? ? ? midP.y = fHeight / (float)length * (endP.y - midP.y) + midP.y; ? ? ? ? ? ? midP.x = endP.x; ? ? ? ? } ? ? ? ? //fTime = 2.0f; ? ? ? ? fTime = time; ? ? ? ? List<Vector3> arrRecPos = new List<Vector3>(); ? ? ? ? arrRecPos.Add(startP); ? ? ? ? arrRecPos.Add(midP); ? ? ? ? arrRecPos.Add(endP); ? ? ? ? prop.transform.DOPath(arrRecPos.ToArray(), fTime, PathType.CatmullRom, PathMode.Full3D).SetEase(Ease.Linear); ? ? ? ? return fTime; ? ? } /// <param name="sendPos"> 玩家頭像位置</param> ? ? /// <param name="endP">篩子停止位置</param> ? ? /// <param name="i">篩子大小</param> ? ? /// <param name="radian">弧度</param> ? ? /// <param name="time">時(shí)間</param> ? ? /// <returns></returns> ? ? public float PlayAddFriendAnim(Vector3 sendPos, Vector3 endP,int i,int radian = 0, float time = 1.5f) ? ? { ? ? ? ? GameObject shaizi = this.transform.Find("shaizi_anmi4_0").gameObject; ? ? ? ? shaizi.GetComponent<Animator>().enabled = true; ? ? ? ? SpriteRenderer _shaizhiV = shaizi.GetComponent<SpriteRenderer>(); ? ? ? ? float fTime = PlaySendFlyAnim(shaizi, sendPos, endP, radian, time); ? ? ? ? DOTween.Sequence().AppendInterval(fTime).AppendCallback(() => ? ? ? ? { ? ? ? ? ? ? if (shaizi != null) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? shaizi.GetComponent<Animator>().enabled = false; ? ? ? ? ? ? ? ? _shaizhiV.sprite = shaiziData[i-1]; ? ? ? ? ? ? ? ? StartCoroutine(Destroyshaizi(shaizi)); ? ? ? ? ? ? } ? ? ? ? }); ? ? ? ? return fTime; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#中Convert.ToDecimal()報(bào)錯(cuò)問題的解決
這篇文章主要給大家介紹了關(guān)于C#中Convert.ToDecimal()報(bào)錯(cuò)問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08C#實(shí)現(xiàn)對(duì)圖片文件的壓縮、裁剪操作實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)對(duì)圖片文件的壓縮、裁剪操作,較為詳細(xì)的介紹了操作過程中用到的相關(guān)類文件及具體的操作步驟,是非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09C# 三種方式實(shí)現(xiàn)Socket數(shù)據(jù)接收
這篇文章主要給大家分享三種實(shí)現(xiàn)C# 實(shí)現(xiàn)Socket數(shù)據(jù)接收的方式,接下倆小編就來為大家詳細(xì)介紹吧,需要的朋友可以參考一下2021-10-10C# winform分頁查詢的實(shí)現(xiàn)示例
這篇文章主要介紹了C# winform分頁查詢的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04