Загрузка данных


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