using UnityEngine; using System.Collections; using UnityEngine.UI; using System; using System.Collections.Generic; [DisallowMultipleComponent] [AddComponentMenu("UI/Effects/Reflection")] public class Reflection:BaseMeshEffect { [Range(0,30)] [SerializeField] float m_Distance; public float distance { get { return m_Distance; } } [Range(0,1)] [SerializeField] float m_HeightScale = 1f; public float heightScale { get { return m_HeightScale; } } [Range(0,1)] [SerializeField] float m_Virtualness; public float virtualness { get { return m_Virtualness; } } [SerializeField] float m_OffsetX = 0; public float offsetX { get { return m_OffsetX; } } public override void ModifyMesh(VertexHelper vh) { if(!IsActive() || vh.currentVertCount == 0) { return; } var vertexs = new List(); vh.GetUIVertexStream(vertexs); var count = vertexs.Count; var edge = UIUtility.GetEdge(vertexs,1); var height = (edge[1] - edge[0]) * heightScale; if(height == 0) { return; } var mirrorMinY = (edge[0] - edge[1]) * heightScale + edge[0] - distance; var color = this.graphic.color; var top = color.SetA(1 - virtualness); var bottom = color.SetA(0); for(var i = 0;i < count;i++) { var vertex = vertexs[i]; vertexs.Add(vertex); var position = vertex.position; position.y = edge[0] - distance + (edge[0] - position.y) * heightScale; position.x += offsetX * (1 - Mathf.Abs((position.y - mirrorMinY) / height)); vertex.position = position; var colort = Mathf.Abs((position.y - mirrorMinY) / height); vertex.color = Color32.Lerp(bottom,top,colort); vertexs[i + count] = vertex; } vh.Clear(); vh.AddUIVertexTriangleStream(vertexs); } }