using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace TyphoonUI { public class RhombusProgress : Image { [Range(0, 1)] [SerializeField] private float m_Progress = 1.0f; [Range(0, 90f)] [SerializeField] private float m_Angle = 30f; private static List indices = new List() { 0, 1, 2, 2, 3, 0 }; private List _rendererVertex = new List() { default, default, default, default }; public float angle { get { return m_Angle; } set { if (m_Angle == value) { return; } m_Angle = value; SetVerticesDirty(); } } public float progress { get { return m_Progress; } set { if (m_Progress == value) { return; } m_Progress = value; SetVerticesDirty(); } } protected List _vertices = new List(); protected override void OnPopulateMesh(VertexHelper toFill) { base.OnPopulateMesh(toFill); if (overrideSprite == null) { base.OnPopulateMesh(toFill); return; } if (type == Type.Simple) { //读取当前顶点 toFill.GetUIVertexStream(_vertices); var rect = rectTransform.rect; var width = rect.width; var height = rect.height; var offset = Mathf.Tan(Mathf.Deg2Rad * m_Angle) * height; var process = Mathf.InverseLerp(0, width, offset); var v1 = _vertices[0]; var v2 = _vertices[1]; var v3 = _vertices[2]; var v4 = _vertices[4]; var vert1 = v1; var vert2 = SampleVertex(v2, v3, process); var vert3 = v3; var vert4 = SampleVertex(v4, v1, process); var finalVert3 = SampleVertex(vert2, vert3, m_Progress); var finalVert4 = SampleVertex(vert1, vert4, m_Progress); _rendererVertex[0] = vert1; _rendererVertex[1] = vert2; _rendererVertex[2] = finalVert3; _rendererVertex[3] = finalVert4; toFill.Clear(); toFill.AddUIVertexStream(_rendererVertex, indices); } } private UIVertex SampleVertex(UIVertex start, UIVertex end, float process) { return new UIVertex() { position = Vector3.Lerp(start.position, end.position, process), color = Color.Lerp(start.color, end.color, process), uv0 = Vector4.Lerp(start.uv0, end.uv0, process), }; } } }