private UITextDamage GetAvailableText(string keyType)
        {
            bool ok = m_dTextTypes.ContainsKey(keyType);

            if (!ok)
            {
                Debug.LogError("Text Damage -> Cannot find keyType " + keyType + " on  manager " + gameObject.name);
                return(null);
            }

            List <UITextDamage> candidates = m_dTextTypes[keyType];

            for (int i = 0; i < candidates.Count; i++)
            {
                if (candidates[i].gameObject.activeSelf)
                {
                    continue;
                }
                if (candidates[i].UsedLabel != null)
                {
                    candidates[i].UsedLabel.transform.localPosition = Vector3.zero;
                }
                candidates[i].transform.localScale = Vector3.one;
                return(candidates[i]);
            }

            // Instantiate new
            List <UITextDamage> container   = m_dTextTypes[keyType];
            UITextDamage        newInstance = AllocateOneInstance(textTypes.Find(t => t.keyType == keyType));

            container.Add(newInstance);

            return(newInstance);
        }
        private void Label_eventOnEnd(UITextDamage obj)
        {
            obj.eventOnEnd -= Label_eventOnEnd;

            List <Transform> keys = new List <Transform> (instancesInScreen.Keys);

            foreach (Transform key in keys)
            {
                List <UITextDamage> aux = new List <UITextDamage>(instancesInScreen[key].ToArray( ));
                aux.Remove(obj);
                instancesInScreen[key] = new Queue <UITextDamage>(aux);
            }
        }
        private void Label_eventOnEnd(UITextDamage obj, Transform transformFollow)
        {
            obj.eventOnEnd -= Label_eventOnEnd;

            if (m_instancesInScreen.ContainsKey(transformFollow))
            {
                m_instancesInScreen[transformFollow].Remove(obj);

                if (transformFollow)
                {
                    if (m_tempObjects.Contains(transformFollow.gameObject))
                    {
                        transformFollow.gameObject.SetActive(false);
                    }
                }
            }
        }
        /// <summary>
        /// Shows a desired text.
        /// </summary>
        /// <param name="text">text to show as string</param>
        /// <param name="target">transform for the text position to show</param>
        /// <param name="key">key type</param>
        public void Add(string text, Transform target, string key = "default")
        {
            // Get available text instance to use
            UITextDamage uiToUse = GetAvailableText(key);

            if (!instancesInScreen.ContainsKey(target))
            {
                instancesInScreen.Add(target, new Queue <UITextDamage>( ));
            }

            instancesInScreen[target].Enqueue(uiToUse);

            // Subscribe to animation end event
            uiToUse.eventOnEnd += Label_eventOnEnd;

            // Show and set the text
            uiToUse.Show(text, target);
        }
        /// <summary>
        /// Shows a desired text.
        /// </summary>
        /// <param name="text">Text to show as string</param>
        /// <param name="target">Transform for the text position to show</param>
        /// <param name="key">Key type</param>
        public void Add(string text, Transform target, string key = "default")
        {
            // Get available text instance to use
            UITextDamage uiToUse = GetAvailableText(key);

            if (!m_instancesInScreen.ContainsKey(target))
            {
                m_instancesInScreen.Add(target, new List <UITextDamage>( ));
            }

            m_instancesInScreen[target].Add(uiToUse);

            // Subscribe to animation end event
            uiToUse.eventOnEnd += Label_eventOnEnd;

            // Inject the transform
            uiToUse.currentTransformFollow = target;

            // Show and set the text
            uiToUse.Show(text, target);
        }
        /// <summary>
        /// Instantiates one text object of the desired type
        /// </summary>
        /// <param name="text">damage type</param>
        /// <returns></returns>
        private UITextDamage AllocateOneInstance(TextDamageType text)
        {
            if (text == null)
            {
                return(null);
            }

            GameObject g = Instantiate(text.prefab.gameObject) as GameObject;

            g.transform.SetParent(transform);
            g.transform.localPosition = Vector3.zero;
            g.transform.localRotation = Quaternion.identity;

            UITextDamage td = g.GetComponent <UITextDamage>( );

            td.Canvas        = this.canvas;
            td.Cam           = theCamera;
            td.followsTarget = followsTarget;
            g.SetActive(false);

            return(td);
        }