UGUI字体渐变

UGUI   2022-09-04 15:19   870   0  
using System.Collections.Generic;
 
 
public enum Type
{
    Horizontal,
    Vertical
}
 
 
public enum Blend
{
    Override,
    Add,
    Multiply
}
 
 
namespace UnityEngine.UI
{
    [AddComponentMenu("UI/Effects/UGUI_Gradient")]
    public class Gradient : BaseMeshEffect
    {
        [SerializeField]
        Type _gradientType;
 
 
        [SerializeField]
        Blend _blendMode = Blend.Multiply;
 
 
        [SerializeField]
        [Range(-1, 1)]
        float _offset = 0f;
 
 
        [SerializeField]
        UnityEngine.Gradient _effectGradient = new UnityEngine.Gradient()
        { colorKeys = new GradientColorKey[] { new GradientColorKey(Color.black, 0), new GradientColorKey(Color.white, 1) } };
 
 
        #region Properties
        public Blend BlendMode
        {
            get { return _blendMode; }
            set { _blendMode = value; }
        }
 
 
        public UnityEngine.Gradient EffectGradient
        {
            get { return _effectGradient; }
            set { _effectGradient = value; }
        }
 
 
        public Type GradientType
        {
            get { return _gradientType; }
            set { _gradientType = value; }
        }
 
 
        public float Offset
        {
            get { return _offset; }
            set { _offset = value; }
        }
        #endregion
 
 
        public override void ModifyMesh(VertexHelper helper)
        {
            if (!IsActive() || helper.currentVertCount == 0)
                return;
 
 
            List<UIVertex> _vertexList = new List<UIVertex>();
 
 
            helper.GetUIVertexStream(_vertexList);
 
 
            int nCount = _vertexList.Count;
            switch (GradientType)
            {
                case Type.Horizontal:
                    {
                        float left = _vertexList[0].position.x;
                        float right = _vertexList[0].position.x;
                        float x = 0f;
                        for (int i = nCount - 1; i >= 1; --i)
                        {
                            x = _vertexList[i].position.x;
 
 
                            if (x > right) right = x;
                            else if (x < left) left = x;
                        }
                        float width = 1f / (right - left);
                        UIVertex vertex = new UIVertex();
 
 
                        for (int i = 0; i < helper.currentVertCount; i++)
                        {
                            helper.PopulateUIVertex(ref vertex, i);
 
 
                            vertex.color = BlendColor(vertex.color, EffectGradient.Evaluate((vertex.position.x - left) * width - Offset));
 
 
                            helper.SetUIVertex(vertex, i);
                        }
                    }
                    break;
 
 
                case Type.Vertical:
                    {
                        float bottom = _vertexList[0].position.y;
                        float top = _vertexList[0].position.y;
                        float y = 0f;
                        for (int i = nCount - 1; i >= 1; --i)
                        {
                            y = _vertexList[i].position.y;
 
 
                            if (y > top) top = y;
                            else if (y < bottom) bottom = y;
                        }
                        float height = 1f / (top - bottom);
                        UIVertex vertex = new UIVertex();
 
 
                        for (int i = 0; i < helper.currentVertCount; i++)
                        {
                            helper.PopulateUIVertex(ref vertex, i);
 
 
                            vertex.color = BlendColor(vertex.color, EffectGradient.Evaluate((vertex.position.y - bottom) * height - Offset));
 
 
                            helper.SetUIVertex(vertex, i);
                        }
                    }
                    break;
            }
        }
 
 
        Color BlendColor(Color colorA, Color colorB)
        {
            switch (BlendMode)
            {
                default: return colorB;
                case Blend.Add: return colorA + colorB;
                case Blend.Multiply: return colorA * colorB;
            }
        }
    }
}


博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。
QQ
微信
打赏
扫一扫