Files
JJBB/Assets/Project/Script/GUI/Base/UIImgText/UIImgText.cs
2024-08-23 15:49:34 +08:00

133 lines
3.9 KiB
C#

using System.Collections;
using System.Collections.Generic;
using Module.Log;
using UnityEngine;
using UnityEngine.UI;
[ExecuteInEditMode]
public class UIImgText : MonoBehaviour
{
public UIImgFont _ImgFont;
public TextAnchor _TextAnchor = TextAnchor.UpperLeft;
protected string _text = "";
[SerializeField]
public string text
{
get
{
return _text;
}
set
{
_text = value;
ShowImage(_text);
}
}
public RectTransform _CharRoot;
public bool _ResizeChatRoot = true;
protected void InitCharRoot()
{
if (_CharRoot != null)
return;
var charRoot = new GameObject("CharRoot");
var horizon = charRoot.AddComponent<HorizontalLayoutGroup>();
horizon.childAlignment = _TextAnchor;
horizon.childForceExpandHeight = false;
horizon.childForceExpandWidth = false;
var layoutElement = charRoot.AddComponent<LayoutElement>();
layoutElement.ignoreLayout = true;
_CharRoot = charRoot.GetComponent<RectTransform>();
_CharRoot.SetParent(transform);
_CharRoot.sizeDelta = new Vector2(0, _CharRoot.sizeDelta.y);
_CharRoot.localPosition = Vector3.zero;
_CharRoot.localRotation = Quaternion.Euler(Vector3.zero);
_CharRoot.localScale = Vector3.one;
_CharRoot.sizeDelta = GetComponent<RectTransform>().sizeDelta;
}
public void SetCharRootAlig(TextAnchor alig)
{
if (_CharRoot == null)
return;
var horizon = _CharRoot.gameObject.GetComponent<HorizontalLayoutGroup>();
if (horizon == null)
return;
horizon.childAlignment = alig;
}
#region
protected Stack<Image> _IdleImgs = new Stack<Image>();
protected Image PopIdleImage()
{
InitCharRoot();
if (_IdleImgs == null || _IdleImgs.Count == 0)
{
var imageGO = new GameObject("charImg");
var image = imageGO.AddComponent<Image>();
imageGO.transform.SetParent(_CharRoot);
imageGO.transform.localPosition = Vector2.zero;
imageGO.transform.localRotation = Quaternion.Euler(Vector3.zero);
imageGO.transform.localScale = Vector3.one;
image.raycastTarget = false;
image.gameObject.SetActive(true);
return image;
}
else
{
var image = _IdleImgs.Pop();
image.gameObject.SetActive(true);
return image;
}
}
protected List<Image> _CharImages = new List<Image>();
protected void ClearImage()
{
for (int i = 0; i < _CharImages.Count; ++i)
{
_CharImages[i].gameObject.SetActive(false);
_IdleImgs.Push(_CharImages[i]);
}
if (_CharRoot != null && _ResizeChatRoot)
{
_CharRoot.sizeDelta = new Vector2(0, _CharRoot.sizeDelta.y);
}
_CharImages.Clear();
}
protected void ShowImage(string text)
{
ClearImage();
_ImgFont.InitChars();
for (int i = 0; i < text.Length; ++i)
{
if (!_ImgFont._DictImgChars.ContainsKey(text[i]))
{
LogModule.ErrorLog(string.Format(" {0} No Img Char :{1}" ,text, text[i]));
continue;
}
var image = PopIdleImage();
var charImg = _ImgFont._DictImgChars[text[i]];
image.sprite = charImg._Image;
image.rectTransform.sizeDelta = new Vector2(charImg._CharWidth, charImg._CharHeight);
image.rectTransform.SetAsLastSibling();
if (_ResizeChatRoot)
{
_CharRoot.sizeDelta = new Vector2(_CharRoot.sizeDelta.x + charImg._CharWidth, _CharRoot.sizeDelta.y);
}
_CharImages.Add(image);
}
}
#endregion
}