eye-therapy-2 / Assets / Scripts / Interactables / Lever / LeverSmooth.cs
LeverSmooth.cs
Raw
using UnityEngine;

public abstract class LeverSmooth : Lever
{
    #region Variables

    [Space]
    [SerializeField] [Range(0f, 1f)] protected float positiveClamp = 1f;
    [SerializeField] [Range(0f, 1f)] protected float negativeClamp = 1f;
    [SerializeField] protected bool linkClamps = false;

    protected float posClampPrev = 0.5f;
    protected float value = 0f;

    #endregion

    #region Methods

    protected override void ProcessLever()
    {
        JointLimits limits = lever.limits;

        if (lever.angle > positiveThreshold * limits.max)
        {
            if (lever.angle > positiveClamp * limits.max)
                value = 1f;
            else
            {
                float offset = positiveThreshold * limits.max;
                value = (lever.angle - offset) / (limits.max * positiveClamp - offset);
            }
        }
        else if (lever.angle < negativeThreshold * limits.min)
        {
            if (lever.angle < negativeClamp * limits.min)
                value = -1f;
            else
            {
                float offset = negativeThreshold * limits.min;
                value = -((lever.angle - offset) / (limits.min * negativeClamp - offset));
            }
        }

        if (invertDirections)
            value = -value;
    }

#if UNITY_EDITOR
    protected override void OnValidate()
    {
        base.OnValidate();

        if (linkClamps)
        {
            if (positiveClamp != posClampPrev)
                negativeClamp = positiveClamp;
            else
                positiveClamp = negativeClamp;
            posClampPrev = positiveClamp;
        }
        if (positiveClamp < positiveThreshold)
            positiveClamp = positiveThreshold;
        if (negativeClamp < negativeThreshold)
            negativeClamp = negativeThreshold;
    }
#endif

#endregion
}