namespace UIWidgets { using System; using System.Collections.Generic; using UnityEngine; /// /// Snap grid. /// public class SnapGrid : SnapGridBase { /// /// Margin. /// [SerializeField] protected Vector2 padding = new Vector2(0f, 0f); /// /// Padding. /// Distance from border to the first line. /// public Vector2 Padding { get { return padding; } set { if (padding != value) { padding = value; UpdateLines(); } } } /// /// Grid step. /// [SerializeField] protected Vector2 step = new Vector2(10f, 10f); /// /// Grid step. /// public Vector2 Step { get { return step; } set { if (step != value) { step = value; UpdateLines(); } } } /// /// Spacing. /// [SerializeField] protected Vector2 spacing = Vector2.zero; /// /// Spacing. /// public Vector2 Spacing { get { return spacing; } set { if (spacing != value) { spacing = value; UpdateLines(); } } } /// /// Snap to spacing. /// [SerializeField] protected bool snapToSpacing = false; /// /// Snap to spacing. /// public bool SnapToSpacing { get { return snapToSpacing; } set { if (snapToSpacing != value) { snapToSpacing = value; UpdateLines(); } } } /// protected override void UpdateLines() { var size = RectTransform.rect.size; LinesX.Clear(); if (SnapToSpacing || (Spacing.x == 0f)) { CalculateLinesWithSnapSpacing(size.x, Padding.x, Step.x, Spacing.x, LineX.Create, LinesX); } else { CalculateLines(size.x, Padding.x, Step.x, Spacing.x, LineX.Create, LinesX); } LinesY.Clear(); if (SnapToSpacing || (Spacing.y == 0f)) { CalculateLinesWithSnapSpacing(size.y, Padding.y, Step.y, Spacing.y, LineY.Create, LinesY); } else { CalculateLines(size.y, Padding.y, Step.y, Spacing.y, LineY.Create, LinesY); } OnLinesChanged.Invoke(); } /// /// Calculate lines. /// /// Line type. /// Size. /// Margin. /// Step. /// Spacing. /// Line constructor. /// Result list. protected virtual void CalculateLines(float size, float margin, float step, float spacing, Func constructor, List output) { if (step <= 0f) { return; } var value = 0f; size -= margin; if (margin > 0f) { value += margin; if (value < size) { output.Add(constructor(value, true, false)); } value += step; if (value < size) { output.Add(constructor(value, false, true)); } if (spacing > 0f) { value += spacing; if (value < size) { output.Add(constructor(value, true, false)); } } } do { value += step; if (value >= size) { break; } output.Add(constructor(value, false, true)); if (spacing > 0f) { value += spacing; if (value >= size) { break; } output.Add(constructor(value, true, false)); } } while (true); } /// /// Calculate lines with snap spacing. /// /// Line type. /// Size. /// Margin. /// Step. /// Spacing. /// Line constructor. /// Result list. protected virtual void CalculateLinesWithSnapSpacing(float size, float margin, float step, float spacing, Func constructor, List output) { if (step <= 0f) { return; } var value = 0f; size -= margin; if (margin > 0f) { value += margin; if (value < size) { output.Add(constructor(value, true, true)); } } do { value += step; if (value >= size) { break; } output.Add(constructor(value, true, true)); if (spacing > 0) { value += spacing; if (value >= size) { break; } output.Add(constructor(value, true, true)); } } while (true); } } }