71 lines
2.4 KiB
C#
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;
|
|
}
|
|
}
|
|
} |