From 2d06fad6716799789643c050ef915f092965f8f3 Mon Sep 17 00:00:00 2001 From: uc-hoba Date: Mon, 17 Feb 2025 12:28:48 +0800 Subject: [PATCH] chore: update DroppingPaint --- Assets/Scripts/DroppingPaint.cs | 53 +++++++++++++++++++++++++++++++-- Assets/Test-DroppingPaint.unity | 1 + 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/Assets/Scripts/DroppingPaint.cs b/Assets/Scripts/DroppingPaint.cs index f03bbb8..2ac8f4a 100644 --- a/Assets/Scripts/DroppingPaint.cs +++ b/Assets/Scripts/DroppingPaint.cs @@ -11,8 +11,9 @@ namespace UltraCombos public class DroppingPaint : MonoBehaviour { [SerializeField] private float size = 1; - [SerializeField] private int segments = 16; + [SerializeField, Min(8)] private int segments = 16; [SerializeField] private float smooth = 3f; + [SerializeField] private Vector2 distanceMinMax = new Vector2(1, 2); [SerializeField] private bool isDrop = false; [SerializeField] private bool isClear = false; @@ -59,12 +60,48 @@ namespace UltraCombos }).ToList(); var center = new Vector2(px, py); + var minDist = size / segments * distanceMinMax.x; + var maxDist = size / segments * distanceMinMax.y; + var index = 0; foreach (var points in paints) { + var pre = points.Select(p => ApplyPaintDrop(p, center, r)).ToArray(); + var incs = pre.Select((p, i) => + { + var dist = (p - pre[(i + 1) % pre.Length]).magnitude; + return dist < minDist ? 0 : Mathf.CeilToInt(dist / minDist); + }).ToArray(); + + var newPoints = new List(); + for (int i = 0; i < points.Count; i++) + { + var inc = incs[i]; + if (inc == 0) + { + newPoints.Add(points[i]); + } + else + { + var p1 = points[i]; + var p2 = points[(i + 1) % points.Count]; + for (int k = 0; k < inc; k++) + { + var p = Vector2.Lerp(p1, p2, (float)k / inc); + newPoints.Add(p); + } + } + } + points.Clear(); + points.AddRange(newPoints); + smoothedPaints[index].Clear(); + smoothedPaints[index].AddRange(newPoints); + for (int i = 0; i < points.Count; i++) { points[i] = ApplyPaintDrop(points[i], center, r); } + + index++; } paints.Add(circle); @@ -88,6 +125,8 @@ namespace UltraCombos var dh = 1f / smoothedPaints.Count; var h = 0f; + var minDist = size / segments * distanceMinMax.x; + var maxDist = size / segments * distanceMinMax.y; foreach (var points in smoothedPaints) { using var col = new Handles.DrawingScope(Color.HSVToRGB(h, 0.7f, 0.8f)); @@ -97,7 +136,17 @@ namespace UltraCombos } //Handles.DrawPolyLine(points.Select(p => new Vector3(p.x, p.y, 0)).ToArray()); - Handles.DrawAAConvexPolygon(points.Select(p => new Vector3(p.x, p.y, 0)).ToArray()); + //Handles.DrawAAConvexPolygon(points.Select(p => new Vector3(p.x, p.y, 0)).ToArray()); + for (int i = 0; i < points.Count; ++i) + { + var p1 = points[i]; + var p2 = points[(i + 1) % points.Count]; + var dist = (p1 - p2).magnitude; + var t = Mathf.Clamp01((dist - minDist) / (maxDist - minDist)); + var c = Color.Lerp(Color.cyan, Color.magenta, t); + using var lc = new Handles.DrawingScope(c); + Handles.DrawLine(p1, p2); + } h += dh; } diff --git a/Assets/Test-DroppingPaint.unity b/Assets/Test-DroppingPaint.unity index 62d35d8..150f488 100644 --- a/Assets/Test-DroppingPaint.unity +++ b/Assets/Test-DroppingPaint.unity @@ -1108,6 +1108,7 @@ MonoBehaviour: size: 4 segments: 32 smooth: 2 + distanceMinMax: {x: 1.5, y: 3.5} isDrop: 0 isClear: 0 --- !u!4 &1796365289