Files
Studio/Assets/Scripts/XED/UI/Elements/UI_ButtonDropdown.cs
2025-02-24 09:26:27 +09:00

71 lines
2.4 KiB
C#

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