unity3d ugui 文字背景色
阿新 • • 發佈:2019-01-28
如圖。在專案中需要在文字後面顯示一個背景,背景的大小要隨文字的多少變動。
遍尋百度未曾獲得解決辦法,但是從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.pivot為0,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);
}
}
}