using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.Events; using UnityEngine.EventSystems; using TMPro; namespace Michsky.MUIP { public class CustomDropdown : MonoBehaviour, IPointerExitHandler, IPointerEnterHandler, IPointerClickHandler, ISubmitHandler { // Resources public Animator dropdownAnimator; public GameObject triggerObject; public TextMeshProUGUI selectedText; public Image selectedImage; public Transform itemParent; public GameObject itemObject; public GameObject scrollbar; public VerticalLayoutGroup itemList; public AudioSource soundSource; public RectTransform listRect; public CanvasGroup listCG; public CanvasGroup contentCG; // Settings public bool isInteractable = true; public bool enableIcon = true; public bool enableTrigger = true; public bool enableScrollbar = true; public bool updateOnEnable = true; public bool outOnPointerExit = false; public bool setHighPriority = true; public bool invokeAtStart = false; public bool initAtStart = true; public bool enableDropdownSounds = false; public bool useHoverSound = true; public bool useClickSound = true; [Range(1, 50)] public int itemPaddingTop = 8; [Range(1, 50)] public int itemPaddingBottom = 8; [Range(1, 50)] public int itemPaddingLeft = 8; [Range(1, 50)] public int itemPaddingRight = 25; [Range(1, 50)] public int itemSpacing = 8; public int selectedItemIndex = 0; // Animation public AnimationType animationType; public PanelDirection panelDirection; [Range(25, 1000)] public float panelSize = 200; [Range(0.5f, 10)] public float curveSpeed = 3; public AnimationCurve animationCurve = new AnimationCurve(new Keyframe(0.0f, 0.0f), new Keyframe(1.0f, 1.0f)); // Saving public bool saveSelected = false; public string saveKey = "My Dropdown"; // Item list [SerializeField] public List items = new List(); // Events [System.Serializable] public class DropdownEvent : UnityEvent { } public DropdownEvent onValueChanged = new DropdownEvent(); [System.Serializable] public class ItemTextChangedEvent : UnityEvent { } public ItemTextChangedEvent onItemTextChanged = new ItemTextChangedEvent(); // Audio public AudioClip hoverSound; public AudioClip clickSound; // Helpers bool isInitialized = false; [HideInInspector] public bool isOn; [HideInInspector] public int index = 0; [HideInInspector] public int siblingIndex = 0; [HideInInspector] public TextMeshProUGUI setItemText; [HideInInspector] public Image setItemImage; EventTrigger triggerEvent; Sprite imageHelper; string textHelper; #if UNITY_EDITOR public bool extendEvents = false; #endif public enum AnimationType { Modular, Custom } public enum PanelDirection { Bottom, Top } [System.Serializable] public class Item { public string itemName = "Dropdown Item"; public Sprite itemIcon; [HideInInspector] public int itemIndex; public UnityEvent OnItemSelection = new UnityEvent(); } void OnEnable() { if (!isInitialized) { Initialize(); } if (updateOnEnable && index < items.Count) { SetDropdownIndex(selectedItemIndex, false); } listCG.alpha = 0; listCG.interactable = false; listCG.blocksRaycasts = false; listRect.sizeDelta = new Vector2(listRect.sizeDelta.x, 0); } void Initialize() { if (enableTrigger && triggerObject != null) { // triggerButton = gameObject.GetComponent