使用UGUI实现数字变化,可以在前后加图片

实现类:

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值