这篇文章主要为大家详细介绍了C#实现贝塞尔曲线的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了C#实现贝塞尔曲线的具体代码,供大家参考,具体内容如下
话不多直接上代码
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
/**
* @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;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持得得之家。
沃梦达教程
本文标题为:C#实现贝塞尔曲线的方法
基础教程推荐
猜你喜欢
- C#控制台实现飞行棋小游戏 2023-04-22
- winform把Office转成PDF文件 2023-06-14
- C#类和结构详解 2023-05-30
- unity实现动态排行榜 2023-04-27
- C# windows语音识别与朗读实例 2023-04-27
- C# 调用WebService的方法 2023-03-09
- ZooKeeper的安装及部署教程 2023-01-22
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- C# List实现行转列的通用方案 2022-11-02
- 一个读写csv文件的C#类 2022-11-06