using System.Collections; using System.Collections.Generic; using UnityEngine; namespace YKMoon { /// /// 左下开始逆时针的顺序 /// public enum Corner4Pos { LowerLeft = 0, UpperLeft = 1, UpperRight = 2, LowerRight = 3, } [System.Serializable] public struct Corner4 { // ============= Fields ==============// public Vector2 upperLeft; public Vector2 upperRight; public Vector2 lowerLeft; public Vector2 lowerRight; // ============ Static Properties =========== // public static Corner4 Default { get { return new Corner4(new Vector2(-0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(-0.5f, -0.5f), new Vector2(0.5f, -0.5f)); } } public static Vector2 DefaultValue(Corner4Pos pos) { switch(pos) { case Corner4Pos.UpperLeft: return new Vector2(-0.5f, 0.5f); case Corner4Pos.UpperRight: return new Vector2(0.5f, 0.5f); case Corner4Pos.LowerLeft: return new Vector2(-0.5f, -0.5f); case Corner4Pos.LowerRight: return new Vector2(0.5f, -0.5f); default: throw new System.IndexOutOfRangeException("Invalid Corner4 index!"); } } //========= Indexer============// public Vector2 this[int index] { get => this[(Corner4Pos)index]; set => this[(Corner4Pos)index] = value; } public Vector2 this[Corner4Pos pos] { get { switch(pos) { case Corner4Pos.UpperLeft: return upperLeft; case Corner4Pos.UpperRight: return upperRight; case Corner4Pos.LowerLeft: return lowerLeft; case Corner4Pos.LowerRight: return lowerRight; default: throw new System.IndexOutOfRangeException("Invalid Corner4 index!"); } } set { switch(pos) { case Corner4Pos.UpperLeft: upperLeft = value; break; case Corner4Pos.UpperRight: upperRight = value; break; case Corner4Pos.LowerLeft: lowerLeft = value; break; case Corner4Pos.LowerRight: lowerRight = value; break; default: throw new System.IndexOutOfRangeException("Invalid Corner4 index!"); } } } public Corner4(Vector2 upperLeft, Vector2 upperRight, Vector2 lowerLeft, Vector2 lowerRight) { this.upperLeft = upperLeft; this.upperRight = upperRight; this.lowerLeft = lowerLeft; this.lowerRight = lowerRight; } public void Set(Vector2 upperLeft, Vector2 upperRight, Vector2 lowerLeft, Vector2 lowerRight) { this.upperLeft = upperLeft; this.upperRight = upperRight; this.lowerLeft = lowerLeft; this.lowerRight = lowerRight; } public void ResetToDefault() { for(int i = 0; i < 4; i++) { this[i] = DefaultValue((Corner4Pos)i); } } public void ResetToDefault(Corner4Pos pos) { this[(int)pos] = DefaultValue(pos); } //====== Operators========// public override string ToString() { return string.Format("ul:{0}, ur:{1}, ll:{2}, lr:{3}", upperLeft, upperRight, lowerLeft, lowerRight); } public static Corner4 operator *(Corner4 a, float d) { return new Corner4(a.upperLeft * d, a.upperRight * d, a.lowerLeft * d, a.lowerRight * d); } public static Corner4 operator /(Corner4 a, float d) { return new Corner4(a.upperLeft / d, a.upperRight / d, a.lowerLeft / d, a.lowerRight / d); } public static Corner4 operator +(Corner4 a, Corner4 b) { return new Corner4(a.upperLeft + b.upperLeft, a.upperRight + b.upperRight, a.lowerLeft + b.lowerLeft, a.lowerRight + b.lowerRight); } public static Corner4 operator -(Corner4 a, Corner4 b) { return new Corner4(a.upperLeft - b.upperLeft, a.upperRight - b.upperRight, a.lowerLeft - b.lowerLeft, a.lowerRight - b.lowerRight); } } }