实现类:
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class ImageNumber : MonoBehaviour
{
public enum LabelPos
{//label的位置
Front,//前面
End//后面
}
private int m_num;//显示的数字
private float m_spacing;//字间距
[HideInInspector]
public TextAnchor m_alignment;//对齐方式
private Color m_color = Color.white;
private RectTransform m_cellHome;
private RectTransform m_label;
private LabelPos m_lablePos = LabelPos.Front;
private float m_labelSpacing = 1;
public Sprite[] m_spList = new Sprite[10];//资源位图序列
///设置显示内容
public int content
{
set
{
m_num = value;
ShowNumber(value);
}
get
{
return m_num;
}
}
//异步设置显示内容
public void SetContentAsync(int value)
{
m_num = value;
ShowNumber(value);
}
///设置间距
public float spacing
{
set
{
m_spacing = value;
UpdateCellsPos();
}
get
{
return m_spacing;
}
}
///设置对齐方式
public TextAnchor alignment
{
set
{
m_alignment = value;
UpdateCellsPivot();
UpdateCellsPos();
}
get
{
return m_alignment;
}
}
///设置颜色
public Color color
{
set
{
m_color = value;
UpdateCellsColor();
}
get
{
return m_color;
}
}
private RectTransform label
{
get
{
if (m_label == null)
{
Transform tf = this.transform.Find("Label");
if (tf != null)
m_label = tf.GetComponent<RectTransform>();
}
return m_label;
}
set
{
m_label = value;
}
}
public Sprite labelSprite
{
set
{
if (value == null)
{
if (label != null)
{
#if UNITY_EDITOR
DestroyImmediate(label.gameObject);
#else
Destroy(m_label.gameObject);
#endif
label = null;
}
}
else
{
if (label == null)
{
label = CrearImageNumCell(GetCellHome(), "Label", value);
label.SetParent(this.transform);
label.SetSiblingIndex(0);
}
else
{
label.GetComponent<Image>().sprite = value;
label.GetComponent<Image>().SetNativeSize();
}
UpdateCellsPos();
}
}
get
{
if (label != null)
{
return label.GetComponent<Image>().sprite;
}
return null;
}
}
public LabelPos labelPos
{
set
{
m_lablePos = value;
UpdateCellsPos();
}
get
{
return m_lablePos;
}
}
public float labelSpacing
{
set
{
m_labelSpacing = value;
UpdateCellsPos();
}
get
{
return m_labelSpacing;
}
}
private void ShowNumber(int numValue)
{
if (m_cellHome == null)
m_cellHome = GetCellHome();
List<int> numCells = null;
if (numValue == 0)
{
numCells = new List<int>() { 0 };
}
else
{
numCells = new List<int>();
}
while (numValue > 0)
{
numCells.Add(numValue % 10);
numValue /= 10;
}
if (m_cellHome == null)
m_cellHome = GetCellHome();
int cellIndex = 0;
for (int i = numCells.Count - 1; i >= 0; i--)
{
Image cell = null;
if (cellIndex >= m_cellHome.childCount)
{
cell = CrearImageNumCell(m_cellHome, "cellImg_" + cellIndex, m_spList[numCells[i]]).GetComponent<Image>();
}
else
{
cell = m_cellHome.GetChild(cellIndex).GetComponent<Image>();
cell.gameObject.SetActive(true);
cell.sprite = m_spList[numCells[i]];
cell.SetNativeSize();
}
cellIndex++;
}
for (; cellIndex < m_cellHome.childCount; cellIndex++)
{
m_cellHome.GetChild(cellIndex).gameObject.SetActive(false);
}
UpdateCellsPos();
}
//创建一个图形数字细胞
private RectTransform CrearImageNumCell(RectTransform parent, string name, Sprite sprite)
{
GameObject go = new GameObject();
go.name = name;
Image img = go.AddComponent<Image>();
img.raycastTarget = false;
img.color = m_color;
go.transform.SetParent(parent);
RectTransform rtf = go.GetComponent<RectTransform>();
SetCellPivot(rtf, m_alignment);
img.sprite = sprite;
if (sprite != null)
img.SetNativeSize();
else
rtf.sizeDelta = new Vector2(20, 30);
//rtf.anchorMin = Vector3.zero;
//rtf.anchorMax = Vector3.zero;
rtf.localScale = Vector3.one;
rtf.localRotation = new Quaternion();
return rtf;
}
//设置每个数字细胞的垂直对齐方式
private void SetCellPivot(RectTransform rtf, TextAnchor alignmen)
{
if (alignmen.ToString().IndexOf("Lower") != -1)//垂直方向低对齐
rtf.pivot = new Vector2(0, 0);
else if (alignmen.ToString().IndexOf("Middle") != -1)//垂直方向中对齐
rtf.pivot = new Vector2(0, 0.5f);
else//垂直方向上对齐
rtf.pivot = new Vector2(0, 1);
}
//刷新所有image的锚点
private void UpdateCellsPivot()
{
if (m_cellHome == null)
m_cellHome = GetCellHome();
for (int i = 0; i < m_cellHome.childCount; i++)
{
RectTransform rtf = m_cellHome.GetChild(i).GetComponent<RectTransform>();
SetCellPivot(rtf, m_alignment);
}
if (label != null)
SetCellPivot(label, m_alignment);
}
private void UpdateCellsColor()
{
if (m_cellHome == null)
m_cellHome = GetCellHome();
for (int i = 0; i < m_cellHome.childCount; i++)
{
m_cellHome.GetChild(i).GetComponent<Image>().color = m_color;
}
if (label != null)
label.GetComponent<Image>().color = m_color;
}
//刷新图片位置
private void UpdateCellsPos()
{
if (m_cellHome == null)
m_cellHome = GetCellHome();
float cellHomeWidth = 0;
for (int i = 0; i < m_cellHome.childCount; i++)
{
if (m_cellHome.GetChild(i).gameObject.activeSelf == false)
break;
RectTransform rtf = m_cellHome.GetChild(i).GetComponent<RectTransform>();
if (i == 0)
rtf.anchoredPosition = Vector2.zero;
else
rtf.anchoredPosition = new Vector2(cellHomeWidth + m_spacing, 0);
if (m_spacing == 0)
cellHomeWidth += rtf.sizeDelta.x;
else
cellHomeWidth += m_spacing + rtf.sizeDelta.x;
}
RectTransform frontTrf = null;//前面的
RectTransform endTrf = null;//后面的
if (label != null)
{
cellHomeWidth += label.sizeDelta.x + labelSpacing;
if (m_lablePos == LabelPos.Front)
{
frontTrf = label;
endTrf = m_cellHome.GetComponent<RectTransform>();
}
else
{
frontTrf = m_cellHome.GetComponent<RectTransform>();
endTrf = label;
}
}
else
{
frontTrf = m_cellHome.GetComponent<RectTransform>();
}
if (m_alignment.ToString().IndexOf("Left") != -1)
{//水平左对齐
frontTrf.anchoredPosition = new Vector2(0, 0);
}
else if (m_alignment.ToString().IndexOf("Center") != -1)
{//水平居中
frontTrf.anchoredPosition = new Vector2(-cellHomeWidth / 2, 0);
}
else
{//水平右对齐
frontTrf.anchoredPosition = new Vector2(-cellHomeWidth, 0);
}
if (endTrf != null)
{
if (endTrf == label)
endTrf.anchoredPosition = new Vector2(frontTrf.anchoredPosition.x + cellHomeWidth - label.sizeDelta.x, 0);
else
endTrf.anchoredPosition = new Vector2(frontTrf.anchoredPosition.x + frontTrf.sizeDelta.x + labelSpacing, 0);
}
}
//获取数字的HOME
private RectTransform GetCellHome()
{
Transform home = this.transform.Find("CellHome");
if (home != null)
{
return home.GetComponent<RectTransform>();
}
else
{
GameObject go = new GameObject("CellHome");
RectTransform rtf = go.AddComponent<RectTransform>();
rtf.SetParent(this.transform);
rtf.sizeDelta = new Vector2(0, 0);
rtf.localScale = Vector3.one;
rtf.anchoredPosition = Vector2.zero;
rtf.localRotation = new Quaternion();
return rtf;
}
}
}
编辑类:
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
using System.Collections;
[CustomEditor(typeof(ImageNumber))]
public class ImageNumberHelper : Editor
{
private ImageNumber m_imgaeNumber;
void OnEnable()
{
m_imgaeNumber = (ImageNumber)target;
}
private bool foldoutFlag = false;
public override void OnInspectorGUI()
{
int content = EditorGUILayout.IntField("Content", m_imgaeNumber.content);
float spacing = EditorGUILayout.FloatField("Spacing", m_imgaeNumber.spacing);
TextAnchor alignment = (TextAnchor)EditorGUILayout.EnumPopup("Alignment", (TextAnchor)m_imgaeNumber.alignment);
Color color = EditorGUILayout.ColorField("Color", m_imgaeNumber.color);
foldoutFlag = EditorGUILayout.Foldout(foldoutFlag, "SetNumImage ");
if (foldoutFlag)
{
for (int i = 0; i < m_imgaeNumber.m_spList.Length; i++)
{
Sprite lastSp = m_imgaeNumber.m_spList[i];
m_imgaeNumber.m_spList[i] = (Sprite)EditorGUILayout.ObjectField(" " + i, m_imgaeNumber.m_spList[i], typeof(Sprite), false);
}
}
m_imgaeNumber.labelSprite = (Sprite)EditorGUILayout.ObjectField("Label", m_imgaeNumber.labelSprite, typeof(Sprite), false);
if (m_imgaeNumber.labelSprite != null)
{
m_imgaeNumber.labelPos = (ImageNumber.LabelPos)EditorGUILayout.EnumPopup("LabelPos", (ImageNumber.LabelPos)m_imgaeNumber.labelPos);
m_imgaeNumber.labelSpacing = EditorGUILayout.FloatField("LabelSpacing", m_imgaeNumber.labelSpacing);
}
m_imgaeNumber.content = content;
m_imgaeNumber.spacing = spacing;
m_imgaeNumber.color = color;
m_imgaeNumber.alignment = alignment;
EditorUtility.SetDirty(target);
}
}
#endif