예제 #1
0
    /// <summary>
    /// ici renvoi vrai si le sens du mouvement va vers le haut
    /// </summary>
    /// <returns></returns>
    private bool IsVelocityIsInGoodSide(PosQuadran posInSpace)
    {
        float dirRigidbody = 0;

        switch (posInSpace)
        {
        case PosQuadran.upLeft:
            dirRigidbody = QuaternionExt.DotProduct(-Vector3.right, rb.velocity);

            if (dirRigidbody > 0)
            {
                return(true);
            }
            else
            {
                return(false);
            }

        case PosQuadran.upRight:
            dirRigidbody = QuaternionExt.DotProduct(Vector3.right, rb.velocity);

            if (dirRigidbody > 0)
            {
                return(true);
            }
            else
            {
                return(false);
            }

        case PosQuadran.downLeft:
            dirRigidbody = QuaternionExt.DotProduct(Vector3.right, rb.velocity);

            if (dirRigidbody > 0)
            {
                return(true);
            }
            else
            {
                return(false);
            }

        case PosQuadran.downRight:
            dirRigidbody = QuaternionExt.DotProduct(-Vector3.right, rb.velocity);

            if (dirRigidbody > 0)
            {
                return(true);
            }
            else
            {
                return(false);
            }

        case PosQuadran.ambigous:
        default:
            return(false);
        }
    }
예제 #2
0
 /// <summary>
 /// renvoi vrai si la positionInSpace est en haut
 /// </summary>
 private bool IsUpward(PosQuadran posInSpace)
 {
     if (posInSpace == PosQuadran.upLeft || posInSpace == PosQuadran.upRight)
     {
         return(true);
     }
     return(false);
 }
예제 #3
0
    private void DoNewPenduleForce()
    {
        PosQuadran posInSpace = PendulePart(pointPivot, transform.position);

        bool isGoodVelocitySide    = !IsVelocityIsInGoodSide(posInSpace); //ici test si la velocité actuel du rigidbody va vers le haut
        bool isGoodInputToVelocity = IsGoodInputToVelocy();               //ici test si l'input est vers le sens du rigidbody

        //si on va vers le haut, et qu'on fait l'inverse de l'input, autorise l'inverse (reset la force à 1.0f ?)
        if (isGoodVelocitySide && !isGoodInputToVelocity)
        {
            //ici interdire ce mouvement
            if (!YELLOWupApplyDecelerationOnUp && IsUpward(posInSpace))
            {
                return;
            }

            //Debug.LogWarning("//TODO: ici check l'inversse");
            AddForcePenduleInverseOrNot(-airForceToAdd * ratioWhenRemove);

            Debug.DrawRay(transform.position, dirPlayerAirMove * 5, Color.yellow, 0.3f);
        }
        //si on va vers le haut, et qu'on va dans le sens de l'input
        else if (isGoodVelocitySide && isGoodInputToVelocity)
        {
            //ici interdire ce mouvement
            if (!RedupApplyAccelerationOnUp && IsUpward(posInSpace))
            {
                return;
            }

            //si la vitesse du rb est basse, tester avec l'angle de 20
            if (rb.velocity.sqrMagnitude < velocityWhenAngleDontMatterOnRed)
            {
                if (!IsAngleDownOk(angleDiffForRopeWrongSide))
                {
                    return;
                }
            }
            //si la vitesse du rb est haute, tester avec un angle suérieur de 40
            else
            {
                //if (!IsAngleDownOk(angleDiffForRopeWrongSideAndFast))
                //  return;
            }
            //checker l'angle Vector.down & player - pivot
            //if (!IsAngleDownOk())
            //    return;

            //InverseReset();
            //AddForcePendule(airForceToAdd);
            AddForcePenduleInverseOrNot(airForceToAdd);

            Debug.DrawRay(transform.position, dirPlayerAirMove * 10, Color.red, 0.3f);
        }
        //si on est en train de tomber, et que on va dans le sens
        else if (!isGoodVelocitySide && isGoodInputToVelocity)
        {
            //ici interdire ce mouvement
            if (!GREENupApplyAccelerationOnDecent && IsUpward(posInSpace))
            {
                return;
            }

            //InverseReset();
            //AddForcePendule(airForceToAdd);
            AddForcePenduleInverseOrNot(airForceToAdd);

            Debug.DrawRay(transform.position, dirPlayerAirMove * 5, Color.green, 0.3f);
        }
        else if (!isGoodVelocitySide && !isGoodInputToVelocity)
        {
            //ici interdire ce mouvement
            if (!MAJENTAupApplyDecelerationOnDecent && IsUpward(posInSpace))
            {
                return;
            }

            //ici le rigidbody est trop lent pour appliquer cette force
            if (rb.velocity.sqrMagnitude < velocityMinForMajenta)
            {
                return;
            }

            //Debug.LogWarning("//TODO: ici check l'inversse");
            AddForcePenduleInverseOrNot(-airForceToAdd * ratioWhenRemove);

            Debug.DrawRay(transform.position, dirPlayerAirMove * 5, Color.magenta, 0.3f);
        }


        lastDirTensity = dirPlayerAirMove;
        ApplyAirMoveForce(dirPlayerAirMove, airForce * playerGetFat.boostAirMoveWhenFat());
    }