using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using UnityEngine.UI; public class UIGradient : BaseMeshEffect { [SerializeField] private DirType _dir = DirType.Vertical; [SerializeField] private BlendType _blend = BlendType.Override; [SerializeField, Range(-1, 1)] private float _offset = 0f; [SerializeField] private Gradient _gradient = new Gradient() { colorKeys = new GradientColorKey[] { new GradientColorKey(Color.black, 0), new GradientColorKey(Color.white, 1) } }; public override void ModifyMesh(VertexHelper vh) { if (!IsActive() || vh.currentVertCount == 0) { return; } var vertexs = new List(); vh.GetUIVertexStream(vertexs); bool isX = true; switch (_dir) { case DirType.Horizontal: isX = true; break; case DirType.Vertical: isX = false; break; default: break; } var inverseLength = GetInverseLength(vertexs, isX, out float min, out float max); var vertex = new UIVertex(); for (int i = 0; i < vh.currentVertCount; i++) { vh.PopulateUIVertex(ref vertex, i); vertex.color = BlendColor(vertex.color, _gradient.Evaluate((isX ? (vertex.position.x - min) : (vertex.position.y - min)) * inverseLength - _offset), _blend); vh.SetUIVertex(vertex, i); } } // 若isX是false,则认为是y private float GetInverseLength(List vertexs, bool isX, out float min, out float max) { float inverseLength = 0; min = isX ? vertexs[0].position.x : vertexs[0].position.y; max = min; for (int i = 1; i < vertexs.Count; i++) { var temp = isX ? vertexs[i].position.x : vertexs[i].position.y; if (temp > max) { max = temp; } else if (temp < min) { min = temp; } } inverseLength = 1 / (max - min); return inverseLength; } private Color BlendColor(Color originalColor, Color newColor, BlendType blendType) { var ret = newColor; switch (blendType) { case BlendType.Override: ret = newColor; break; case BlendType.Add: ret = originalColor + newColor; break; case BlendType.Multiply: ret = originalColor * newColor; break; default: break; } return ret; } private enum DirType { None, Horizontal, Vertical, } private enum BlendType { None, Override, Add, Multiply } }