public override void Execute(float deltaTime)
        {
            float        t       = NormalizedT;
            BezierSpline spline  = Spline;
            bool         forward = MovingForward;

            for (int i = 0; i < tailObjects.Count; i++)
            {
                Transform tailObject = tailObjects[i];

                if (forward)
                {
                    tailObject.position = Vector3.Lerp(tailObject.position, spline.MoveAlongSpline(ref t, -tailObjectDistances[i]), movementLerpModifier * deltaTime);

                    if (lookAt == LookAtMode.Forward)
                    {
                        BezierSpline.PointIndexTuple tuple = spline.GetNearestPointIndicesTo(t);
                        tailObject.rotation = Quaternion.Lerp(tailObject.rotation, Quaternion.LookRotation(tuple.GetTangent(), tuple.GetNormal()), rotationLerpModifier * deltaTime);
                    }
                    else if (lookAt == LookAtMode.SplineExtraData)
                    {
                        tailObject.rotation = Quaternion.Lerp(tailObject.rotation, spline.GetExtraData(t, extraDataLerpAsQuaternionFunction), rotationLerpModifier * deltaTime);
                    }
                }
                else
                {
                    tailObject.position = Vector3.Lerp(tailObject.position, spline.MoveAlongSpline(ref t, tailObjectDistances[i]), movementLerpModifier * deltaTime);

                    if (lookAt == LookAtMode.Forward)
                    {
                        BezierSpline.PointIndexTuple tuple = spline.GetNearestPointIndicesTo(t);
                        tailObject.rotation = Quaternion.Lerp(tailObject.rotation, Quaternion.LookRotation(-tuple.GetTangent(), tuple.GetNormal()), rotationLerpModifier * deltaTime);
                    }
                    else if (lookAt == LookAtMode.SplineExtraData)
                    {
                        tailObject.rotation = Quaternion.Lerp(tailObject.rotation, spline.GetExtraData(t, extraDataLerpAsQuaternionFunction), rotationLerpModifier * deltaTime);
                    }
                }
            }
        }
        public override void Execute(float deltaTime)
        {
            float targetSpeed = (isGoingForward) ? speed : -speed;

            Vector3 targetPos = spline.MoveAlongSpline(ref m_normalizedT, targetSpeed * deltaTime);

            transform.position = targetPos;
            //transform.position = Vector3.Lerp( transform.position, targetPos, movementLerpModifier * deltaTime );

            bool movingForward = MovingForward;

            if (lookAt == LookAtMode.Forward)
            {
                BezierSpline.PointIndexTuple tuple = spline.GetNearestPointIndicesTo(m_normalizedT);
                Quaternion targetRotation;
                if (movingForward)
                {
                    targetRotation = Quaternion.LookRotation(tuple.GetTangent(), tuple.GetNormal());
                }
                else
                {
                    targetRotation = Quaternion.LookRotation(-tuple.GetTangent(), tuple.GetNormal());
                }

                transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, rotationLerpModifier * deltaTime);
            }
            else if (lookAt == LookAtMode.SplineExtraData)
            {
                transform.rotation = Quaternion.Lerp(transform.rotation, spline.GetExtraData(m_normalizedT, extraDataLerpAsQuaternionFunction), rotationLerpModifier * deltaTime);
            }

            if (movingForward)
            {
                if (m_normalizedT >= 1f)
                {
                    if (travelMode == TravelMode.Once)
                    {
                        m_normalizedT = 1f;
                    }
                    else if (travelMode == TravelMode.Loop)
                    {
                        m_normalizedT -= 1f;
                    }
                    else
                    {
                        m_normalizedT  = 2f - m_normalizedT;
                        isGoingForward = !isGoingForward;
                    }

                    if (!onPathCompletedCalledAt1)
                    {
                        onPathCompletedCalledAt1 = true;
#if UNITY_EDITOR
                        if (UnityEditor.EditorApplication.isPlaying)
#endif
                        onPathCompleted.Invoke();
                    }
                }
                else
                {
                    onPathCompletedCalledAt1 = false;
                }
            }
            else
            {
                if (m_normalizedT <= 0f)
                {
                    if (travelMode == TravelMode.Once)
                    {
                        m_normalizedT = 0f;
                    }
                    else if (travelMode == TravelMode.Loop)
                    {
                        m_normalizedT += 1f;
                    }
                    else
                    {
                        m_normalizedT  = -m_normalizedT;
                        isGoingForward = !isGoingForward;
                    }

                    if (!onPathCompletedCalledAt0)
                    {
                        onPathCompletedCalledAt0 = true;
#if UNITY_EDITOR
                        if (UnityEditor.EditorApplication.isPlaying)
#endif
                        onPathCompleted.Invoke();
                    }
                }
                else
                {
                    onPathCompletedCalledAt0 = false;
                }
            }
        }
Esempio n. 3
0
    /// <summary>
    /// Update lorsque la spline suivi est un cercle, permet de check les conditions de sortie
    /// </summary>
    void PathUpdateCircle()
    {
        //Si le cercle actuel ne correspond pas au cercle voulue
        if (curCircleIndex != newCircleIndex && curSpline != null)
        {
            int   nextIndex;                                                        //Correspondra à l'index de la line de sortie
            float dist;                                                             //Correspondra à la distance entre le flock et l'intersection de sortie

            BezierSolution.BezierSpline.PointIndexTuple indexTuple;                 //variable qui stock l'index des intersections suivante et précedente sur la spline

            indexTuple = curSpline.GetNearestPointIndicesTo(SC_bezier.NormalizedT); //Récupère les index en fonction de la position actuel du flock


            //Si le Flock est en mode attaque et que le Path Preference est Line
            if (isAttacking)
            {
                //L'index de sortie est l'index correspondant a la line sur lequel le path d'attaque est situé
                nextIndex = newLineIndex;
            }
            //Sinon
            else if (SC_bezier.MovingForward)
            {
                //Si le flock est en rotation Horraire recupère l'index d'interessection suivant
                nextIndex = indexTuple.index2;
            }
            else
            {
                //Sinon récupère le précédent
                nextIndex = indexTuple.index1;
            }

            //Calcul la distance actuel entre le flock et l'intersection
            if (_IntersectionTab[curCircleIndex, nextIndex] != null)
            {
                dist = Vector3.Distance(_IntersectionTab[curCircleIndex, nextIndex].position, transform.position);
            }
            else
            {
                dist = 10000;
            }


            //Si la distance en inférieure a la distance minimale requise
            if (dist < DistanceChangeSpline)
            {
                //Change vers la spline Line et se déplace vers le prochain cercle
                if (curCircleIndex > newCircleIndex)
                {
                    SC_bezier.MovingForward = false;
                }
                else
                {
                    SC_bezier.MovingForward = true;
                }

                GetOnLineSpline(nextIndex);
            }
        }

        /*
         * //Si le flock doit aller sur une spline d'attaque et qu'il est sur le bon index de cercle où ce situe l'entrée de la spline
         * else if(isAttacking)
         * {
         *  //check les distance entre le flock et le point d'entrée de la spline
         *  float dist;
         *  dist = Vector3.Distance(_IntersectionTab[curCircleIndex, newLineIndex].position, transform.position);
         *
         *
         *  //Si la distance en inférieure a la distance minimale requise
         *  if (dist < DistanceChangeSpline)
         *  {
         *      //Change de spline pour passer sur la spline Attaque
         *      SC_bezier.MovingForward = true;
         *      GetOnAttackSpline(newAttackPathIndex);
         *  }
         * }*/
    }