using UnityEngine; using System.Collections; using UnityEngine.UI; using System; using System.Collections.Generic; [DisallowMultipleComponent] public class MirrorImage:BaseMeshEffect { [SerializeField] Align m_Align = Align.Right; public Align align { get { return m_Align; } } public override void ModifyMesh(VertexHelper vh) { if(!IsActive() || vh.currentVertCount == 0) { return; } var vertexs = new List(); vh.GetUIVertexStream(vertexs); var min = CalculateMin(vertexs); var max = CalculateMax(vertexs); if(align == Align.Orthogon) { vertexs.AddRange(Copy(Align.Right,min,max,vertexs)); vertexs.AddRange(Copy(Align.Bottom,min,max,vertexs)); } else { vertexs.AddRange(Copy(align,min,max,vertexs)); } vh.Clear(); vh.AddUIVertexTriangleStream(vertexs); } private List Copy(Align _align,Vector2 _min,Vector2 _max,List _originalVertexs) { var copyVertexs = new List(); var reversal = _align == Align.Top || _align == Align.Right; var axis = _align == Align.Left || _align == Align.Right ? 0 : 1; var count = _originalVertexs.Count; for(int i = 0;i < count;i++) { var vertex = _originalVertexs[i]; vertex = _originalVertexs[i]; var position = vertex.position; if(reversal) { position[axis] = _max[axis] - position[axis] + _max[axis]; } else { position[axis] = _min[axis] - position[axis] + _min[axis]; } vertex.position = position; copyVertexs.Add(vertex); } return copyVertexs; } Vector2 CalculateMin(List _vertexs) { var count = _vertexs.Count; var min = _vertexs[0].position; for(int i = 1;i < count;i++) { var vertex = _vertexs[i]; if(vertex.position[0] < min[0]) { min[0] = vertex.position[0]; } else if(vertex.position[1] < min[1]) { min[1] = vertex.position[1]; } } return min; } Vector2 CalculateMax(List _vertexs) { var count = _vertexs.Count; var max = _vertexs[0].position; for(int i = 1;i < count;i++) { var vertex = _vertexs[i]; if(vertex.position[0] > max[0]) { max[0] = vertex.position[0]; } else if(vertex.position[1] > max[1]) { max[1] = vertex.position[1]; } } return max; } public enum Align { Left, Right, Bottom, Top, Orthogon, } }