Please assume the role of a unity developer specialising in unity 2020.2.6f1 and visual studio 2017. This is script 1 hoverboard ramp detection script. Since applying it the script seems to believe everything is a surface to attach to like a ramp. It throws you wildly around if you accidentally touch something not Tagged Ramp:
Script 1

using System.Collections;
using UnityEngine;

public class RampDetection : MonoBehaviour
{
    [Header("Ramp Detection Settings")]
    [SerializeField] private Transform[] rampDetectionPoints;
    [SerializeField] private float detectionRadius = 2f;
    [SerializeField] private float minRampAngle = 80f;
    [SerializeField] private float maxRampAngle = 100f;
    [SerializeField] private float rotationSpeed = 5f; // Speed of rotation adjustment

    private HoverBoardControl hoverBoardControl;
    private Rigidbody rb;

    private void Awake()
    {
        hoverBoardControl = GetComponentInParent<HoverBoardControl>();
        rb = GetComponentInParent<Rigidbody>();

        if (rampDetectionPoints == null || rampDetectionPoints.Length == 0)
        {
            Debug.LogError("RampDetectionPoints have not been assigned in the Inspector", this);
        }
    }

    private void FixedUpdate()
    {
        foreach (var detectionPoint in rampDetectionPoints)
        {
            DetectRamp(detectionPoint);
        }
    }

    private void DetectRamp(Transform detectionPoint)
    {
        if (detectionPoint != null)
        {
            RaycastHit hit;
            if (Physics.Raycast(detectionPoint.position, -Vector3.up, out hit, detectionRadius))
            {
                if (hit.collider.gameObject.layer == LayerMask.NameToLayer("Ramp"))
                {
                    Vector3 rampNormalProjection = Vector3.ProjectOnPlane(hit.normal, Vector3.up);
                    float rampAngle = Vector3.Angle(detectionPoint.forward, rampNormalProjection);

                    if (rampAngle >= minRampAngle && rampAngle <= maxRampAngle)
                    {
                        AdjustHoverboard(hit, detectionPoint.name);
                    }
                }
            }
        }
    }

    private void AdjustHoverboard(RaycastHit hit, string hitPart)
    {
        Debug.Log(hitPart + " detected a ramp collision");

        // Calculate the target alignment of the hoverboard based on the ramp normal
        Vector3 forwardDirection = Vector3.Cross(hit.normal, Vector3.Cross(Vector3.up, hit.normal)).normalized;
        Quaternion targetRotation = Quaternion.LookRotation(forwardDirection, hit.normal);

        // Smoothly lerp the hoverboard’s rotation to the target rotation
        StartCoroutine(SmoothRotateOverTime(rb.transform, targetRotation, rotationSpeed));

        // Set IsGrounded to true to simulate physics behavior while on the ramp
        hoverBoardControl.IsGrounded = true;

        // Adjust hover height based on ramp collision
        float hoverHeight = Mathf.Max(hit.distance, hoverBoardControl.hoverHeight);
        hoverBoardControl.SetHoverHeight(hoverHeight);
    }

    private IEnumerator SmoothRotateOverTime(Transform transform, Quaternion targetRotation, float rotateSpeed)
    {
        while (Quaternion.Angle(transform.rotation, targetRotation) > 0.1f)
        {
            transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotateSpeed * Time.deltaTime);
            yield return new WaitForSeconds(Time.fixedDeltaTime); // Wait for next physics update
        }
    }
}

Script 2:
using UnityEngine;

public class Ramp : MonoBehaviour
{
    [Header("Ramp Transforms")]
    [SerializeField] private Transform[] topTransforms; // Top points of the ramp
    [SerializeField] private Transform[] bottomTransforms; // Bottom points of the ramp

    [Header("Ramp Properties")]
    [SerializeField] private float rampBoost = 1.0f; // Boost multiplier for going uphill
    [SerializeField] private float downhillBoost = 1.5f; // Speed multiplier for going downhill
    [SerializeField] private bool allowRollDownhill = true; // Allow the board to roll downhill

    // The angle of the ramp, editable in the inspector but also calculated at start
    [SerializeField, Range(0, 90)] private float rampAngle = 30f;

    private void Start()
    {
        CalculateRampAngle();
    }

    // This method calculates the ramp angle based on the provided top and bottom transforms
    private void CalculateRampAngle()
    {
        if (topTransforms.Length == 0 || bottomTransforms.Length == 0)
        {
            Debug.LogWarning("TopTransforms and / or BottomTransforms not set on Ramp script.");
            return;
        }

        // Example calculation for a simple ramp
        // This should be adjusted based on your specific ramp geometry
        Vector3 rampDirection = (topTransforms[0].position - bottomTransforms[0].position).normalized;
        rampAngle = Vector3.Angle(rampDirection, Vector3.up);
    }

    public float GetRampBoost()
    {
        return rampBoost;
    }

    public float GetDownhillBoost()
    {
        return downhillBoost;
    }

    public bool ShouldAllowRollDownhill()
    {
        return allowRollDownhill;
    }

    public float GetRampAngle()
    {
        return rampAngle;
    }
}

Please wait for my query before responding.