unity Bezier曲线 移动

private Dictionary<Transform, BezierTask> m_BezierTask = new Dictionary<Transform, BezierTask>();
    private bool m_bProcess = true;


    public void ClearAllTask()
    {
        m_BezierTask.Clear();
    }


    void Update()
    {
        if (m_bProcess)
        {
            MainProcess();
        }      
    }
    public void RemoveBezierTask(Transform tran)
    {


        if (m_BezierTask.ContainsKey(tran))
        {
            m_BezierTask.Remove(tran);
        }
    }
    private void MainProcess()
    {
        float fTime = Time.deltaTime;   //这次使用的时间
        Transform tran = null;
        BezierTask task;
        for (int i = 0; i < m_BezierTask.Count; ++i)
        {
            tran = m_BezierTask.ElementAt(i).Key;
            task = m_BezierTask.ElementAt(i).Value;


            task.fUsedTime = task.fUsedTime + fTime;
            if (task.fUsedTime >= task.fTotalTime)  //已经到达目的地
            {
                tran.position = task.DestVec;
                m_BezierTask.Remove(tran);
            }
            else
            {
                float fRela = task.fUsedTime / task.fTotalTime;
                Vector3 DestVec = GetBezierPos(fRela, task.SourVec, task.DestVec, task.Ctrl0Vec, task.Ctrl1Vec);


                tran.position = DestVec;
                m_BezierTask[tran] = task;
            }
        }
    }
    private Vector3 GetBezierPos(float fRela, Vector3 Point0Vec, Vector3 Point1Vec, Vector3 Ctrl0Vec, Vector3 Ctrl1Vec)
    {
        float fTemp0 = fRela * fRela;
        float fTemp1 = (1 - fRela) * (1 - fRela);
        float fX = Point0Vec.x * fTemp1 * (1 - fRela) + 3 * Ctrl0Vec.x * fRela * fTemp1 + 3 * Ctrl1Vec.x * fTemp0 * (1 - fRela) + Point1Vec.x * fTemp0 * fRela;
        float fY = Point0Vec.y * fTemp1 * (1 - fRela) + 3 * Ctrl0Vec.y * fRela * fTemp1 + 3 * Ctrl1Vec.y * fTemp0 * (1 - fRela) + Point1Vec.y * fTemp0 * fRela;
        float fZ = Point0Vec.z * fTemp1 * (1 - fRela) + 3 * Ctrl0Vec.z * fRela * fTemp1 + 3 * Ctrl1Vec.z * fTemp0 * (1 - fRela) + Point1Vec.z * fTemp0 * fRela;
        return new Vector3(fX, fY, fZ);
    }
    public void AddToBezier(Transform tran, Vector3 SourVec, Vector3 DestVec, float fTotalTime)
    {
        BezierTask temp = new BezierTask();
        Vector3 BaseCtrl0Vec = Vector3.Lerp(SourVec, DestVec, 0.25f);
        Vector3 BaseCtrl1Vec = Vector3.Lerp(SourVec, DestVec, 0.75f);
        GetMCtrl(BaseCtrl0Vec, BaseCtrl1Vec, ref temp.Ctrl0Vec, ref temp.Ctrl1Vec);
        temp.SourVec = SourVec;
        temp.DestVec = DestVec;
        temp.fTotalTime = fTotalTime;
        temp.fUsedTime = 0;
        tran.position = SourVec;
        m_BezierTask[tran] = temp;
    }


    private void GetMCtrl(Vector3 BaseCtrl0Vec, Vector3 BaseCtrl1Vec, ref Vector3 Ctrl0Vec, ref Vector3 Ctrl1Vec)
    {
        float fRandom_x = Random.Range(-100, 101);
        float fRandom_y = Random.Range(-100, 101);


        Ctrl0Vec = BaseCtrl0Vec + new Vector3(fRandom_x, fRandom_x, 0);
        Ctrl1Vec = BaseCtrl1Vec + new Vector3(fRandom_y, fRandom_y, 0);


    }


少些了一点东西上回。不然你们看不懂可能。

用的时候用AddToBezier这个共有方法。就可以了。然后GetMCtrl这个方法是1/4、3/4点的偏移距离。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值