文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

本文实例为大家分享了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


    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;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯