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