一、效果展示

二、挂载脚本

三、脚本代码

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;/*Text顶点索引顺序5-0 ---- 1| \    ||  \   ||   \  ||    \ |4-----3-2
*/
/// <summary>
/// 渐变
/// </summary>
[DisallowMultipleComponent]
[AddComponentMenu("LFramework/UI/Effects/GradientText", 1)]
public class GradientText : BaseMeshEffect
{protected GradientText(){}/// <summary>/// 渐变方向/// </summary>public enum EGradientDir{TopToBottom,BottomToTop,LeftToRight,RightToLeft,}/// <summary>/// 渐变方向/// </summary>[SerializeField]EGradientDir m_GradientDir = EGradientDir.TopToBottom;public EGradientDir GradientDir{get{return m_GradientDir;}set{m_GradientDir = value;graphic.SetVerticesDirty();}}//颜色数组[SerializeField]Color32[] m_ColorArray = new Color32[2] { Color.black, Color.white };public Color32[] ColorArray{get{return m_ColorArray;}set{m_ColorArray = value;graphic.SetVerticesDirty();}}//顶点缓存List<UIVertex> m_VertexCache = new List<UIVertex>();//绘制使用的顶点列表List<UIVertex> m_VertexList = new List<UIVertex>();public override void ModifyMesh(VertexHelper vh){if (!IsActive()){return;}vh.GetUIVertexStream(m_VertexCache);switch (m_GradientDir){case EGradientDir.TopToBottom:ApplyGradient_TopToBottom(m_VertexCache);break;case EGradientDir.BottomToTop:ApplyGradient_BottomToTop(m_VertexCache);break;case EGradientDir.LeftToRight:ApplyGradient_LeftToRight(m_VertexCache);break;case EGradientDir.RightToLeft:ApplyGradient_RightToLeft(m_VertexCache);break;default:break;}vh.Clear();vh.AddUIVertexTriangleStream(m_VertexList);m_VertexCache.Clear();m_VertexList.Clear();}void ApplyGradient_TopToBottom(List<UIVertex> vertexCache){if (vertexCache.Count == 0){return;}if (m_ColorArray.Length < 2){return;}int vertexCountPer = 6;//每一个文字的顶点数int vertexCount = vertexCache.Count;int colorCount = m_ColorArray.Length;for (int n = 0; n < vertexCount / 6; n++){UIVertex lastVertexLB = new UIVertex();UIVertex lastVertexRB = new UIVertex();for (int i = 0; i < colorCount - 1; i++){UIVertex vertexRT;UIVertex vertexLT;UIVertex vertexRB;UIVertex vertexLB;//左上角和右上角if (i == 0){vertexLT = CalcVertex(vertexCache[n * vertexCountPer + 0], m_ColorArray[i]);vertexRT = CalcVertex(vertexCache[n * vertexCountPer + 1], m_ColorArray[i]);}else{vertexLT = lastVertexLB;vertexRT = lastVertexRB;}//左下角和右下角if (i == colorCount - 2){vertexLB = CalcVertex(vertexCache[n * vertexCountPer + 4], m_ColorArray[i + 1]);vertexRB = CalcVertex(vertexCache[n * vertexCountPer + 2], m_ColorArray[i + 1]);}else{vertexLB = CalcVertex(vertexCache[n * vertexCountPer + 4], vertexCache[n * vertexCountPer + 0],(colorCount - i - 2) * 1f / (colorCount - 1), m_ColorArray[i + 1]);vertexRB = CalcVertex(vertexCache[n * vertexCountPer + 2], vertexCache[n * vertexCountPer + 1],(colorCount - i - 2) * 1f / (colorCount - 1), m_ColorArray[i + 1]);}lastVertexLB = vertexLB;lastVertexRB = vertexRB;m_VertexList.Add(vertexLT);m_VertexList.Add(vertexRT);m_VertexList.Add(vertexRB);m_VertexList.Add(vertexRB);m_VertexList.Add(vertexLB);m_VertexList.Add(vertexLT);}}}void ApplyGradient_BottomToTop(List<UIVertex> vertexCache){if (vertexCache.Count == 0){return;}if (m_ColorArray.Length < 2){return;}int vertexCountPer = 6;//每一个文字的顶点数int vertexCount = vertexCache.Count;int colorCount = m_ColorArray.Length;for (int n = 0; n < vertexCount / 6; n++){UIVertex lastVertexLT = new UIVertex();UIVertex lastVertexRT = new UIVertex();for (int i = 0; i < colorCount - 1; i++){UIVertex vertexRT;UIVertex vertexLT;UIVertex vertexRB;UIVertex vertexLB;//左下角和右下角if (i == 0){vertexLB = CalcVertex(vertexCache[n * vertexCountPer + 4], m_ColorArray[i]);vertexRB = CalcVertex(vertexCache[n * vertexCountPer + 2], m_ColorArray[i]);}else{vertexLB = lastVertexLT;vertexRB = lastVertexRT;}//左上角和右上角if (i == colorCount - 2){vertexLT = CalcVertex(vertexCache[n * vertexCountPer + 0], m_ColorArray[i + 1]);vertexRT = CalcVertex(vertexCache[n * vertexCountPer + 1], m_ColorArray[i + 1]);}else{vertexLT = CalcVertex(vertexCache[n * vertexCountPer + 0], vertexCache[n * vertexCountPer + 4],(colorCount - i - 2) * 1f / (colorCount - 1), m_ColorArray[i + 1]);vertexRT = CalcVertex(vertexCache[n * vertexCountPer + 1], vertexCache[n * vertexCountPer + 2],(colorCount - i - 2) * 1f / (colorCount - 1), m_ColorArray[i + 1]);}lastVertexLT = vertexLT;lastVertexRT = vertexRT;m_VertexList.Add(vertexLT);m_VertexList.Add(vertexRT);m_VertexList.Add(vertexRB);m_VertexList.Add(vertexRB);m_VertexList.Add(vertexLB);m_VertexList.Add(vertexLT);}}}void ApplyGradient_LeftToRight(List<UIVertex> vertexCache){if (vertexCache.Count == 0){return;}if (m_ColorArray.Length < 2){return;}int vertexCountPer = 6;//每一个文字的顶点数int vertexCount = vertexCache.Count;int colorCount = m_ColorArray.Length;for (int n = 0; n < vertexCount / 6; n++){UIVertex lastVertexRT = new UIVertex();UIVertex lastVertexRB = new UIVertex();for (int i = 0; i < colorCount - 1; i++){UIVertex vertexRT;UIVertex vertexLT;UIVertex vertexRB;UIVertex vertexLB;//左上角和左下角if (i == 0){vertexLT = CalcVertex(vertexCache[n * vertexCountPer + 0], m_ColorArray[i]);vertexLB = CalcVertex(vertexCache[n * vertexCountPer + 4], m_ColorArray[i]);}else{vertexLT = lastVertexRT;vertexLB = lastVertexRB;}//右上角和右下角if (i == colorCount - 2){vertexRT = CalcVertex(vertexCache[n * vertexCountPer + 1], m_ColorArray[i + 1]);vertexRB = CalcVertex(vertexCache[n * vertexCountPer + 2], m_ColorArray[i + 1]);}else{vertexRT = CalcVertex(vertexCache[n * vertexCountPer + 1], vertexCache[n * vertexCountPer + 0],(colorCount - i - 2) * 1f / (colorCount - 1), m_ColorArray[i + 1]);vertexRB = CalcVertex(vertexCache[n * vertexCountPer + 2], vertexCache[n * vertexCountPer + 4],(colorCount - i - 2) * 1f / (colorCount - 1), m_ColorArray[i + 1]);}lastVertexRT = vertexRT;lastVertexRB = vertexRB;m_VertexList.Add(vertexLT);m_VertexList.Add(vertexRT);m_VertexList.Add(vertexRB);m_VertexList.Add(vertexRB);m_VertexList.Add(vertexLB);m_VertexList.Add(vertexLT);}}}void ApplyGradient_RightToLeft(List<UIVertex> vertexCache){if (vertexCache.Count == 0){return;}if (m_ColorArray.Length < 2){return;}int vertexCountPer = 6;//每一个文字的顶点数int vertexCount = vertexCache.Count;int colorCount = m_ColorArray.Length;for (int n = 0; n < vertexCount / 6; n++){UIVertex lastVertexLT = new UIVertex();UIVertex lastVertexLB = new UIVertex();for (int i = 0; i < colorCount - 1; i++){UIVertex vertexRT;UIVertex vertexLT;UIVertex vertexRB;UIVertex vertexLB;//右上角和右下角if (i == 0){vertexRT = CalcVertex(vertexCache[n * vertexCountPer + 1], m_ColorArray[i]);vertexRB = CalcVertex(vertexCache[n * vertexCountPer + 2], m_ColorArray[i]);}else{vertexRT = lastVertexLT;vertexRB = lastVertexLB;}//左上角和左下角if (i == colorCount - 2){vertexLT = CalcVertex(vertexCache[n * vertexCountPer + 0], m_ColorArray[i + 1]);vertexLB = CalcVertex(vertexCache[n * vertexCountPer + 4], m_ColorArray[i + 1]);}else{vertexLT = CalcVertex(vertexCache[n * vertexCountPer + 0], vertexCache[n * vertexCountPer + 1],(colorCount - i - 2) * 1f / (colorCount - 1), m_ColorArray[i + 1]);vertexLB = CalcVertex(vertexCache[n * vertexCountPer + 4], vertexCache[n * vertexCountPer + 2],(colorCount - i - 2) * 1f / (colorCount - 1), m_ColorArray[i + 1]);}lastVertexLT = vertexLT;lastVertexLB = vertexLB;m_VertexList.Add(vertexLT);m_VertexList.Add(vertexRT);m_VertexList.Add(vertexRB);m_VertexList.Add(vertexRB);m_VertexList.Add(vertexLB);m_VertexList.Add(vertexLT);}}}/// <summary>/// 计算顶点数据(只计算颜色)/// </summary>UIVertex CalcVertex(UIVertex vertex, Color32 color){vertex.color = color;return vertex;}/// <summary>/// 计算顶点数据/// </summary>UIVertex CalcVertex(UIVertex vertexA, UIVertex vertexB, float ratio, Color32 color){UIVertex vertexTemp = new UIVertex();vertexTemp.position = (vertexB.position - vertexA.position) * ratio + vertexA.position;vertexTemp.color = color;vertexTemp.normal = (vertexB.normal - vertexA.normal) * ratio + vertexA.normal;vertexTemp.tangent = (vertexB.tangent - vertexA.tangent) * ratio + vertexA.tangent;vertexTemp.uv0 = (vertexB.uv0 - vertexA.uv0) * ratio + vertexA.uv0;vertexTemp.uv1 = (vertexB.uv1 - vertexA.uv1) * ratio + vertexA.uv1;return vertexTemp;}
}

四、推荐参考

51CTO博客:Unity中实现UI渐变_mb60e5417d375b8的技术博客_51CTO博客

UGUI文本颜色渐变相关推荐

  1. 在html中怎么写背景色渐变,CSS 实现背景色渐变和文字颜色渐变(示例代码)

    1. 背景色渐变 A . linear-gradient:用线性渐变创建图像. 语法: = linear-gradient([ [  | to  ] ,]? [, ]+) 下述值用来表示渐变的方向,可 ...

  2. CSS 文字,边框实现从左至右颜色渐变

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 1.文本从左至右颜色渐变 效果图: 2.边框从左至右颜色渐变 效果图: 实现代码: 1.文本从左至右颜色渐变实 ...

  3. android 监听webView滑动距离和标题栏颜色渐变

    重写webView之 X5WebView import android.annotation.SuppressLint; import android.content.Context; import ...

  4. 设计师妹子问:字体颜色渐变,你能实现?

    早上设计师妹子把设计稿交付过来,乍一看,上面的文字颜色渐变的,而且文字内容是动态的,也就是我们无法用图片来代替. 作为一个有责任担当的汉子,坚决不能说不行. 想起了CSS3 擅长做颜色渐变.所以赶紧查 ...

  5. css动态阴影,css实现动态阴影、蚀刻文本、渐变文本效果

    css实现动态阴影 创建与类似的阴影box-shadow 而是基于元素本身的颜色. 代码实现: .dynamic-shadow-parent { position: relative; z-index ...

  6. 如何用echarts实现颜色渐变半圆形仪表盘

    1.代码: <!DOCTYPE html> <html lang="en"> <head><meta charset="utf- ...

  7. css过滤镜实现颜色渐变

    语法: filter : progid:DXImageTransform.Microsoft.Gradient ( enabled=bEnabled , startColorStr=iWidth , ...

  8. 颜色渐变从上往下渐变_好的Golly,网络上的渐变

    颜色渐变从上往下渐变 梯度正在悄悄卷土重来. 有一阵子他们属于迈阿密虎钳和​​龙舌兰日出世界,然后他们增加了1980年代的杂志的深度,然后出现了Geocities –好吧,让我们不谈过去. 如今,网络 ...

  9. css怎么设置字体颜色渐变

    css设置字体颜色渐变的方法:1.使用"background-cli"和"text-fill-color"实现字体颜色渐变:2.使用"mask-ima ...

最新文章

  1. jsp 环境配置记录
  2. 从头到尾使用Geth的说明-3-geth参数说明和环境配置
  3. Clojure世界:单元测试
  4. android 自定义扫地机器人地图,扫地机如何正确操作进行APP建图?
  5. CTFshow php特性 web110
  6. TF之LoR:基于tensorflow利用逻辑回归算LoR法实现手写数字图片识别提高准确率
  7. uva 10047 the monocyle (四维bfs)
  8. python-标识符与变量-标识符的命名规范
  9. 取得GridPanel选定行所有字段值
  10. 操作系统linux配置php,操作系统--Linux的详细介绍
  11. 第四节:EasyUI的一些操作
  12. mysql运算中max计算_MySQL 聚合函数、运算符操作、约束
  13. 用 Java 爬小姐姐图片,直接拿来用!这个厉害了。。。
  14. SpringBoot 集成ElasticSearch(二)分页查询
  15. mysql like 全文索引_mysql like%query是慢全文索引
  16. SharpGL学习笔记(十二) 光源例子:解决光源场景中的常见问题
  17. python画名侦探柯南_基于flask的可视化动漫分析网站【python入门必学】
  18. 虚拟机VM安装win7遇到的问题及解决方法
  19. MongoDB 在Linux下 数据时间问题 .Net Core
  20. 【读书笔记】关键影响力:如何调动团队力量

热门文章

  1. 电脑如何查看如何无限WiFi密码?
  2. Qt 主窗口不能最大化
  3. 微信小程序支付(1)Uni-app平台API接口
  4. html适应不同的分辨率,css如何适应不同分辨率?
  5. html的fa图标代码,font awesome
  6. CAD软件中沿墙镜像功能的使用技巧
  7. NYOJ-1273-宣传墙
  8. 中国大学MOOC-陈越、何钦铭-数据结构-2020春期末考试【个人完整题解记录-判断选择部分】
  9. 深度学习教程(6) | 神经网络优化算法(吴恩达·完整版)
  10. Java实现微信小程序校验图片是否含有违法违规内容