C#实现贝塞尔曲线的方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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;
}
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

相关文档
最新文档