private void Awake() { mf = GetComponent <MeshFilter>(); snaps = new List <PrioritySnap>(); callbackDic = new Dictionary <PrioritySnap, Action>(); prevSnap = null; }
/// <summary> /// スナップの追加 /// </summary> public void AddSnap(int priority, BaseSnap snap, Action callback = null) { PrioritySnap pSnap = new PrioritySnap(priority, snap); snaps.Add(pSnap); if (callback != null) { callbackDic.Add(pSnap, callback); } }
/// <summary> /// 補助線への座標のスナップ /// </summary> public bool Snap(Vector2 point, out Vector2 result) { PrioritySnap snap = Snap(snaps, point, out result); if (snap != null) { return(true); } else { return(false); } }
/// <summary> /// 座標のスナップ。スナップした要素を返す /// </summary> private PrioritySnap Snap(List <PrioritySnap> snaps, Vector2 point, out Vector2 result) { result = Vector2.zero; if (snaps.Count == 0) { return(null); } float minDistance = float.MaxValue; Vector2 sample; PrioritySnap snap = null; bool snaped = false; for (int i = 0; i < snaps.Count; ++i) { PrioritySnap e = snaps[i]; if (e.snap.Snap(point, out sample)) { if (snap == null) { result = sample; snap = e; minDistance = (sample - point).magnitude; snaped = true; } else if (e.priority > snap.priority) { result = sample; snap = e; minDistance = (sample - point).magnitude; snaped = true; } else if (snap.priority == e.priority) { //距離を測る float distance = (sample - point).magnitude; if (minDistance > distance) { result = sample; snap = e; minDistance = distance; snaped = true; } } } } return(snap); }
/// <summary> /// スナップの追加 /// </summary> public void AddSnap(int priority, BaseSnap snap, Action callback = null) { PrioritySnap pSnap = new PrioritySnap(priority, snap); snaps.Add(pSnap); addSnaps.Add(pSnap); if (callback != null) { addSnapCallbackDic.Add(pSnap, callback); } //表示 if (show) { Show(); } }