using UnityEngine;
public class CountryDropdownUI : MonoBehaviour
{
[Header("Panel")]
[SerializeField] private RectTransform dropdownPanel;
[SerializeField] private RectTransform hoverArea;
[SerializeField] private CanvasGroup canvasGroup;
[Header("Animation")]
[SerializeField, Min(1f)]
private float animationSpeed = 1200f;
[Header("Tabs")]
[SerializeField] private GameObject[] tabContents;
private Vector2 openPosition;
private Vector2 closedPosition;
private bool isOpen;
private void Start()
{
openPosition = dropdownPanel.anchoredPosition;
closedPosition = openPosition +
Vector2.up * dropdownPanel.rect.height;
dropdownPanel.anchoredPosition = closedPosition;
canvasGroup.alpha = 1f;
canvasGroup.interactable = false;
canvasGroup.blocksRaycasts = false;
SelectTab(0);
}
private void Update()
{
CheckMousePosition();
AnimatePanel();
}
private void CheckMousePosition()
{
bool isOverHoverArea =
RectTransformUtility.RectangleContainsScreenPoint(
hoverArea,
Input.mousePosition,
null
);
bool isOverPanel =
RectTransformUtility.RectangleContainsScreenPoint(
dropdownPanel,
Input.mousePosition,
null
);
bool shouldOpen = isOverHoverArea || isOverPanel;
if (shouldOpen != isOpen)
{
SetPanelState(shouldOpen);
}
}
private void SetPanelState(bool open)
{
isOpen = open;
canvasGroup.interactable = open;
canvasGroup.blocksRaycasts = true;
}
private void AnimatePanel()
{
Vector2 targetPosition = isOpen
? openPosition
: closedPosition;
dropdownPanel.anchoredPosition = Vector2.MoveTowards(
dropdownPanel.anchoredPosition,
targetPosition,
animationSpeed * Time.unscaledDeltaTime
);
bool animationFinished =
Vector2.Distance(
dropdownPanel.anchoredPosition,
targetPosition
) < 0.01f;
if (!isOpen && animationFinished)
{
canvasGroup.blocksRaycasts = false;
}
}
public void SelectTab(int index)
{
if (index < 0 || index >= tabContents.Length)
{
return;
}
for (int i = 0; i < tabContents.Length; i++)
{
if (tabContents[i] != null)
{
tabContents[i].SetActive(i == index);
}
}
}
}