1. 程式人生 > >unity3d ugui 文字背景色

unity3d ugui 文字背景色

如圖。在專案中需要在文字後面顯示一個背景,背景的大小要隨文字的多少變動。
ugui 文字地板色

遍尋百度未曾獲得解決辦法,但是從momo的 UGUI研究院之Text文字漸變(十一)發現了繼承BaseMeshEffect可以獲取字元的網格資訊於是使用瞭如下解決辦法。
具體思想:獲取網格座標,正確計算出需要使用的座標然後,然後改變背景框的大小
我使用版本是5.3.x所以獲取網格資訊的介面和之前的版本不一樣。

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;

public class TextBkg : BaseMeshEffect
{

    public GameObject backImage;//層級不重要,在改變大小的時候重新指定了父節點
private Rect rect; protected override void Start() { } public override void ModifyMesh(VertexHelper vh) { if (!IsActive()) { return; } float topX = 1000000; float topY = 1000000; float bottomX = -1000000; float bottomY = -1000000; var stream = new List<UIVertex>();
vh.GetUIVertexStream(stream); foreach (var item in stream) { var pos = item.position; if (topX > pos.x) { topX = pos.x; } if (topY > pos.y) { topY = pos.y; } if (bottomX < pos.x
) { bottomX = pos.x; } if (bottomY < pos.y) { bottomY = pos.y; } } rect = new Rect(topX, topY, bottomX - topX, bottomY - topY); var rt = GetComponent<RectTransform>(); //計算相對於左下角的位置 如果能夠保證rt.pivot0,0則可以不用此步 rect.x += rt.pivot.x * rt.rect.size.x; rect.y += rt.pivot.y * rt.rect.size.y; //計算相對於父節點的位置 var parentSize = transform.parent.gameObject.GetComponent<RectTransform>().rect.size; rect.x += rt.offsetMin.x + rt.anchorMin.x * parentSize.x; rect.y += rt.offsetMin.y + rt.anchorMin.y * parentSize.y; } void OnGUI() { var backImageRect = backImage.GetComponent<RectTransform>(); backImageRect.SetParent(transform.parent); backImageRect.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, rect.x, rect.width); backImageRect.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, rect.y, rect.height); backImage.SetActive(true); } }

另外附上5.3中文字漸變的實現方法:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using System;

[AddComponentMenu("UI/Effects/Gradient")]
public class Gradient : BaseMeshEffect
{
    [SerializeField]
    private Color32
        topColor = Color.white;
    [SerializeField]
    private Color32
        bottomColor = Color.black;

    //如果需要對單個字元進行漸變處理,只需在在for迴圈中對單個字的四個頂點進行顏色指定即可
    public override void ModifyMesh(VertexHelper vh)
    {
        if (!IsActive())
        {
            return;
        }

        List<UIVertex> stream = new List<UIVertex>();
        vh.GetUIVertexStream(stream);

        float bottomY = 100000;
        float topY = -100000;
        foreach (var item in stream)
        {
            float y = item.position.y;
            if (y > topY)
            {
                topY = y;
            }
            else if (y < bottomY)
            {
                bottomY = y;
            }
        }

        var auiv = new UIVertex();
        float uiElementHeight = topY - bottomY;
        for (int i = 0; i < vh.currentVertCount; i++)
        {
            vh.PopulateUIVertex(ref auiv, i);
            auiv.color = Color32.Lerp(bottomColor, topColor, (auiv.position.y - bottomY) / uiElementHeight);
            vh.SetUIVertex(auiv, i);
        }
    }
}