首页 >Unity3D频道 >【UGUI研究院】 > UGUI研究院之Text文本渐变(十一)
2015
05-08

UGUI研究院之Text文本渐变(十一)

这是我无意间逛国外论坛发现的,感觉还可以就分享给大家。原文 http://pastebin.com/dJabCfWn

Snip20150508_1

如下图所示,用法和UGUI自带的outline和shadow一样,可以同时使用。

Snip20150508_2

代码在这里了。我加了个判断,它原来的有越界的隐患。

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

[AddComponentMenu("UI/Effects/Gradient")]
public class Gradient : BaseVertexEffect {
	[SerializeField]
	private Color32 topColor = Color.white;
	[SerializeField]
	private Color32 bottomColor = Color.black;
	
	public override void ModifyVertices(List<UIVertex> vertexList) {
		if (!IsActive()) {
			return;
		}

		int count = vertexList.Count;
		if(count>0){
			float bottomY = vertexList[0].position.y;
			float topY = vertexList[0].position.y;
			
			for (int i = 1; i < count; i++) {
				float y = vertexList[i].position.y;
				if (y > topY) {
					topY = y;
				}
				else if (y < bottomY) {
					bottomY = y;
				}
			}
			
			float uiElementHeight = topY - bottomY;
			
			for (int i = 0; i < count; i++) {
				UIVertex uiVertex = vertexList[i];
				uiVertex.color = Color32.Lerp(bottomColor, topColor, (uiVertex.position.y - bottomY) / uiElementHeight);
				vertexList[i] = uiVertex;
			}
		}
	}
}

我也在测试中,欢迎大家提意见。

如果你的项目升级到了5.2 请使用下面的代码,感谢代码的提供者。@獨立遊戲開發熊

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

[AddComponentMenu("UI/Effects/Gradient")]
public class Gradient :  BaseMeshEffect
{
	[SerializeField]
	private Color32
		topColor = Color.white;
	[SerializeField]
	private Color32
		bottomColor = Color.black;
	
	public override void ModifyMesh (Mesh mesh)
	{
		if (!IsActive ()) {
			return;
		}

		Vector3[] vertexList = mesh.vertices;
		int count = mesh.vertexCount;
		if (count > 0) {
			float bottomY = vertexList [0].y;
			float topY = vertexList [0].y;
            
			for (int i = 1; i < count; i++) {
				float y = vertexList [i].y;
				if (y > topY) {
					topY = y;
				} else if (y < bottomY) {
					bottomY = y;
				}
			}
			List<Color32> colors = new List<Color32> ();
			float uiElementHeight = topY - bottomY;
			for (int i = 0; i < count; i++) {
				colors.Add (Color32.Lerp (bottomColor, topColor, (vertexList [i].y - bottomY) / uiElementHeight));
			}
			mesh.SetColors (colors);
		}
	}
}

 

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

UGUI研究院之Text文本渐变(十一)》有 61 条评论

  1. 斯樵说:

    UGUI研究院之Text文本渐变(十一) - 雨松MOMO程序研究院 - 1参考雨松的脚步,写了一个可以自定义任意颜色和位置的 文本变色组件,使用Gradient来自定义也颜色设置。详情查看:http://blog.sqstudio.com/?p=1270

  2. hj说:

    BaseMeshEffect是怎么来的?

  3. 葃兲啲眀兲说:

    5.3.6可以 5.4的还没试using UnityEngine;using System.Collections;using System.Collections.Generic;using UnityEngine.UI;[AddComponentMenu(“UI/Effects/Gradient”)]public class Gradient : BaseMeshEffect{ public Color32 topColor = Color.white; public Color32 bottomColor = Color.black; public override void ModifyMesh(VertexHelper vh) { if (!IsActive()) { return; } var count = vh.currentVertCount; if (count == 0) return; var vertexs = new List(); for (var i = 0; i < count; i ) { var vertex = new UIVertex(); vh.PopulateUIVertex(ref vertex, i); vertexs.Add(vertex); } var topY = vertexs[0].position.y; var bottomY = vertexs[0].position.y; for (var i = 1; i < count; i ) { var y = vertexs UGUI研究院之Text文本渐变(十一) - 雨松MOMO程序研究院 - 1 .position.y; if (y > topY) { topY = y; } else if (y < bottomY) { bottomY = y; } } var height = topY – bottomY; for (var i = 0; i < count; i ) { var vertex = vertexs UGUI研究院之Text文本渐变(十一) - 雨松MOMO程序研究院 - 2 ; var color = Color32.Lerp(bottomColor, topColor, (vertex.position.y – bottomY) / height); vertex.color = color; vh.SetUIVertex(vertex, i); } }}

  4. 葃兲啲眀兲说:

    5.3.6可以 5.4的还没试using UnityEngine;using System.Collections;using System.Collections.Generic;using UnityEngine.UI;[AddComponentMenu(“UI/Effects/Gradient”)]public class Gradient : BaseMeshEffect{ public Color32 topColor = Color.white; public Color32 bottomColor = Color.black; public override void ModifyMesh(VertexHelper vh) { if (!IsActive()) { return; } var count = vh.currentVertCount; if (count == 0) return; var vertexs = new List(); for (var i = 0; i < count; i++) { var vertex = new UIVertex(); vh.PopulateUIVertex(ref vertex, i); vertexs.Add(vertex); } var topY = vertexs[0].position.y; var bottomY = vertexs[0].position.y; for (var i = 1; i < count; i++) { var y = vertexs UGUI研究院之Text文本渐变(十一) - 雨松MOMO程序研究院 - 1 .position.y; if (y > topY) { topY = y; } else if (y < bottomY) { bottomY = y; } } var height = topY – bottomY; for (var i = 0; i < count; i++) { var vertex = vertexs UGUI研究院之Text文本渐变(十一) - 雨松MOMO程序研究院 - 2 ; var color = Color32.Lerp(bottomColor, topColor, (vertex.position.y – bottomY) / height); vertex.color = color; vh.SetUIVertex(vertex, i); } }}

  5. XGODX说:

    error CS0534: `Gradient’ does not implement inherited abstract member `UnityEngine.UI.BaseMeshEffect.ModifyMesh(UnityEngine.UI.VertexHelper)’问一下我是5.3 为啥会出这个报错

  6. LoftShawn说:

    请问博主,ugui 下 bbcode 要怎么搞?

  7. 一线天说:

    松哥,求UGUI插件下载地址

  8. 喔。。雨松大大,再请教一个问题吗,你有没有遇到过使用艺术字的时候,mask遮罩不起作用的情况?

留下一个回复

你的email不会被公开。 必填项已用 * 标注。