com.wallstop-studios.unity-helpers 1.0.0-rc9 → 1.0.1-rc01

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,273 @@
1
+ namespace UnityHelpers.Utils
2
+ {
3
+ using System.Collections.Generic;
4
+ using System.Linq;
5
+ using UnityEngine;
6
+ using Core.Attributes;
7
+
8
+ /// <summary>
9
+ /// Keeps stack-like track of Colors and Materials of SpriteRenderers
10
+ /// </summary>
11
+ [DisallowMultipleComponent]
12
+ public sealed class SpriteRendererMetadata : MonoBehaviour
13
+ {
14
+ private readonly List<(Component component, Color color)> _colorStack = new();
15
+ private readonly List<(Component component, Material material)> _materialStack = new();
16
+
17
+ private readonly List<(Component component, Color color)> _colorStackCache = new();
18
+ private readonly List<(Component component, Material material)> _materialStackCache = new();
19
+
20
+ public Color OriginalColor => _colorStack[0].color;
21
+
22
+ public Color CurrentColor => _colorStack[^1].color;
23
+
24
+ public Material OriginalMaterial => _materialStack[0].material;
25
+
26
+ public Material CurrentMaterial => _materialStack[^1].material;
27
+
28
+ public IEnumerable<Material> Materials => _materialStack.Select(entry => entry.material);
29
+
30
+ public IEnumerable<Color> Colors => _colorStack.Select(entry => entry.color);
31
+
32
+ [SiblingComponent]
33
+ [SerializeField]
34
+ private SpriteRenderer _spriteRenderer;
35
+
36
+ private bool _enabled;
37
+
38
+ public void PushColor(Component component, Color color, bool force = false)
39
+ {
40
+ if (component == this)
41
+ {
42
+ return;
43
+ }
44
+
45
+ if (!force && !enabled)
46
+ {
47
+ return;
48
+ }
49
+
50
+ InternalPushColor(component, color);
51
+ }
52
+
53
+ private void InternalPushColor(Component component, Color color)
54
+ {
55
+ RemoveColor(component);
56
+ _colorStack.Add((component, color));
57
+ _spriteRenderer.color = CurrentColor;
58
+ }
59
+
60
+ public void PushBackColor(Component component, Color color, bool force = false)
61
+ {
62
+ if (component == this)
63
+ {
64
+ return;
65
+ }
66
+
67
+ if (!force && !enabled)
68
+ {
69
+ return;
70
+ }
71
+
72
+ RemoveColor(component);
73
+ _colorStack.Insert(1, (component, color));
74
+ _spriteRenderer.color = CurrentColor;
75
+ }
76
+
77
+ public void PopColor(Component component)
78
+ {
79
+ RemoveColor(component);
80
+ _spriteRenderer.color = CurrentColor;
81
+ }
82
+
83
+ /// <summary>
84
+ /// Inserts a material as "first in the queue".
85
+ /// </summary>
86
+ /// <param name="component">Component that owns the material.</param>
87
+ /// <param name="material">Material to use.</param>
88
+ /// <param name="force">If true, overrides the enable check.</param>
89
+ /// <returns>The instanced material, if possible.</returns>
90
+ public Material PushMaterial(Component component, Material material, bool force = false)
91
+ {
92
+ if (component == this)
93
+ {
94
+ return null;
95
+ }
96
+
97
+ if (!force && !enabled)
98
+ {
99
+ return null;
100
+ }
101
+
102
+ #if UNITY_EDITOR
103
+ if (!Application.isPlaying)
104
+ {
105
+ return null;
106
+ }
107
+ #endif
108
+ return InternalPushMaterial(component, material);
109
+ }
110
+
111
+ private Material InternalPushMaterial(Component component, Material material)
112
+ {
113
+ RemoveMaterial(component);
114
+ _spriteRenderer.material = material;
115
+ Material instanced = _spriteRenderer.material;
116
+ _materialStack.Add((component, instanced));
117
+ return instanced;
118
+ }
119
+
120
+ /// <summary>
121
+ /// Inserts a material as "last in the queue".
122
+ /// </summary>
123
+ /// <param name="component">Component that owns the material.</param>
124
+ /// <param name="material">Material to use.</param>
125
+ /// <param name="force">If true, overrides the enable check.</param>
126
+ /// <returns>The instanced material, if possible.</returns>
127
+ public Material PushBackMaterial(Component component, Material material, bool force = false)
128
+ {
129
+ if (component == this)
130
+ {
131
+ return null;
132
+ }
133
+
134
+ if (!force && !enabled)
135
+ {
136
+ return null;
137
+ }
138
+
139
+ #if UNITY_EDITOR
140
+ if (!Application.isPlaying)
141
+ {
142
+ return null;
143
+ }
144
+ #endif
145
+
146
+ RemoveMaterial(component);
147
+ Material instanced = material;
148
+ if (_materialStack.Count <= 1)
149
+ {
150
+ _spriteRenderer.material = material;
151
+ instanced = _spriteRenderer.material;
152
+ }
153
+
154
+ _materialStack.Insert(1, (component, instanced));
155
+ return instanced;
156
+ }
157
+
158
+ public void PopMaterial(Component component)
159
+ {
160
+ #if UNITY_EDITOR
161
+ if (!Application.isPlaying)
162
+ {
163
+ return;
164
+ }
165
+ #endif
166
+
167
+ RemoveMaterial(component);
168
+ _spriteRenderer.material = CurrentMaterial;
169
+ Material instanced = _spriteRenderer.material;
170
+ Component currentComponent = _materialStack[^1].component;
171
+ _materialStack[^1] = (currentComponent, instanced);
172
+ }
173
+
174
+ private void Awake()
175
+ {
176
+ if (_spriteRenderer == null)
177
+ {
178
+ this.AssignSiblingComponents();
179
+ }
180
+
181
+ InternalPushColor(this, _spriteRenderer.color);
182
+ _colorStackCache.AddRange(_colorStack);
183
+ _ = InternalPushMaterial(this, _spriteRenderer.material);
184
+ _materialStackCache.AddRange(_materialStack);
185
+ }
186
+
187
+ private void OnEnable()
188
+ {
189
+ // Ignore the OnEnable call from when the object is first initialized
190
+ if (!_enabled)
191
+ {
192
+ _enabled = true;
193
+ return;
194
+ }
195
+
196
+ _colorStack.Clear();
197
+ _colorStack.Add(_colorStackCache[0]);
198
+ List<(Component component, Color color)> colorBuffer = Buffers<(Component component, Color color)>.List;
199
+ colorBuffer.Clear();
200
+ colorBuffer.AddRange(_colorStackCache);
201
+ for (int i = 1; i < colorBuffer.Count; ++i)
202
+ {
203
+ (Component component, Color color) entry = colorBuffer[i];
204
+ PushColor(entry.component, entry.color, force: true);
205
+ }
206
+
207
+ _materialStack.Clear();
208
+ _materialStack.Add(_materialStackCache[0]);
209
+ List<(Component component, Material material)> materialBuffer =
210
+ Buffers<(Component component, Material material)>.List;
211
+ materialBuffer.Clear();
212
+ materialBuffer.AddRange(_materialStackCache);
213
+ for (int i = 1; i < materialBuffer.Count; ++i)
214
+ {
215
+ (Component component, Material material) entry = materialBuffer[i];
216
+ PushMaterial(entry.component, entry.material, force: true);
217
+ }
218
+ }
219
+
220
+ private void OnDisable()
221
+ {
222
+ List<(Component component, Color color)> colorBuffer = Buffers<(Component component, Color color)>.List;
223
+ colorBuffer.Clear();
224
+ colorBuffer.AddRange(_colorStack);
225
+ for (int i = colorBuffer.Count - 1; 1 <= i; --i)
226
+ {
227
+ PopColor(colorBuffer[i].component);
228
+ }
229
+
230
+ _colorStackCache.Clear();
231
+ _colorStackCache.AddRange(colorBuffer);
232
+
233
+ List<(Component component, Material material)> materialBuffer =
234
+ Buffers<(Component component, Material material)>.List;
235
+ materialBuffer.Clear();
236
+ materialBuffer.AddRange(_materialStack);
237
+
238
+ for (int i = materialBuffer.Count - 1; 1 <= i; --i)
239
+ {
240
+ PopMaterial(materialBuffer[i].component);
241
+ }
242
+
243
+ _materialStackCache.Clear();
244
+ _materialStackCache.AddRange(materialBuffer);
245
+ }
246
+
247
+ private void RemoveColor(Component component)
248
+ {
249
+ if (component == this)
250
+ {
251
+ return;
252
+ }
253
+
254
+ _ = _colorStack.RemoveAll(
255
+ existingComponent => existingComponent.component == component || existingComponent.component == null);
256
+ _ = _colorStackCache.RemoveAll(
257
+ existingComponent => existingComponent.component == component || existingComponent.component == null);
258
+ }
259
+
260
+ private void RemoveMaterial(Component component)
261
+ {
262
+ if (component == this)
263
+ {
264
+ return;
265
+ }
266
+
267
+ _ = _materialStack.RemoveAll(
268
+ existingComponent => existingComponent.component == component || existingComponent.component == null);
269
+ _ = _materialStackCache.RemoveAll(
270
+ existingComponent => existingComponent.component == component || existingComponent.component == null);
271
+ }
272
+ }
273
+ }
@@ -0,0 +1,3 @@
1
+ fileFormatVersion: 2
2
+ guid: 7b2d3d00a0e140fea968fea4859c1781
3
+ timeCreated: 1720397272
@@ -0,0 +1,98 @@
1
+ namespace UnityHelpers.Utils
2
+ {
3
+ using System;
4
+ using Core.Attributes;
5
+ using UnityEngine;
6
+ using UnityEngine.Serialization;
7
+
8
+ [DisallowMultipleComponent]
9
+ public sealed class SpriteRendererSync : MonoBehaviour
10
+ {
11
+ public int? DynamicSortingOrderOverride { get; set; }
12
+
13
+ public SpriteRenderer DynamicToMatch
14
+ {
15
+ get => GetDynamicSpriteRenderer();
16
+ set => _cachedSpriteRenderer = value;
17
+ }
18
+
19
+ [FormerlySerializedAs("_toMatch")]
20
+ public SpriteRenderer toMatch;
21
+
22
+ [FormerlySerializedAs("_matchColor")]
23
+ public bool matchColor;
24
+
25
+ [FormerlySerializedAs("_matchMaterial")]
26
+ public bool matchMaterial;
27
+
28
+ public bool matchSortingLayer = true;
29
+
30
+ public bool matchOrderInLayer = true;
31
+
32
+ public Func<SpriteRenderer> dynamicToMatch;
33
+
34
+ [SerializeField]
35
+ [SiblingComponent]
36
+ private SpriteRenderer _spriteRenderer;
37
+
38
+ private SpriteRenderer _cachedSpriteRenderer;
39
+
40
+ private void Awake()
41
+ {
42
+ if (_spriteRenderer == null)
43
+ {
44
+ this.AssignSiblingComponents();
45
+ }
46
+ }
47
+
48
+ private void LateUpdate()
49
+ {
50
+ SpriteRenderer localToMatch = dynamicToMatch != null ? GetDynamicSpriteRenderer() : toMatch;
51
+ if (localToMatch == null)
52
+ {
53
+ _spriteRenderer.sprite = null;
54
+ return;
55
+ }
56
+
57
+ _spriteRenderer.sprite = localToMatch.sprite;
58
+ _spriteRenderer.enabled = localToMatch.enabled;
59
+ _spriteRenderer.flipX = localToMatch.flipX;
60
+ _spriteRenderer.flipY = localToMatch.flipY;
61
+ if (matchColor)
62
+ {
63
+ _spriteRenderer.color = localToMatch.color;
64
+ }
65
+
66
+ if (matchMaterial)
67
+ {
68
+ _spriteRenderer.material = localToMatch.material;
69
+ }
70
+
71
+ if (matchSortingLayer)
72
+ {
73
+ _spriteRenderer.sortingLayerName = localToMatch.sortingLayerName;
74
+ }
75
+
76
+ if (matchOrderInLayer)
77
+ {
78
+ _spriteRenderer.sortingOrder = DynamicSortingOrderOverride ?? localToMatch.sortingOrder;
79
+ }
80
+
81
+ _spriteRenderer.size = localToMatch.size;
82
+ _spriteRenderer.spriteSortPoint = localToMatch.spriteSortPoint;
83
+ _spriteRenderer.drawMode = localToMatch.drawMode;
84
+ _spriteRenderer.tileMode = localToMatch.tileMode;
85
+ }
86
+
87
+ private SpriteRenderer GetDynamicSpriteRenderer()
88
+ {
89
+ if (_cachedSpriteRenderer != null && _cachedSpriteRenderer.gameObject.activeSelf)
90
+ {
91
+ return _cachedSpriteRenderer;
92
+ }
93
+
94
+ _cachedSpriteRenderer = dynamicToMatch();
95
+ return _cachedSpriteRenderer;
96
+ }
97
+ }
98
+ }
@@ -0,0 +1,3 @@
1
+ fileFormatVersion: 2
2
+ guid: ec3a379f59bc407f92daaab2a3d4e089
3
+ timeCreated: 1720400998
@@ -3,7 +3,7 @@
3
3
  using Core.Extension;
4
4
  using NUnit.Framework;
5
5
 
6
- public class StringExtensionTests
6
+ public sealed class StringExtensionTests
7
7
  {
8
8
  [Test]
9
9
  public void ToPascalCaseNominal()
@@ -0,0 +1,395 @@
1
+ namespace UnityHelpers.Tests.Utils
2
+ {
3
+ using System.Collections;
4
+ using System.Collections.Generic;
5
+ using System.Linq;
6
+ using Core.Helper;
7
+ using Core.Random;
8
+ using NUnit.Framework;
9
+ using UnityEngine;
10
+ using UnityEngine.TestTools;
11
+ using UnityHelpers.Utils;
12
+
13
+ public sealed class SpriteRendererMetadataTests
14
+ {
15
+ private readonly List<GameObject> _spawned = new();
16
+
17
+ [TearDown]
18
+ public void Cleanup()
19
+ {
20
+ foreach (GameObject spawned in _spawned)
21
+ {
22
+ if (spawned == null)
23
+ {
24
+ continue;
25
+ }
26
+
27
+ Object.Destroy(spawned);
28
+ }
29
+
30
+ _spawned.Clear();
31
+ }
32
+
33
+ private SpriteRendererMetadata CreateMetadata()
34
+ {
35
+ GameObject go = new("TestSpriteRendererMetadata", typeof(SpriteRenderer), typeof(SpriteRendererMetadata));
36
+ _spawned.Add(go);
37
+ return go.GetComponent<SpriteRendererMetadata>();
38
+ }
39
+
40
+ private Material CreateMaterial()
41
+ {
42
+ return new Material(Shader.Find("Sprites/Default"));
43
+ }
44
+
45
+ private Color CreateColor()
46
+ {
47
+ IRandom random = PcgRandom.Instance;
48
+ Color color = new(random.NextFloat(), random.NextFloat(), random.NextFloat(), random.NextFloat());
49
+ return color;
50
+ }
51
+
52
+ [UnityTest]
53
+ public IEnumerator Initialization()
54
+ {
55
+ SpriteRendererMetadata metadata = CreateMetadata();
56
+ SpriteRenderer spriteRenderer = metadata.GetComponent<SpriteRenderer>();
57
+ Assert.AreEqual(spriteRenderer.color, metadata.CurrentColor);
58
+ Assert.AreEqual(spriteRenderer.material, metadata.CurrentMaterial);
59
+ Assert.AreEqual(metadata.OriginalColor, metadata.CurrentColor);
60
+ Assert.AreEqual(metadata.OriginalMaterial, metadata.CurrentMaterial);
61
+ Assert.AreEqual(1, metadata.Colors.Count());
62
+ Assert.IsTrue(metadata.Colors.Contains(metadata.OriginalColor));
63
+ Assert.AreEqual(1, metadata.Materials.Count());
64
+ Assert.IsTrue(metadata.Materials.Contains(metadata.OriginalMaterial));
65
+ yield break;
66
+ }
67
+
68
+ [UnityTest]
69
+ public IEnumerator PushColor()
70
+ {
71
+ SpriteRendererMetadata metadata = CreateMetadata();
72
+ Color originalColor = metadata.OriginalColor;
73
+ Color newColor = originalColor;
74
+ Material originalMaterial = metadata.OriginalMaterial;
75
+ do
76
+ {
77
+ newColor.r = PcgRandom.Instance.NextFloat();
78
+ }
79
+ while (newColor == originalColor);
80
+
81
+ SpriteRendererMetadata second = CreateMetadata();
82
+ SpriteRenderer spriteRenderer = metadata.GetComponent<SpriteRenderer>();
83
+ Assert.AreEqual(spriteRenderer.color, metadata.CurrentColor);
84
+ metadata.PushColor(second, newColor);
85
+ Assert.AreEqual(spriteRenderer.color, metadata.CurrentColor);
86
+ Assert.AreEqual(newColor, metadata.CurrentColor);
87
+ Assert.IsTrue(metadata.Colors.Contains(newColor));
88
+ Assert.AreEqual(originalColor, metadata.OriginalColor);
89
+ Assert.AreEqual(originalMaterial, metadata.CurrentMaterial);
90
+
91
+ Color updatedColor = newColor;
92
+ do
93
+ {
94
+ updatedColor.g = PcgRandom.Instance.NextFloat();
95
+ }
96
+ while (updatedColor == newColor);
97
+
98
+ metadata.PushColor(spriteRenderer, updatedColor);
99
+ Assert.AreEqual(spriteRenderer.color, metadata.CurrentColor);
100
+ Assert.AreEqual(updatedColor, metadata.CurrentColor);
101
+ Assert.AreEqual(3, metadata.Colors.Count());
102
+ Assert.IsTrue(metadata.Colors.Contains(originalColor));
103
+ Assert.IsTrue(metadata.Colors.Contains(newColor));
104
+ Assert.IsTrue(metadata.Colors.Contains(updatedColor));
105
+ Assert.AreEqual(originalColor, metadata.OriginalColor);
106
+ Assert.AreEqual(originalMaterial, metadata.CurrentMaterial);
107
+
108
+ Color latestColor = updatedColor;
109
+ do
110
+ {
111
+ latestColor.b = PcgRandom.Instance.NextFloat();
112
+ }
113
+ while (latestColor == updatedColor);
114
+
115
+ metadata.PushColor(second, latestColor);
116
+ Assert.AreEqual(spriteRenderer.color, metadata.CurrentColor);
117
+ Assert.AreEqual(latestColor, metadata.CurrentColor);
118
+ Assert.AreEqual(3, metadata.Colors.Count());
119
+ // Should be replaced
120
+ Assert.IsFalse(metadata.Colors.Contains(newColor));
121
+ do
122
+ {
123
+ newColor.a = PcgRandom.Instance.NextFloat();
124
+ }
125
+ while (newColor == latestColor);
126
+
127
+ metadata.PushColor(second, newColor);
128
+ Assert.AreEqual(spriteRenderer.color, metadata.CurrentColor);
129
+ Assert.AreEqual(newColor, metadata.CurrentColor);
130
+ Assert.AreEqual(3, metadata.Colors.Count());
131
+ Assert.IsTrue(metadata.Colors.Contains(originalColor));
132
+ Assert.IsTrue(metadata.Colors.Contains(newColor));
133
+ Assert.IsTrue(metadata.Colors.Contains(updatedColor));
134
+
135
+ metadata.PushColor(second, newColor);
136
+ Assert.AreEqual(spriteRenderer.color, metadata.CurrentColor);
137
+ Assert.AreEqual(newColor, metadata.CurrentColor);
138
+ Assert.AreEqual(3, metadata.Colors.Count());
139
+ Assert.IsTrue(metadata.Colors.Contains(originalColor));
140
+ Assert.IsTrue(metadata.Colors.Contains(newColor));
141
+ Assert.IsTrue(metadata.Colors.Contains(updatedColor));
142
+ yield break;
143
+ }
144
+
145
+ [UnityTest]
146
+ public IEnumerator PushColorIdempotent()
147
+ {
148
+ SpriteRendererMetadata metadata = CreateMetadata();
149
+ SpriteRenderer spriteRenderer = metadata.GetComponent<SpriteRenderer>();
150
+ Color color = CreateColor();
151
+
152
+ void Verify()
153
+ {
154
+ metadata.PushColor(spriteRenderer, color);
155
+ Assert.AreEqual(spriteRenderer.color, color);
156
+ Assert.AreEqual(color, metadata.CurrentColor);
157
+ Assert.AreEqual(2, metadata.Colors.Count());
158
+ }
159
+
160
+ for (int i = 0; i < 100; ++i)
161
+ {
162
+ Verify();
163
+ }
164
+
165
+ yield break;
166
+ }
167
+
168
+ [UnityTest]
169
+ public IEnumerator PushMaterialIdempotent()
170
+ {
171
+ SpriteRendererMetadata metadata = CreateMetadata();
172
+ SpriteRenderer spriteRenderer = metadata.GetComponent<SpriteRenderer>();
173
+ Material material = CreateMaterial();
174
+
175
+ void Verify()
176
+ {
177
+ metadata.PushMaterial(spriteRenderer, material);
178
+ Assert.AreEqual(spriteRenderer.material, metadata.CurrentMaterial);
179
+ Assert.AreEqual(2, metadata.Materials.Count());
180
+ Assert.IsTrue(metadata.Materials.Contains(spriteRenderer.material));
181
+ Assert.IsTrue(metadata.Materials.Contains(metadata.OriginalMaterial));
182
+ }
183
+
184
+ for (int i = 0; i < 100; ++i)
185
+ {
186
+ Verify();
187
+ }
188
+
189
+ yield break;
190
+ }
191
+
192
+
193
+ [UnityTest]
194
+ public IEnumerator PopColorIdempotent()
195
+ {
196
+ SpriteRendererMetadata metadata = CreateMetadata();
197
+ SpriteRenderer spriteRenderer = metadata.GetComponent<SpriteRenderer>();
198
+ Color originalColor = spriteRenderer.color;
199
+ Color color = CreateColor();
200
+ metadata.PushColor(spriteRenderer, color);
201
+
202
+ void Verify()
203
+ {
204
+ metadata.PopColor(spriteRenderer);
205
+ Assert.AreEqual(spriteRenderer.color, metadata.CurrentColor);
206
+ Assert.AreEqual(originalColor, metadata.CurrentColor);
207
+ Assert.AreEqual(1, metadata.Colors.Count());
208
+ }
209
+
210
+ for (int i = 0; i < 100; ++i)
211
+ {
212
+ Verify();
213
+ }
214
+
215
+ yield break;
216
+ }
217
+
218
+ [UnityTest]
219
+ public IEnumerator PopMaterialIdempotent()
220
+ {
221
+ SpriteRendererMetadata metadata = CreateMetadata();
222
+ SpriteRenderer spriteRenderer = metadata.GetComponent<SpriteRenderer>();
223
+ Material material = CreateMaterial();
224
+
225
+ metadata.PushMaterial(spriteRenderer, material);
226
+
227
+ void Verify()
228
+ {
229
+ metadata.PopMaterial(spriteRenderer);
230
+ Assert.AreEqual(spriteRenderer.material, metadata.CurrentMaterial);
231
+ Assert.AreEqual(1, metadata.Materials.Count());
232
+ Assert.IsTrue(metadata.Materials.Contains(spriteRenderer.material));
233
+ }
234
+
235
+ for (int i = 0; i < 100; ++i)
236
+ {
237
+ Verify();
238
+ }
239
+
240
+ yield break;
241
+ }
242
+
243
+ [UnityTest]
244
+ public IEnumerator CannotSelfPushColor()
245
+ {
246
+ SpriteRendererMetadata metadata = CreateMetadata();
247
+ SpriteRenderer spriteRenderer = metadata.GetComponent<SpriteRenderer>();
248
+ Color color = CreateColor();
249
+ Color originalColor = metadata.OriginalColor;
250
+ metadata.PushColor(metadata, color);
251
+ Assert.AreEqual(originalColor, metadata.CurrentColor);
252
+ Assert.AreEqual(originalColor, spriteRenderer.color);
253
+ Assert.AreEqual(1, metadata.Colors.Count());
254
+ yield break;
255
+ }
256
+
257
+ [UnityTest]
258
+ public IEnumerator CannotSelfPopColor()
259
+ {
260
+ SpriteRendererMetadata metadata = CreateMetadata();
261
+ SpriteRenderer spriteRenderer = metadata.GetComponent<SpriteRenderer>();
262
+ Color originalColor = metadata.OriginalColor;
263
+ metadata.PopColor(metadata);
264
+ Assert.AreEqual(originalColor, metadata.CurrentColor);
265
+ Assert.AreEqual(originalColor, spriteRenderer.color);
266
+ Assert.AreEqual(1, metadata.Colors.Count());
267
+ yield break;
268
+ }
269
+
270
+ [UnityTest]
271
+ public IEnumerator CannotSelfPopMaterial()
272
+ {
273
+ SpriteRendererMetadata metadata = CreateMetadata();
274
+ SpriteRenderer spriteRenderer = metadata.GetComponent<SpriteRenderer>();
275
+ Material originalMaterial = metadata.OriginalMaterial;
276
+ metadata.PopMaterial(metadata);
277
+ Assert.AreEqual(originalMaterial, metadata.CurrentMaterial);
278
+ Assert.AreEqual(originalMaterial, spriteRenderer.material);
279
+ Assert.AreEqual(1, metadata.Materials.Count());
280
+ yield break;
281
+ }
282
+
283
+ [UnityTest]
284
+ public IEnumerator CannotSelfPushMaterial()
285
+ {
286
+ SpriteRendererMetadata metadata = CreateMetadata();
287
+ SpriteRenderer spriteRenderer = metadata.GetComponent<SpriteRenderer>();
288
+ Material material = CreateMaterial();
289
+ Material originalMaterial = metadata.OriginalMaterial;
290
+ metadata.PushMaterial(metadata, material);
291
+ Assert.AreEqual(originalMaterial, metadata.CurrentMaterial);
292
+ Assert.AreEqual(originalMaterial, spriteRenderer.material);
293
+ Assert.AreNotEqual(material, spriteRenderer.material);
294
+ Assert.AreEqual(1, metadata.Materials.Count());
295
+ yield break;
296
+ }
297
+
298
+ [UnityTest]
299
+ public IEnumerator EnableDisableColor()
300
+ {
301
+ SpriteRendererMetadata metadata = CreateMetadata();
302
+ SpriteRenderer spriteRenderer = metadata.GetComponent<SpriteRenderer>();
303
+ Color color = CreateColor();
304
+ metadata.PushColor(spriteRenderer, color);
305
+ Assert.AreEqual(color, metadata.CurrentColor);
306
+ Assert.AreEqual(spriteRenderer.color, metadata.CurrentColor);
307
+ Assert.AreEqual(2, metadata.Colors.Count());
308
+
309
+ metadata.enabled = false;
310
+ Assert.AreEqual(metadata.OriginalColor, metadata.CurrentColor);
311
+ Assert.AreEqual(spriteRenderer.color, metadata.CurrentColor);
312
+ Assert.AreEqual(1, metadata.Colors.Count());
313
+
314
+ metadata.enabled = true;
315
+ Assert.AreEqual(color, metadata.CurrentColor);
316
+ Assert.AreEqual(spriteRenderer.color, metadata.CurrentColor);
317
+ Assert.AreEqual(2, metadata.Colors.Count());
318
+ yield break;
319
+ }
320
+
321
+ [UnityTest]
322
+ public IEnumerator EnableDisableMaterial()
323
+ {
324
+ SpriteRendererMetadata metadata = CreateMetadata();
325
+ SpriteRenderer spriteRenderer = metadata.GetComponent<SpriteRenderer>();
326
+ Material material = CreateMaterial();
327
+ metadata.PushMaterial(spriteRenderer, material);
328
+ Assert.AreEqual(spriteRenderer.material, metadata.CurrentMaterial);
329
+ Assert.AreEqual(2, metadata.Materials.Count());
330
+
331
+ metadata.enabled = false;
332
+ Assert.AreEqual(metadata.OriginalMaterial, metadata.CurrentMaterial);
333
+ Assert.AreEqual(1, metadata.Materials.Count());
334
+
335
+ metadata.enabled = true;
336
+ Assert.AreEqual(spriteRenderer.material, metadata.CurrentMaterial);
337
+ Assert.AreEqual(2, metadata.Materials.Count());
338
+ yield break;
339
+ }
340
+
341
+ [UnityTest]
342
+ public IEnumerator EnableDisableWithRemoveColor()
343
+ {
344
+ SpriteRendererMetadata metadata = CreateMetadata();
345
+ SpriteRenderer spriteRenderer = metadata.GetComponent<SpriteRenderer>();
346
+ Color color = CreateColor();
347
+ metadata.PushColor(spriteRenderer, color);
348
+ Assert.AreEqual(color, metadata.CurrentColor);
349
+ Assert.AreEqual(spriteRenderer.color, metadata.CurrentColor);
350
+ Assert.AreEqual(2, metadata.Colors.Count());
351
+
352
+ metadata.enabled = false;
353
+ Assert.AreEqual(metadata.OriginalColor, metadata.CurrentColor);
354
+ Assert.AreEqual(spriteRenderer.color, metadata.CurrentColor);
355
+ Assert.AreEqual(1, metadata.Colors.Count());
356
+
357
+ metadata.PopColor(spriteRenderer);
358
+
359
+ Assert.AreEqual(metadata.OriginalColor, metadata.CurrentColor);
360
+ Assert.AreEqual(spriteRenderer.color, metadata.CurrentColor);
361
+ Assert.AreEqual(1, metadata.Colors.Count());
362
+
363
+ metadata.enabled = true;
364
+ Assert.AreEqual(metadata.OriginalColor, metadata.CurrentColor);
365
+ Assert.AreEqual(spriteRenderer.color, metadata.CurrentColor);
366
+ Assert.AreEqual(1, metadata.Colors.Count());
367
+ yield break;
368
+ }
369
+
370
+ [UnityTest]
371
+ public IEnumerator EnableDisableWithRemoveMaterial()
372
+ {
373
+ SpriteRendererMetadata metadata = CreateMetadata();
374
+ SpriteRenderer spriteRenderer = metadata.GetComponent<SpriteRenderer>();
375
+ Material material = CreateMaterial();
376
+ metadata.PushMaterial(spriteRenderer, material);
377
+ Assert.AreEqual(spriteRenderer.material, metadata.CurrentMaterial);
378
+ Assert.AreEqual(2, metadata.Materials.Count());
379
+
380
+ metadata.enabled = false;
381
+ Assert.AreEqual(metadata.OriginalMaterial, metadata.CurrentMaterial);
382
+ Assert.AreEqual(1, metadata.Materials.Count());
383
+
384
+ metadata.PopMaterial(spriteRenderer);
385
+
386
+ Assert.AreEqual(metadata.OriginalMaterial, metadata.CurrentMaterial);
387
+ Assert.AreEqual(1, metadata.Materials.Count());
388
+
389
+ metadata.enabled = true;
390
+ Assert.AreEqual(metadata.OriginalMaterial, metadata.CurrentMaterial);
391
+ Assert.AreEqual(1, metadata.Materials.Count());
392
+ yield break;
393
+ }
394
+ }
395
+ }
@@ -0,0 +1,3 @@
1
+ fileFormatVersion: 2
2
+ guid: 5cbbc68f2b7c4c7d8b2fc2324a429130
3
+ timeCreated: 1720397409
@@ -0,0 +1,3 @@
1
+ fileFormatVersion: 2
2
+ guid: 07d3ff4fdf554c119ebd3f49fcaa09a3
3
+ timeCreated: 1720397402
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "com.wallstop-studios.unity-helpers",
3
- "version": "1.0.0-rc9",
3
+ "version": "1.0.1-rc01",
4
4
  "displayName": "Unity Helpers",
5
5
  "description": "Various Unity Helper Library",
6
6
  "dependencies": {
@@ -16,6 +16,7 @@
16
16
  "random",
17
17
  "pcg random",
18
18
  "protobuf",
19
+ "pascal",
19
20
  "rtree",
20
21
  "r tree",
21
22
  "kd tree",