using System.Collections; using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; using UnityEngine.UIElements; namespace XED.UI { public class UI_ButtonDropdown : UnityEngine.MonoBehaviour, IDeselectHandler { [SerializeField] protected GameObject dropdownScrollview; [SerializeField] private UnityEvent onDeselect; [SerializeField] float openTime = 0.1f; private Vector3 closeScale = new Vector3(1, 0, 1); private bool isOpen = false; // Start is called before the first frame update void Awake() { dropdownScrollview.transform.localScale = closeScale; gameObject.AddComponent(); } public virtual void Open() { isOpen = !isOpen; StopAllCoroutines(); if (isOpen) StartCoroutine(CoroutineOpen()); else StartCoroutine(CoroutineClose()); } public void Close() { isOpen = false; StopAllCoroutines(); StartCoroutine(CoroutineClose()); } public void OnDeselect(BaseEventData eventData) { onDeselect?.Invoke(); } IEnumerator CoroutineOpen() { Vector3 currentScale = dropdownScrollview.transform.localScale; Vector3 destScale = Vector3.one; float time = 0; float rate = 0; while (time < openTime) { time += Time.deltaTime; rate = time > openTime ? 1.0f : time / openTime; dropdownScrollview.transform.localScale = Vector3.Lerp(currentScale, destScale, rate); yield return null; } yield return null; } IEnumerator CoroutineClose() { Vector3 currentScale = dropdownScrollview.transform.localScale; Vector3 destScale = closeScale; float time = 0; float rate = 0; yield return new WaitForSeconds(openTime); while (time < openTime) { time += Time.deltaTime; rate = time > openTime ? 1.0f : time / openTime; dropdownScrollview.transform.localScale = Vector3.Lerp(currentScale, destScale, rate); yield return null; } yield return null; } } }