public static Vector2 HorizontalMovementByForce(float acceleration, float constant, float maxSpeed, float direction, Rigidbody2D rigidBody, float surfaceAngle, Vector2 surfaceNormal) { var velocity = (maxSpeed / 3.6f) * constant; var force = ForceCalcByAcceleration(acceleration * constant, rigidBody.mass) + FrictionForceCalc(0.4f, Physics2D.gravity.y, rigidBody.mass) + SlopeForceCalc(surfaceAngle, surfaceNormal, direction, rigidBody.mass, Physics2D.gravity.y); var forceApplied = new Vector2(force, 0) * direction; if (!MathHelpers.Approximately(surfaceAngle, 0, float.Epsilon)) { forceApplied = new Vector2( force * MathHelpers.AbsCos(surfaceAngle), force * (!SlopeInclinationRight(surfaceNormal) ? -MathHelpers.AbsSin(surfaceAngle) : MathHelpers.AbsSin(surfaceAngle))) * direction; } if (rigidBody.velocity.magnitude > velocity) { rigidBody.AddRelativeForce(-forceApplied); } rigidBody.AddRelativeForce(forceApplied); return(forceApplied); }
public static Vector2 AddImpulseForce(float force, Vector3 aimDirection, Rigidbody2D rigidBody) { var angle = Vector2.Angle(aimDirection.normalized, Vector2.right); var forceApplied = new Vector2( aimDirection.normalized.x < 0 ? -force * MathHelpers.AbsCos(angle) : force * MathHelpers.AbsCos(angle), aimDirection.normalized.y < 0 ? -force * MathHelpers.AbsSin(angle) : force * MathHelpers.AbsSin(angle)); rigidBody.AddForce(forceApplied, ForceMode2D.Impulse); return(forceApplied); }
public static Vector2 AddImpulseForce(float force, float surfaceAngle, Vector2 surfaceNormal, Rigidbody2D rigidBody, FacingDirection facingDirection) { force += SlopeForceCalc(surfaceAngle, surfaceNormal, facingDirection == FacingDirection.Right ? 1 : -1, rigidBody.mass, Physics2D.gravity.y) * 0.385f; var forceApplied = new Vector2(force * MathHelpers.AbsCos(surfaceAngle), force * (!SlopeInclinationRight(surfaceNormal) ? -MathHelpers.AbsSin(surfaceAngle) : MathHelpers.AbsSin(surfaceAngle))); if (facingDirection == FacingDirection.Right) { rigidBody.AddForce(forceApplied, ForceMode2D.Impulse); } else { rigidBody.AddForce(-forceApplied, ForceMode2D.Impulse); } return(forceApplied); }
public static void PreventSlideOnSlopes(float slopeAngle, Vector2 surfaceNormal, bool isIdle, Rigidbody2D rigidbody2D) { var forceMagnitude = SlopeForceCalc(slopeAngle, rigidbody2D.mass, Physics2D.gravity.y); var force = new Vector2( SlopeInclinationRight(surfaceNormal) ? forceMagnitude * MathHelpers.AbsCos(slopeAngle) : -forceMagnitude * MathHelpers.AbsCos(slopeAngle), forceMagnitude * MathHelpers.AbsSin(slopeAngle)); if (MathHelpers.Approximately(rigidbody2D.velocity.magnitude, 0, 0.1f) && isIdle) { rigidbody2D.velocity = Vector2.zero; } if (rigidbody2D.velocity.y > 0) { return; } rigidbody2D.AddRelativeForce(force); }