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); } }