using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.UI; namespace UIWidgets { [RequireComponent(typeof(RectTransform))] public class ModalHelper : MonoBehaviour, ITemplatable, IPointerClickHandler, IEventSystemHandler { private bool isTemplate = true; private UnityEvent OnClick = new UnityEvent(); private static Templates Templates = new Templates(); private static Dictionary used = new Dictionary(); private static string key = "ModalTemplate"; public bool IsTemplate { get { return isTemplate; } set { isTemplate = value; } } public string TemplateName { get; set; } private void OnDestroy() { Templates.Delete(key); } public void OnPointerClick(PointerEventData eventData) { OnClick.Invoke(); } public static int Open(MonoBehaviour parent, Sprite sprite = null, Color? color = null, UnityAction onClick = null) { if (!Templates.Exists(key)) { Templates.FindTemplates(); CreateTemplate(); } ModalHelper modalHelper = Templates.Instance(key); modalHelper.transform.SetParent(Utilites.FindCanvas(parent.transform), false); modalHelper.gameObject.SetActive(true); modalHelper.transform.SetAsLastSibling(); RectTransform rectTransform = modalHelper.transform as RectTransform; rectTransform.sizeDelta = new Vector2(0f, 0f); rectTransform.anchorMin = new Vector2(0f, 0f); rectTransform.anchorMax = new Vector2(1f, 1f); rectTransform.anchoredPosition = new Vector2(0f, 0f); Image component = modalHelper.GetComponent(); if (sprite != null) { component.sprite = sprite; } if (color.HasValue) { component.color = color.Value; } modalHelper.OnClick.RemoveAllListeners(); if (onClick != null) { modalHelper.OnClick.AddListener(onClick); } used.Add(modalHelper.GetInstanceID(), modalHelper); return modalHelper.GetInstanceID(); } private static void CreateTemplate() { GameObject gameObject = new GameObject(key); ModalHelper template = gameObject.AddComponent(); gameObject.AddComponent(); Templates.Add(key, template); } public static void Close(int index) { if (used != null && used.ContainsKey(index)) { used[index].OnClick.RemoveAllListeners(); Templates.ToCache(used[index]); used.Remove(index); } } } }