123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- 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<UIVertex>();
- 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<UIVertex> 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
- }
- }
|