public void SpawnObject(GameObject prefab)
        {
            prefab.SetActive(false);
            GameObject instance = Instantiate <GameObject>(prefab, Vector3.zero, Quaternion.identity, transform);

            if (instance.transform is RectTransform)
            {
                RectTransform rect       = instance.transform as RectTransform;
                RectTransform parentRect = GetComponentInParent <RectTransform>();
                if (parentRect != null)
                {
                    rect.transform.localPosition = Vector3.zero;
                    rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, parentRect.rect.width);
                    rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, parentRect.rect.height);
                }
            }
            prefab.SetActive(true);

            GameObjectStackElement element = instance.GetComponent <GameObjectStackElement>();

            if (element == null)
            {
                element = instance.AddComponent <GameObjectStackElement>();
            }

            stack.Add(element);

            instance.SetActive(true);
        }
        public void PopTopElement()
        {
            if (stack.Count == 0)
            {
                return;
            }
            GameObjectStackElement instance = stack[stack.Count - 1];

            stack.RemoveAt(stack.Count - 1);
            Destroy(instance.gameObject);
        }
        public void HandleCloseButtonClicked()
        {
            GameObjectStackElement element = GetComponentInParent <GameObjectStackElement>();

            GameObjectStack stack = element.GetComponentInParent <GameObjectStack>();

            if (stack.stack.Count > 0 && stack.stack[stack.stack.Count - 1] == element)
            {
                stack.PopTopElement();
                if (onCloseClicked != null)
                {
                    onCloseClicked.Invoke();
                }
            }
        }
        void FindStack()
        {
            Transform elementSearchObj = transform;
            Transform stackSearchObj   = elementSearchObj.parent;

            while (stack == null && stackSearchObj != null)
            {
                GameObjectStack foundStack = stackSearchObj.GetComponent <GameObjectStack>();
                if (foundStack != null && (string.IsNullOrEmpty(stackId) || stackId == foundStack.id))
                {
                    stack   = foundStack;
                    element = elementSearchObj.GetComponent <GameObjectStackElement>();
                    return;
                }

                elementSearchObj = stackSearchObj;
                stackSearchObj   = elementSearchObj.parent;
            }
        }
        public void RemoveElement(GameObject element)
        {
            if (element == null)
            {
                return;
            }
            GameObjectStackElement instance = element.GetComponent <GameObjectStackElement>();

            if (instance == null)
            {
                return;
            }
            int index = stack.FindIndex(se => se == instance);

            if (index != -1)
            {
                stack.RemoveAt(index);
                Destroy(instance.gameObject);
            }
        }