public Vector3 CalculatePaddleForce(ZB_PaddleBlade paddleBlade)
    {
        float velocity = paddleBlade.Speed;

        //print(velocity);
        if (velocity > velocityDeadZone)
        {
            float submergedArea = paddleBlade.SubmergedArea;
            if (submergedArea > 0)
            {
                Vector3 thrust = paddleBlade.RawForce;

                Vector3 normalizedThrust = thrust.normalized;
                if (restrictOptimalVelocity && velocity > maxOptimalVelocity)
                {
                    thrust = normalizedThrust * velocityRestricter;
                }

                return(thrust);
            }
        }
        return(Vector3.zero);
    }
    void AddPaddleForce(Vector3 paddleForce, ZB_PaddleBlade blade)
    {
        //var velocity = forceTarget.velocity;

        //// convert a portion of the given force to a forward impulse
        //float dot = Vector3.Dot(forceTarget.transform.InverseTransformVector(paddleForce).normalized, _boatForward);
        //float obliqueness = Mathf.Abs(dot);

        //if (DebugText.gameObject.activeSelf)
        //    DebugText.text = Math.Round(dot, 2, MidpointRounding.AwayFromZero).ToString();

        //_currForwardForce = forceTarget.transform.TransformVector(_boatForward).normalized * dot * paddleThrustMultiplier * 5f;
        //forceTarget.AddForce(_currForwardForce);

        // add force
        if (blade.ForcePoint != null)
        {
            forceTarget.AddForceAtPosition(paddleForce * paddleThrustMultiplier /** (1f - dot)*/, blade.ForcePoint.transform.position);
        }
        else
        {
            forceTarget.AddForceAtPosition(paddleForce * paddleThrustMultiplier /** (1f - dot)*/, blade.transform.position);
        }
    }