本文实例为大家分享了C#实现贝塞尔曲线的具体代码,供大家参考,具体内容如下
话不多直接上代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
public Transform[] controlPoints; //曲线的控制点 ,最少三个,起点,弧度点,终点 public GameObject codeGameObject; //要动的物体 private int _segmentNum = 50; //运动物体过程分的段数 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; } |
项目里的截图:
运行就可以看到球在三个方块之间移动的曲线了
第二种方案使用DOTweenPath
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
/** * @brief 播放道具飞行动画 * * @param prop 道具 * @param sendPos 起始点 * @param endP 终点 * @param fHeight 贝塞尔曲线中间点的高度(控制曲线) * * @return 飞行动画时间 */ 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">时间</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; } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/weixin_41604051/article/details/103833957