eye-therapy-2 / Assets / Scripts / Interactables / Button / ButtonLimiter.cs
ButtonLimiter.cs
Raw
using System.Collections.Generic;
using UnityEngine;

public class ButtonLimiter : MonoBehaviour
{
    [SerializeField] ButtonBehaviour buttonScript = null;
    [SerializeField] float pressLength = 0.2f;

    Vector3 startPosition;
    bool pressed = false;
    bool allowPress = true;
    Collider col;

    void Start()
    {
        startPosition = transform.localPosition;
        col = GetComponent<Collider>();
    }

    private void LateUpdate()
    {
        transform.localPosition = new Vector3(startPosition.x, Mathf.Min(transform.localPosition.y, startPosition.y), startPosition.z);
    }

    private void OnCollisionStay(Collision collision)
    {
        if (!allowPress) transform.localPosition = startPosition;
        else
        {
            float distance = Mathf.Abs(transform.localPosition.y - startPosition.y);
            if (distance >= pressLength || (pressed && (GetMinLocalY(collision.collider.bounds) < transform.localPosition.y)))
            {
                transform.localPosition = new Vector3(startPosition.x, startPosition.y - pressLength, startPosition.z);
                if (!pressed) pressed = true;
            }
            else pressed = false;
        }
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (GetMinLocalY(collision.collider.bounds) < GetMaxLocalY(col.bounds) - 0.02f)
        {
            allowPress = false;
            transform.localPosition = startPosition;
        }
    }

    private void OnCollisionExit(Collision collision)
    {
        allowPress = true;
    }


    private float GetMinLocalY(Bounds bounds)
    {
        float valueMin = transform.InverseTransformPoint(bounds.min).y;
        float valueMax = transform.InverseTransformPoint(bounds.max).y;
        return Mathf.Min(valueMin, valueMax);
    }

    private float GetMaxLocalY(Bounds bounds)
    {
        float valueMin = transform.InverseTransformPoint(bounds.min).y;
        float valueMax = transform.InverseTransformPoint(bounds.max).y;
        return Mathf.Max(valueMin, valueMax);
    }

    private void OnValidate()
    {
        if (buttonScript) pressLength = buttonScript.PressLength * transform.up.y;
    }

    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.magenta;
        Gizmos.DrawLine(transform.position, transform.position - transform.up * pressLength);
    }
}