public void Reset()
    {
        UnlockAllAxes();
        enableAutomaticAxisLockingWhenIdle = true;

        groundChecker.Reset();
        netImpulseForce               = Vector2.zero;
        penguinRigidBody.velocity     = Vector2.zero;
        penguinRigidBody.position     = initialSpawnPosition;
        penguinRigidBody.isKinematic  = false;
        penguinRigidBody.useAutoMass  = false;
        penguinRigidBody.mass         = mass;
        penguinRigidBody.centerOfMass = new Vector2(centerOfMassX, centerOfMassY);

        xMotionIntensity = 0.00f;
        penguinAnimator.applyRootMotion = true;
        penguinAnimator.updateMode      = AnimatorUpdateMode.Normal;
        ClearVerticalMovementTriggers();

        TurnToFace(Facing.RIGHT);
        UpdateAnimatorParameters();

        // align penguin with surface normal in a single update
        posture = Posture.UPRIGHT;
        groundChecker.CheckForGround(fromPoint: ComputeReferencePoint(), extraLineHeight: torsoCollider.bounds.extents.y);
        Vector2 targetUpAxis = groundChecker.WasDetected ? groundChecker.SurfaceNormalOfLastContact : Vector2.up;

        AlignPenguinWithUpAxis(targetUpAxis, forceInstantUpdate: true);
        groundChecker.Reset();
    }