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 }