using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; using UnityEngine.UI; namespace HeavenStudio.Common { public class RightClickDropdownObject : MonoBehaviour, IPointerClickHandler { [SerializeField] private Event[] _events; [Header("Components")] [SerializeField] private Transform _masterTrans; [SerializeField] private RectTransform _dropDown; private Button _dropDownButton; private RectTransform _currentDropDown; private bool _beingHovered; private void Awake() { _dropDownButton = _dropDown.GetChild(0).GetChild(0).GetComponent<Button>(); } private void OnDestroy() { if (_currentDropDown != null) Destroy(_currentDropDown.gameObject); } private void OnDisable() { if (_currentDropDown != null) Destroy(_currentDropDown.gameObject); } private void Update() { if (_beingHovered) return; if (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1)) { if (_currentDropDown != null) Destroy(_currentDropDown.gameObject); } } public void OnPointerClick(PointerEventData eventData) { if (eventData.button != PointerEventData.InputButton.Right || _events.Length == 0) return; _currentDropDown = Instantiate(_dropDown, _masterTrans); _currentDropDown.transform.position = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10)); foreach(var e in _events) { Button spawnedButton = Instantiate(_dropDownButton, _currentDropDown.GetChild(0)); spawnedButton.onClick.AddListener(new UnityAction(() => { e.action.Invoke(); if (_currentDropDown != null) Destroy(_currentDropDown.gameObject); })); spawnedButton.transform.GetChild(0).GetComponent<TMP_Text>().text = e.name; spawnedButton.gameObject.SetActive(true); EventTrigger eventTrigger = spawnedButton.GetComponent<EventTrigger>(); EventTrigger.Entry enter = new(); enter.eventID = EventTriggerType.PointerEnter; enter.callback.AddListener(new UnityAction<BaseEventData>((BaseEventData e) => { _beingHovered = true; })); eventTrigger.triggers.Add(enter); EventTrigger.Entry exit = new(); exit.eventID = EventTriggerType.PointerExit; exit.callback.AddListener(new UnityAction<BaseEventData>((BaseEventData e) => { _beingHovered = false; })); eventTrigger.triggers.Add(exit); } } [System.Serializable] private struct Event { public string name; public UnityEvent action; } } }