/// <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); }
/// <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); } } } }
/// <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()); }