示例#1
0
    public FinePoint CaculateOneFinePoint(Vector3 startPosition, Vector2 startRotation, int step, float dt)
    {
        FinePoint point = new FinePoint();

        if (step < 0 || dt < 0)
        {
            return(point);
        }

        if (step >= 0 && step < mControlPoints.Length)
        {
            float rXDelta = dt * mControlPoints[step].mRotationChange.x / mControlPoints[step].mTime;
            float rYDelta = dt * mControlPoints[step].mRotationChange.y / mControlPoints[step].mTime;
            startRotation.x += rXDelta;
            startRotation.y += rYDelta;
        }
        step       = Mathf.Min(step, mControlPoints.Length - 1);
        rotatedVec = MathUtil.GetInstance().Rotate(Vector3.forward, startRotation.x, startRotation.y);
        Vector3 dL = dt * mBaseSpeed * rotatedVec * mControlPoints[step].mSpeedScale;

        startPosition += dL;

        point.position     = startPosition;
        point.rotation     = startRotation;
        point.controlIndex = step;

        return(point);
    }
示例#2
0
    public FinePoint CaculateOneFinePoint1(Vector2 startPosition, float startRotation, int step, float dt, bool log = true)
    {
        FinePoint point = new FinePoint();

        point.position     = startPosition;
        point.rotation     = startRotation;
        point.controlIndex = step;
        if (step < 0 || dt <= 0)
        {
            return(point);
        }

        if (step >= 0 && step < mControlPoints.Length)
        {
            float rDelta = dt * mControlPoints[step].mRotationChange / mControlPoints[step].mTime;
            startRotation -= rDelta;
        }
        step       = Mathf.Min(step, mControlPoints.Length - 1);
        rotatedVec = MathUtil.GetInstance().Rotate(Vector2.right, startRotation);
        Vector2 dL = dt * mBaseSpeed * rotatedVec * mControlPoints[step].speedFactor;

        startPosition     += dL;
        point.position     = startPosition;
        point.rotation     = startRotation;
        point.controlIndex = step;
        //if (Application.isPlaying && log)
        //Debug.Log(startPosition.ToString() + "   " + string.Format("{0:.000}", (startRotation - 360)));
        return(point);
    }
示例#3
0
    public FinePoint CaculateOneFinePoint(Vector2 startPosition, float startRotation, int step, float dt, bool log = true)
    {
        FinePoint point = new FinePoint();

        point.position     = startPosition;
        point.rotation     = startRotation;
        point.controlIndex = step;
        if (step < 0 || dt <= 0)
        {
            return(point);
        }

        if (step >= 0 && step < mControlPoints.Length)
        {
            float rDelta = dt * mControlPoints[step].mRotationChange / mControlPoints[step].mTime;
            startRotation -= rDelta;
        }
        step       = Mathf.Min(step, mControlPoints.Length - 1);
        rotatedVec = MathUtil.GetInstance().Rotate(Vector2.right, startRotation);
        Vector2 dL = dt * mBaseSpeed * rotatedVec * mControlPoints[step].speedFactor;

        //Debug.Log(mControlPoints[step].speedFactor);

        startPosition     += dL;
        point.position     = startPosition;
        point.rotation     = startRotation;
        point.controlIndex = step;
        return(point);
    }
示例#4
0
    // Use this for initialization
    void Start()
    {
        oneFinePoint          = new FinePoint();
        oneFinePoint.position = transform.localPosition;
        oneFinePoint.rotation = transform.eulerAngles.z;
        mFishPath.CaculateFinePoints(transform);
#if FishPath_3D
        Animation anim = GetComponent <Animation>();
        foreach (AnimationState state in anim)
        {
            if (FishKindId != 2)
            {
                state.speed = mSpeed / 50.0f;
            }
            state.time = Random.Range(0, 2f);
            if (state.name.Contains("catch"))
            {
                AnimationEvent animevent = new AnimationEvent();
                animevent.functionName = "DeadCallback";
                animevent.intParameter = mFishRecord.id;
                animevent.time         = state.length;
                state.clip.AddEvent(animevent);
            }
        }
#endif
    }
示例#5
0
    public void CaculateTransform(int step, float dt)
    {
        if (dt <= 0)
        {
            return;
        }

        Vector2 vec2Pos = new Vector2(transform.localPosition.x, transform.localPosition.y);

        oneFinePoint            = mFishPath.CaculateOneFinePoint1(vec2Pos, transform.eulerAngles.z, step, dt);
        transform.localPosition = oneFinePoint.position;
        transform.eulerAngles   = new Vector3(0, 0, oneFinePoint.rotation);
    }
示例#6
0
    public void CaculateFinePoints()
    {
        if (Application.isEditor == false)
        {
            return;
        }
        mFinePointsList.Clear();
        float time = 0;

        mCurrentFinePoint.position     = mStartPosition;
        mCurrentFinePoint.rotation     = mStartRotation;
        mCurrentFinePoint.controlIndex = 0;
        mFinePointsList.Add(mCurrentFinePoint);
        rotatedVec     = Vector3.forward;
        mCurrentLife   = 0;
        mLastFrameLife = 0;
        mLastFrameStep = mCurrentStep = 0;
        float totaltime = GetTotalTime();


        while (time < totaltime)
        {
            time          += SECOND_ONE_FRAME;
            mLastFrameLife = mCurrentLife;
            mCurrentLife  += SECOND_ONE_FRAME;
            mStepTime      = 0;
            for (int i = 0; i < mControlPoints.Length; i++)
            {
                mStepTime += mControlPoints[i].mTime;
                if (mCurrentLife <= mStepTime)
                {
                    mCurrentStep = i;
                    break;
                }
                else
                {
                    mCurrentStep = mControlPoints.Length;
                }
            }

            if (mLastFrameStep != mCurrentStep)
            {
                int   tmpStep = mLastFrameStep;
                float t1      = mLastFrameLife;
                while (true)
                {
                    tmpStep = tmpStep + 1;
                    if (tmpStep > mCurrentStep)
                    {
                        break;
                    }
                    float t2 = 0;
                    for (int i = 0; i < tmpStep; i++)
                    {
                        t2 += mControlPoints[i].mTime;
                    }
                    float dt1 = t2 - t1;
                    t1 = t2;
                    int cnt1 = Mathf.FloorToInt(dt1 / SECOND_ONE_FRAME);
                    for (int i = 0; i < cnt1; i++)
                    {
                        mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, tmpStep - 1, SECOND_ONE_FRAME);
                        mFinePointsList.Add(mCurrentFinePoint);
                    }
                    mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, tmpStep - 1, dt1 - SECOND_ONE_FRAME * cnt1);
                    mFinePointsList.Add(mCurrentFinePoint);
                }
                float t3 = 0;
                for (int i = 0; i < mCurrentStep; i++)
                {
                    t3 += mControlPoints[i].mTime;
                }
                float dt2  = mCurrentLife - t3;
                int   cnt2 = Mathf.FloorToInt(dt2 / SECOND_ONE_FRAME);
                for (int i = 0; i < cnt2; i++)
                {
                    mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, mCurrentStep, SECOND_ONE_FRAME);
                    mFinePointsList.Add(mCurrentFinePoint);
                }
                mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, mCurrentStep, dt2 - SECOND_ONE_FRAME * cnt2);
                mFinePointsList.Add(mCurrentFinePoint);
                mLastFrameStep = mCurrentStep;
            }
            else
            {
                mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, mCurrentStep, SECOND_ONE_FRAME);
                mFinePointsList.Add(mCurrentFinePoint);
            }
        }
    }
示例#7
0
    public void CaculateFinePoints(Transform trans = null)
    {
        if (Application.isEditor == false)
        {
            return;
        }
        if (trans)
        {
            Vector2 vec2Pos = new Vector2(trans.localPosition.x, trans.localPosition.y);
            StartPosition = vec2Pos;
            StartRotation = trans.eulerAngles.z;
        }

        mFinePointsList.Clear();
        float time = 0;

        mCurrentFinePoint.position     = mStartPosition;
        mCurrentFinePoint.rotation     = mStartRotation;
        mCurrentFinePoint.controlIndex = 0;
        mFinePointsList.Add(mCurrentFinePoint);
        rotatedVec     = Vector2.right;
        mCurrentLife   = 0;
        mLastFrameLife = 0;
        mLastFrameStep = mCurrentStep = 0;
        float totaltime = GetTotalTime();

        this.CaculateSpeedAndRotateFactor();
        while (time < totaltime)
        {
            time          += SECOND_ONE_FRAME;
            mLastFrameLife = mCurrentLife;
            mCurrentLife  += SECOND_ONE_FRAME;
            mStepTime      = 0;
            for (int i = 0; i < mControlPoints.Length; i++)
            {
                mStepTime += mControlPoints[i].mTime;
                if (mCurrentLife <= mStepTime)
                {
                    mCurrentStep = i;
                    break;
                }
                else
                {
                    mCurrentStep = mControlPoints.Length;
                }
            }

            if (mLastFrameStep != mCurrentStep)
            {
                int   tmpStep = mLastFrameStep;
                float t1      = mLastFrameLife;
                while (true)
                {
                    tmpStep = tmpStep + 1;
                    if (tmpStep > mCurrentStep)
                    {
                        break;
                    }
                    float t2 = 0;
                    for (int i = 0; i < tmpStep; i++)
                    {
                        t2 += mControlPoints[i].mTime;
                    }
                    float dt1 = t2 - t1;
                    t1 = t2;
                    int cnt1 = Mathf.FloorToInt(dt1 / SECOND_ONE_FRAME);
                    for (int i = 0; i < cnt1; i++)
                    {
                        mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, tmpStep - 1, SECOND_ONE_FRAME, false);
                        mFinePointsList.Add(mCurrentFinePoint);
                    }
                    mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, tmpStep - 1, dt1 - SECOND_ONE_FRAME * cnt1, false);
                    mFinePointsList.Add(mCurrentFinePoint);
                }
                float t3 = 0;
                for (int i = 0; i < mCurrentStep; i++)
                {
                    t3 += mControlPoints[i].mTime;
                }
                float dt2  = mCurrentLife - t3;
                int   cnt2 = Mathf.FloorToInt(dt2 / SECOND_ONE_FRAME);
                for (int i = 0; i < cnt2; i++)
                {
                    mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, mCurrentStep, SECOND_ONE_FRAME, false);
                    mFinePointsList.Add(mCurrentFinePoint);
                }
                mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, mCurrentStep, dt2 - SECOND_ONE_FRAME * cnt2, false);
                mFinePointsList.Add(mCurrentFinePoint);
                mLastFrameStep = mCurrentStep;
            }
            else
            {
                mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, mCurrentStep, SECOND_ONE_FRAME, false);
                mFinePointsList.Add(mCurrentFinePoint);
            }
        }

        foreach (FinePoint p in mFinePointsList)
        {
            p.position.x = p.position.x - 640;
            p.position.y = p.position.y - 360;
        }



        //string resultFile = Application.dataPath + "/FishPath/Resources/PathConfig/test.txt";
        //FileStream fs1 = new FileStream(resultFile, FileMode.Create, FileAccess.Write);
        //StreamWriter sw = new StreamWriter(fs1);
        //int index = 0;
        //foreach (FinePoint p in mFinePointsList)
        //{
        //    string str = index + "    " +  p.position.ToString() + "   " + p.rotation.ToString();
        //    sw.WriteLine(str);
        //    index++;
        //}

        //sw.Flush();
        //fs1.Close();
    }
示例#8
0
 public void CaculateTransform(int step, float dt)
 {
     oneFinePoint            = mFishPath.CaculateOneFinePoint(transform.localPosition, transform.eulerAngles, step, dt);
     transform.localPosition = oneFinePoint.position;
     transform.eulerAngles   = oneFinePoint.rotation;
 }