Example #1
0
    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);
    }
Example #2
0
    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);
    }
Example #3
0
    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);
    }
Example #4
0
    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);
    }