Esempio n. 1
0
    /// <summary>
    /// effectue des forces lorsqu'on est grounded, mais toujours en coolDown !
    /// </summary>
    /// <returns></returns>
    private bool ForceGroundedInCoolDown()
    {
        //si on est grounded, alors effectuer un calcul supplémentaire pour savoir si on peut aller
        //dans ce sens !
        if (worldCollision.IsGroundedSafe())
        {
            if (coolDownStilAccrocheABitWhenEndTense.IsReady())
            {
                Debug.Log("ici le cooldown est fini, ne rien faire");
                return(false);
            }
            else
            {
                //Debug.Log("ici on peut se déplacer droite / gauche ??");
                dirPlayerAirMove = jumpCalculation.GetTheGoodAngleWhenTenseInAirMove(dirPlayerAirMove);
                if (dirPlayerAirMove == Vector3.zero)
                {
                    //ici on ne peux pas bouger ?
                    //Debug.Log("ici on peut pas bouger dans ce sens ! définir le dirPlayer vers le mur");

                    //Debug.Log("player: " + playerController.IdPlayer + ", collision: " + worldCollision.GetCollisionSafe());
                    if (worldCollision.IsOnFloor())
                    {
                        //Debug.Log("si on est spécifiquement onFloor, se déplacer normalement !");
                        coolDownStilAccrocheABitWhenEndTense.Reset();
                        return(false);
                    }

                    dirPlayerAirMove = worldCollision.GetSumNormalSafe();
                    //PhysicsExt.ApplyConstForce(rb, dirPlayerAirMove, externalForce.ForceOnWallWhenTense);
                    //externalForce.LittleForceDir(dirPlayerAirMove, externalForce.ForceOnWallWhenTense);
                    return(false);
                }
                else
                {
                    //Debug.Log("ici aller... dans le sens de l'input ? on a fini le airMove, on passe au move classique");
                    if (worldCollision.GetPreviousPersistCollision() != CollisionSimple.Ground)
                    {
                        //Debug.Log("or not");
                        return(false);
                    }
                    Vector3 dirInput = playerInput.GetDirInput();
                    playerMove.MoveOnWallWhenAirMove(dirInput);
                    return(false);
                }
            }
        }
        return(true);
    }
Esempio n. 2
0
    /// <summary>
    /// déplace horizontalement le player
    /// </summary>
    private void MoveHorizOnGround(Vector3 velocityChange)
    {
        if (playerPenduleMove.IsAirTenseOrInCoolDown())
        {
            return;
        }

        Vector3 targetVelocity = velocityChange;

        //si on est en collision avec wall, ou ceilling, gérer ça à part
        if (!CheckCollisionType(velocityChange))
        {
            return;
        }

        //si il n'y a pas d'input, gérer la décélération ??
        if (velocityChange.x == 0)
        {
            DoSlowDownWhenNoInput();
            //animController.NotMoving();
            return;
        }
        //animController.IsMoving(playerInput.Horiz);

        previousInput = velocityChange.x;

        //TODO: rotate, ou remplacer velocityChange par le right/left de la normal de collision...
        //TODO;
        Vector3 dirNormal    = worldCollision.GetSumNormalSafe();
        Vector3 dirReference = velocityChange;

        if (dirNormal != Vector3.zero && dirReference != Vector3.zero)
        {
            Vector3 dir = QuaternionExt.GetTheGoodRightAngleClosest(dirNormal, dirReference, 10f);

            Vector3 direction = dir.normalized;
            float   speed     = velocityChange.magnitude;

            velocityChange = direction * speed;


            Vector3         normalRight = QuaternionExt.CrossProduct(velocityChange, Vector3.forward);
            CollisionSimple rightNormal = worldCollision.WhatKindOfNormalItIs(normalRight);

            Vector3         normalLeft = -QuaternionExt.CrossProduct(velocityChange, Vector3.forward);
            CollisionSimple leftNormal = worldCollision.WhatKindOfNormalItIs(normalLeft);

            /*Vector3 newDir = (rightNormal == CollisionSimple.Ground) ? normalRight : normalLeft;*/

            if (rightNormal == CollisionSimple.Ground || leftNormal == CollisionSimple.Ground)
            {
                if (worldCollision.IsOnCoinGround())
                {
                    //ChooseIfAccelerateOrVelocityChange(velocityChange, ratioForceInCoin);
                    CoinCase(velocityChange);
                }
                else
                {
                    float angle = QuaternionExt.GetAngleFromVector(direction);
                    //Debug.Log("angleDirection: " + angle);

                    if (QuaternionExt.IsAngleCloseToOtherByAmount(90, angle, angleNotAcceptedForOrientedMoveFrom90))
                    {
                        //Debug.Log("ici pas de force orienté par la normal");
                        //Debug.DrawRay(transform.position, dirReference, Color.green, 1f);
                        ChooseIfAccelerateOrVelocityChange(dirReference, ratioForceInBadAngle);
                        return;
                    }

                    if (worldCollision.GetSimpleCollisionSafe() == CollisionSimple.Wall)
                    {
                        ChooseIfAccelerateOrVelocityChange(velocityChange, ratioOnWall);
                    }
                    else
                    {
                        ChooseIfAccelerateOrVelocityChange(velocityChange, 1);
                    }


                    //rb.AddForce(velocityChange, ForceMode.VelocityChange);
                    //Debug.DrawRay(transform.position, velocityChange, Color.green, 1f);
                }
            }
        }
    }
Esempio n. 3
0
 /// <summary>
 /// ici jump par rapport à la normal du sol uniquement !
 /// Appelé à l'arret sur sol, ou sur plafond
 /// </summary>
 private void JumpFromNormal()
 {
     //Debug.Log("jump from normla ground");
     Jump(worldCollision.GetSumNormalSafe());
 }