com.wallstop-studios.unity-helpers 2.0.0-rc81.6 → 2.0.0-rc81.9

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.
Files changed (1449) hide show
  1. package/.config/dotnet-tools.json +10 -10
  2. package/.csharpierignore +1 -0
  3. package/.csharpierrc.json +3 -0
  4. package/.editorconfig +184 -184
  5. package/.gitattributes +87 -63
  6. package/.githooks/pre-commit +49 -0
  7. package/.github/dependabot.yml +9 -9
  8. package/.github/workflows/csharpier.yml +135 -0
  9. package/.github/workflows/lint-doc-links.yml +27 -0
  10. package/.github/workflows/markdown-json.yml +41 -0
  11. package/.github/workflows/npm-publish.yml +75 -75
  12. package/.lychee.toml +26 -0
  13. package/.markdownlint.json +21 -0
  14. package/.markdownlintignore +8 -0
  15. package/.pre-commit-config.yaml +39 -22
  16. package/.prettierignore +22 -0
  17. package/.prettierrc.json +20 -0
  18. package/AGENTS.md +52 -0
  19. package/{Third Party Notices.md.meta → AGENTS.md.meta} +7 -7
  20. package/CHANGELOG.md.meta +7 -7
  21. package/DATA_STRUCTURES.md +324 -0
  22. package/DATA_STRUCTURES.md.meta +7 -0
  23. package/Docs/Images/attribute_resolution.svg +40 -0
  24. package/Docs/Images/attribute_resolution.svg.meta +7 -0
  25. package/Docs/Images/bitset.svg +47 -0
  26. package/Docs/Images/bitset.svg.meta +7 -0
  27. package/Docs/Images/concave_hull.svg +30 -0
  28. package/Docs/Images/concave_hull.svg.meta +7 -0
  29. package/Docs/Images/convex_hull.svg +29 -0
  30. package/Docs/Images/convex_hull.svg.meta +7 -0
  31. package/Docs/Images/cyclic_buffer.svg +37 -0
  32. package/Docs/Images/cyclic_buffer.svg.meta +7 -0
  33. package/Docs/Images/data_distribution_decision.svg +88 -0
  34. package/Docs/Images/data_distribution_decision.svg.meta +7 -0
  35. package/Docs/Images/deque.svg +64 -0
  36. package/Docs/Images/deque.svg.meta +7 -0
  37. package/Docs/Images/deque_queue.svg +107 -0
  38. package/Docs/Images/deque_queue.svg.meta +7 -0
  39. package/Docs/Images/disjoint_set.svg +47 -0
  40. package/Docs/Images/disjoint_set.svg.meta +7 -0
  41. package/Docs/Images/effects_pipeline.svg +59 -0
  42. package/Docs/Images/effects_pipeline.svg.meta +7 -0
  43. package/Docs/Images/geometry_edge_cases.svg +61 -0
  44. package/Docs/Images/geometry_edge_cases.svg.meta +7 -0
  45. package/Docs/Images/heap.svg +56 -0
  46. package/Docs/Images/heap.svg.meta +7 -0
  47. package/Docs/Images/kdtree_2d.svg +38 -0
  48. package/Docs/Images/kdtree_2d.svg.meta +7 -0
  49. package/Docs/Images/kdtree_3d.svg +83 -0
  50. package/Docs/Images/kdtree_3d.svg.meta +7 -0
  51. package/Docs/Images/octree_3d.svg +79 -0
  52. package/Docs/Images/octree_3d.svg.meta +7 -0
  53. package/Docs/Images/polyline_simplify.svg +18 -0
  54. package/Docs/Images/polyline_simplify.svg.meta +7 -0
  55. package/Docs/Images/quadtree_2d.svg +37 -0
  56. package/Docs/Images/quadtree_2d.svg.meta +7 -0
  57. package/Docs/Images/query_boundaries.svg +38 -0
  58. package/Docs/Images/query_boundaries.svg.meta +7 -0
  59. package/Docs/Images/random_generators.svg +105 -0
  60. package/Docs/Images/random_generators.svg.meta +7 -0
  61. package/Docs/Images/reflection_scan.svg +33 -0
  62. package/Docs/Images/reflection_scan.svg.meta +7 -0
  63. package/Docs/Images/relational_wiring.svg +75 -0
  64. package/Docs/Images/relational_wiring.svg.meta +7 -0
  65. package/Docs/Images/rtree_2d.svg +27 -0
  66. package/Docs/Images/rtree_2d.svg.meta +7 -0
  67. package/Docs/Images/rtree_3d.svg +79 -0
  68. package/Docs/Images/rtree_3d.svg.meta +7 -0
  69. package/Docs/Images/serialization_flow.svg +50 -0
  70. package/Docs/Images/serialization_flow.svg.meta +7 -0
  71. package/Docs/Images/singletons_lifecycle.svg +54 -0
  72. package/Docs/Images/singletons_lifecycle.svg.meta +7 -0
  73. package/Docs/Images/sparse_set.svg +54 -0
  74. package/Docs/Images/sparse_set.svg.meta +7 -0
  75. package/Docs/Images/trie.svg +55 -0
  76. package/Docs/Images/trie.svg.meta +7 -0
  77. package/Docs/Images.meta +8 -0
  78. package/Docs.meta +8 -0
  79. package/EDITOR_TOOLS_GUIDE.md +1976 -0
  80. package/EDITOR_TOOLS_GUIDE.md.meta +7 -0
  81. package/EFFECTS_SYSTEM.md +242 -0
  82. package/EFFECTS_SYSTEM.md.meta +7 -0
  83. package/EFFECTS_SYSTEM_TUTORIAL.md +467 -0
  84. package/EFFECTS_SYSTEM_TUTORIAL.md.meta +7 -0
  85. package/Editor/AnimationEventEditor.cs +1393 -874
  86. package/Editor/AnimationEventEditor.cs.meta +11 -11
  87. package/Editor/AssemblyInfo.cs +4 -0
  88. package/Editor/AssemblyInfo.cs.meta +3 -0
  89. package/Editor/AssetProcessors/SpriteLabelProcessor.cs +138 -111
  90. package/Editor/AssetProcessors/SpriteLabelProcessor.cs.meta +2 -2
  91. package/Editor/AssetProcessors.meta +2 -2
  92. package/Editor/Core/Helper/AnimationEventHelpers.cs +204 -0
  93. package/{Runtime/Core/DataStructure/ISpatialTree.cs.meta → Editor/Core/Helper/AnimationEventHelpers.cs.meta} +11 -11
  94. package/Editor/Core/Helper.meta +8 -0
  95. package/Editor/Core.meta +8 -0
  96. package/Editor/CustomDrawers/IntDropdownDrawer.cs +46 -46
  97. package/Editor/CustomDrawers/IntDropdownDrawer.cs.meta +2 -2
  98. package/Editor/CustomDrawers/StringInListeDrawer.cs +135 -135
  99. package/Editor/CustomDrawers/StringInListeDrawer.cs.meta +2 -2
  100. package/Editor/CustomDrawers/WShowIfPropertyDrawer.cs +105 -105
  101. package/Editor/CustomDrawers/WShowIfPropertyDrawer.cs.meta +2 -2
  102. package/Editor/CustomDrawers.meta +2 -2
  103. package/Editor/CustomEditors/MatchColliderToSpriteEditor.cs +32 -32
  104. package/Editor/CustomEditors/MatchColliderToSpriteEditor.cs.meta +2 -2
  105. package/Editor/CustomEditors/PersistentDirectoryGUI.cs +799 -799
  106. package/Editor/CustomEditors/PersistentDirectoryGUI.cs.meta +2 -2
  107. package/Editor/CustomEditors/PolygonCollider2DOptimizerEditor.cs +38 -40
  108. package/Editor/CustomEditors/PolygonCollider2DOptimizerEditor.cs.meta +2 -2
  109. package/Editor/CustomEditors/SourceFolderEntryDrawer.cs +685 -413
  110. package/Editor/CustomEditors/SourceFolderEntryDrawer.cs.meta +2 -2
  111. package/Editor/CustomEditors/TexturePlatformOverrideEntryDrawer.cs +146 -0
  112. package/{Runtime/Core/DataStructure/KDTree.cs.meta → Editor/CustomEditors/TexturePlatformOverrideEntryDrawer.cs.meta} +11 -11
  113. package/Editor/CustomEditors.meta +2 -2
  114. package/Editor/Extensions/SerializedPropertyExtensions.cs +217 -190
  115. package/Editor/Extensions/SerializedPropertyExtensions.cs.meta +2 -2
  116. package/Editor/Extensions/UnityExtensions.cs +50 -26
  117. package/Editor/Extensions/UnityExtensions.cs.meta +2 -2
  118. package/Editor/Extensions.meta +2 -2
  119. package/Editor/FitTextureSizeWindow.cs +785 -332
  120. package/Editor/FitTextureSizeWindow.cs.meta +2 -2
  121. package/Editor/Persistence/MultiFileSelectorPersistenceManager.cs +62 -0
  122. package/{Runtime/Core/DataStructure/QuadTree.cs.meta → Editor/Persistence/MultiFileSelectorPersistenceManager.cs.meta} +11 -11
  123. package/Editor/Persistence/MultiFileSelectorPersistenceWindow.cs +65 -0
  124. package/Editor/Persistence/MultiFileSelectorPersistenceWindow.cs.meta +11 -0
  125. package/Editor/Persistence.meta +8 -0
  126. package/Editor/PersistentDirectorySettings.cs +529 -248
  127. package/Editor/PersistentDirectorySettings.cs.meta +2 -2
  128. package/Editor/PrefabChecker.cs +1329 -741
  129. package/Editor/PrefabChecker.cs.meta +11 -11
  130. package/Editor/Sprites/AnimationCopier.cs +1518 -789
  131. package/Editor/Sprites/AnimationCopier.cs.meta +2 -2
  132. package/Editor/Sprites/AnimationCreator.cs +1532 -881
  133. package/Editor/Sprites/AnimationCreator.cs.meta +11 -11
  134. package/Editor/Sprites/AnimationViewerWindow.cs +1634 -1522
  135. package/Editor/Sprites/AnimationViewerWindow.cs.meta +2 -2
  136. package/Editor/Sprites/ScriptableSpriteAtlas.cs +251 -178
  137. package/Editor/Sprites/ScriptableSpriteAtlas.cs.meta +2 -2
  138. package/Editor/Sprites/ScriptableSpriteAtlasEditor.cs +1470 -1026
  139. package/Editor/Sprites/ScriptableSpriteAtlasEditor.cs.meta +2 -2
  140. package/Editor/Sprites/SpriteCropper.cs +1013 -523
  141. package/Editor/Sprites/SpriteCropper.cs.meta +2 -2
  142. package/Editor/Sprites/SpritePivotAdjustor.cs +605 -265
  143. package/Editor/Sprites/SpritePivotAdjustor.cs.meta +2 -2
  144. package/Editor/Sprites/SpriteSettingsApplier.cs +942 -918
  145. package/Editor/Sprites/SpriteSettingsApplier.cs.meta +2 -2
  146. package/Editor/Sprites/SpriteSettingsApplierAPI.cs +441 -0
  147. package/Editor/Sprites/SpriteSettingsApplierAPI.cs.meta +11 -0
  148. package/Editor/Sprites/SpriteSettingsProfileCollection.cs +12 -0
  149. package/Editor/Sprites/SpriteSettingsProfileCollection.cs.meta +11 -0
  150. package/Editor/Sprites/SpriteSheetAnimationCreator.cs +1586 -1537
  151. package/Editor/Sprites/SpriteSheetAnimationCreator.cs.meta +2 -2
  152. package/Editor/Sprites/TexturePlatformNameHelper.cs +78 -0
  153. package/Editor/Sprites/TexturePlatformNameHelper.cs.meta +11 -0
  154. package/Editor/Sprites/TextureResizerWizard.cs +434 -175
  155. package/Editor/Sprites/TextureResizerWizard.cs.meta +2 -2
  156. package/Editor/Sprites/TextureSettingsApplierAPI.cs +359 -0
  157. package/Editor/Sprites/TextureSettingsApplierAPI.cs.meta +11 -0
  158. package/Editor/Sprites/TextureSettingsApplierWindow.cs +605 -0
  159. package/Editor/Sprites/TextureSettingsApplierWindow.cs.meta +11 -0
  160. package/Editor/Sprites.meta +2 -2
  161. package/Editor/Styles/AnimationViewer.uss +115 -115
  162. package/Editor/Styles/AnimationViewer.uss.meta +2 -2
  163. package/Editor/Styles/AnimationViewer.uxml +56 -56
  164. package/Editor/Styles/AnimationViewer.uxml.meta +2 -2
  165. package/Editor/Styles/SpriteSheetAnimationCreator.uss +10 -0
  166. package/Editor/Styles/SpriteSheetAnimationCreator.uss.meta +11 -0
  167. package/Editor/Styles.meta +2 -2
  168. package/Editor/Tags/AttributeMetadataCacheEditor.cs +46 -0
  169. package/Editor/Tags/AttributeMetadataCacheEditor.cs.meta +11 -0
  170. package/Editor/Tags/AttributeMetadataCacheGenerator.cs +258 -0
  171. package/Editor/Tags/AttributeMetadataCacheGenerator.cs.meta +11 -0
  172. package/Editor/Tags.meta +8 -0
  173. package/Editor/Tools/ImageBlurTool.cs +451 -409
  174. package/Editor/Tools/ImageBlurTool.cs.meta +2 -2
  175. package/Editor/Tools.meta +2 -2
  176. package/Editor/Utils/DxReadOnlyPropertyDrawer.cs +26 -26
  177. package/Editor/Utils/DxReadOnlyPropertyDrawer.cs.meta +11 -11
  178. package/Editor/Utils/EditorUi.cs +228 -0
  179. package/Editor/Utils/EditorUi.cs.meta +11 -0
  180. package/Editor/Utils/EditorUtilities.cs +22 -22
  181. package/Editor/Utils/EditorUtilities.cs.meta +11 -11
  182. package/Editor/Utils/ScriptableObjectSingletonCreator.cs +633 -52
  183. package/Editor/Utils/ScriptableObjectSingletonCreator.cs.meta +2 -2
  184. package/Editor/Utils.meta +8 -8
  185. package/Editor/Visuals/EnhancedImageEditor.cs +160 -160
  186. package/Editor/Visuals/EnhancedImageEditor.cs.meta +11 -11
  187. package/Editor/Visuals.meta +2 -2
  188. package/Editor/WallstopStudios.UnityHelpers.Editor.asmdef +14 -18
  189. package/Editor/WallstopStudios.UnityHelpers.Editor.asmdef.meta +7 -7
  190. package/Editor.meta +8 -8
  191. package/GETTING_STARTED.md +425 -0
  192. package/GETTING_STARTED.md.meta +7 -0
  193. package/GLOSSARY.md +313 -0
  194. package/GLOSSARY.md.meta +7 -0
  195. package/HULLS.md +45 -0
  196. package/HULLS.md.meta +7 -0
  197. package/INDEX.md +429 -0
  198. package/INDEX.md.meta +7 -0
  199. package/LICENSE +21 -21
  200. package/LICENSE.md +7 -7
  201. package/LICENSE.md.meta +7 -7
  202. package/LICENSE.meta +7 -7
  203. package/MATH_AND_EXTENSIONS.md +316 -0
  204. package/MATH_AND_EXTENSIONS.md.meta +7 -0
  205. package/RANDOM_PERFORMANCE.md +140 -0
  206. package/RANDOM_PERFORMANCE.md.meta +7 -0
  207. package/README.md +3195 -188
  208. package/README.md.meta +7 -7
  209. package/REFLECTION_HELPERS.md +272 -0
  210. package/REFLECTION_HELPERS.md.meta +7 -0
  211. package/RELATIONAL_COMPONENTS.md +543 -0
  212. package/RELATIONAL_COMPONENTS.md.meta +7 -0
  213. package/Runtime/AssemblyInfo.cs +7 -0
  214. package/Runtime/AssemblyInfo.cs.meta +11 -0
  215. package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.dll +0 -0
  216. package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.dll.meta +33 -33
  217. package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.xml +499 -278
  218. package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.xml.meta +7 -7
  219. package/Runtime/Binaries/System.IO.Pipelines.dll +0 -0
  220. package/Runtime/Binaries/System.IO.Pipelines.dll.meta +33 -0
  221. package/Runtime/Binaries/System.IO.Pipelines.xml +702 -0
  222. package/Runtime/Binaries/System.IO.Pipelines.xml.meta +7 -0
  223. package/Runtime/Binaries/System.Text.Encodings.Web.dll +0 -0
  224. package/Runtime/Binaries/System.Text.Encodings.Web.dll.meta +33 -33
  225. package/Runtime/Binaries/System.Text.Encodings.Web.xml +1084 -1079
  226. package/Runtime/Binaries/System.Text.Encodings.Web.xml.meta +7 -7
  227. package/Runtime/Binaries/System.Text.Json.dll +0 -0
  228. package/Runtime/Binaries/System.Text.Json.dll.meta +33 -33
  229. package/Runtime/Binaries/System.Text.Json.xml +10217 -8116
  230. package/Runtime/Binaries/System.Text.Json.xml.meta +7 -7
  231. package/Runtime/Binaries.meta +8 -8
  232. package/Runtime/Core/Attributes/AnimationEventAttribute.cs +10 -138
  233. package/Runtime/Core/Attributes/AnimationEventAttribute.cs.meta +11 -11
  234. package/Runtime/Core/Attributes/BaseRelationalComponentAttribute.cs +841 -0
  235. package/Runtime/Core/Attributes/BaseRelationalComponentAttribute.cs.meta +11 -0
  236. package/Runtime/Core/Attributes/ChildComponentAttribute.cs +284 -226
  237. package/Runtime/Core/Attributes/ChildComponentAttribute.cs.meta +11 -11
  238. package/Runtime/Core/Attributes/DxReadOnlyAttribute.cs +6 -6
  239. package/Runtime/Core/Attributes/DxReadOnlyAttribute.cs.meta +11 -11
  240. package/Runtime/Core/Attributes/EnumDisplayNameAttribute.cs +15 -15
  241. package/Runtime/Core/Attributes/EnumDisplayNameAttribute.cs.meta +2 -2
  242. package/Runtime/Core/Attributes/IRelationalComponentAssigner.cs +36 -0
  243. package/Runtime/Core/Attributes/IRelationalComponentAssigner.cs.meta +11 -0
  244. package/Runtime/Core/Attributes/IntDropdownAttribute.cs +14 -14
  245. package/Runtime/Core/Attributes/IntDropdownAttribute.cs.meta +2 -2
  246. package/Runtime/Core/Attributes/KSerializableAttribute.cs +19 -19
  247. package/Runtime/Core/Attributes/KSerializableAttribute.cs.meta +11 -11
  248. package/Runtime/Core/Attributes/NotNullAttribute.cs +32 -32
  249. package/Runtime/Core/Attributes/NotNullAttribute.cs.meta +11 -11
  250. package/Runtime/Core/Attributes/ParentComponentAttribute.cs +376 -0
  251. package/Runtime/Core/Attributes/{ParentComponent.cs.meta → ParentComponentAttribute.cs.meta} +11 -11
  252. package/Runtime/Core/Attributes/RelationalComponentAssigner.cs +107 -0
  253. package/Runtime/Core/Attributes/RelationalComponentAssigner.cs.meta +11 -0
  254. package/Runtime/Core/Attributes/RelationalComponentExtensions.cs +61 -14
  255. package/Runtime/Core/Attributes/RelationalComponentExtensions.cs.meta +11 -11
  256. package/Runtime/Core/Attributes/RelationalComponentInitializer.cs +331 -0
  257. package/Runtime/Core/Attributes/RelationalComponentInitializer.cs.meta +11 -0
  258. package/Runtime/Core/Attributes/ScriptableSingletonPathAttribute.cs +15 -15
  259. package/Runtime/Core/Attributes/ScriptableSingletonPathAttribute.cs.meta +2 -2
  260. package/Runtime/Core/Attributes/SiblingComponentAttribute.cs +264 -137
  261. package/Runtime/Core/Attributes/SiblingComponentAttribute.cs.meta +11 -11
  262. package/Runtime/Core/Attributes/ValidateAssignmentAttribute.cs +115 -106
  263. package/Runtime/Core/Attributes/ValidateAssignmentAttribute.cs.meta +11 -11
  264. package/Runtime/Core/Attributes/ValueHelpers.cs +10 -0
  265. package/Runtime/Core/Attributes/ValueHelpers.cs.meta +3 -0
  266. package/Runtime/Core/Attributes/WShowIfAttribute.cs +24 -24
  267. package/Runtime/Core/Attributes/WShowIfAttribute.cs.meta +2 -2
  268. package/Runtime/Core/Attributes.meta +8 -8
  269. package/Runtime/Core/DataStructure/Adapters/FastVector2Int.cs +192 -92
  270. package/Runtime/Core/DataStructure/Adapters/FastVector2Int.cs.meta +11 -11
  271. package/Runtime/Core/DataStructure/Adapters/FastVector3Int.cs +268 -185
  272. package/Runtime/Core/DataStructure/Adapters/FastVector3Int.cs.meta +11 -11
  273. package/Runtime/Core/DataStructure/Adapters/KGuid.cs +360 -305
  274. package/Runtime/Core/DataStructure/Adapters/KGuid.cs.meta +11 -11
  275. package/Runtime/Core/DataStructure/Adapters/KVector2.cs +146 -80
  276. package/Runtime/Core/DataStructure/Adapters/KVector2.cs.meta +11 -11
  277. package/Runtime/Core/DataStructure/Adapters.meta +8 -8
  278. package/Runtime/Core/DataStructure/BitSet.cs +626 -0
  279. package/Runtime/Core/DataStructure/BitSet.cs.meta +11 -0
  280. package/Runtime/Core/DataStructure/BoundingBox3D.cs +405 -0
  281. package/Runtime/Core/DataStructure/BoundingBox3D.cs.meta +11 -0
  282. package/Runtime/Core/DataStructure/Circle.cs +203 -50
  283. package/Runtime/Core/DataStructure/Circle.cs.meta +11 -11
  284. package/Runtime/Core/DataStructure/CyclicBuffer.cs +489 -266
  285. package/Runtime/Core/DataStructure/CyclicBuffer.cs.meta +11 -11
  286. package/Runtime/Core/DataStructure/Deque.cs +561 -0
  287. package/Runtime/Core/DataStructure/Deque.cs.meta +11 -0
  288. package/Runtime/Core/DataStructure/DisjointSet.cs +483 -0
  289. package/Runtime/Core/DataStructure/DisjointSet.cs.meta +11 -0
  290. package/Runtime/Core/DataStructure/Heap.cs +514 -0
  291. package/Runtime/Core/DataStructure/Heap.cs.meta +11 -0
  292. package/Runtime/Core/DataStructure/{ISpatialTree.cs → ISpatialTree2D.cs} +25 -21
  293. package/Runtime/Core/DataStructure/ISpatialTree2D.cs.meta +11 -0
  294. package/Runtime/Core/DataStructure/ISpatialTree3D.cs +33 -0
  295. package/Runtime/Core/DataStructure/ISpatialTree3D.cs.meta +11 -0
  296. package/Runtime/Core/DataStructure/ImmutableBitSet.cs +398 -0
  297. package/Runtime/Core/DataStructure/ImmutableBitSet.cs.meta +3 -0
  298. package/Runtime/Core/DataStructure/KDTree2D.cs +852 -0
  299. package/Runtime/Core/DataStructure/KDTree2D.cs.meta +11 -0
  300. package/Runtime/Core/DataStructure/KDTree3D.cs +911 -0
  301. package/Runtime/Core/DataStructure/KDTree3D.cs.meta +11 -0
  302. package/Runtime/Core/DataStructure/OctTree3D.cs +983 -0
  303. package/Runtime/Core/DataStructure/OctTree3D.cs.meta +11 -0
  304. package/Runtime/Core/DataStructure/PriorityQueue.cs +194 -0
  305. package/Runtime/Core/DataStructure/PriorityQueue.cs.meta +11 -0
  306. package/Runtime/Core/DataStructure/QuadTree2D.cs +722 -0
  307. package/Runtime/Core/DataStructure/QuadTree2D.cs.meta +11 -0
  308. package/Runtime/Core/DataStructure/RTree2D.cs +704 -0
  309. package/Runtime/Core/DataStructure/{RTree.cs.meta → RTree2D.cs.meta} +11 -11
  310. package/Runtime/Core/DataStructure/RTree3D.cs +775 -0
  311. package/Runtime/Core/DataStructure/RTree3D.cs.meta +11 -0
  312. package/Runtime/Core/DataStructure/SparseSet.cs +597 -0
  313. package/Runtime/Core/DataStructure/SparseSet.cs.meta +11 -0
  314. package/Runtime/Core/DataStructure/SpatialHash2D.cs +312 -0
  315. package/Runtime/Core/DataStructure/SpatialHash2D.cs.meta +3 -0
  316. package/Runtime/Core/DataStructure/SpatialHash3D.cs +341 -0
  317. package/Runtime/Core/DataStructure/SpatialHash3D.cs.meta +11 -0
  318. package/Runtime/Core/DataStructure/Sphere.cs +264 -0
  319. package/Runtime/Core/DataStructure/Sphere.cs.meta +11 -0
  320. package/Runtime/Core/DataStructure/StringWrapper.cs +115 -91
  321. package/Runtime/Core/DataStructure/StringWrapper.cs.meta +11 -11
  322. package/Runtime/Core/DataStructure/TimedCache.cs +88 -66
  323. package/Runtime/Core/DataStructure/TimedCache.cs.meta +11 -11
  324. package/Runtime/Core/DataStructure/Trie.cs +660 -359
  325. package/Runtime/Core/DataStructure/Trie.cs.meta +2 -2
  326. package/Runtime/Core/DataStructure.meta +8 -8
  327. package/Runtime/Core/Extension/AnimatorExtensions.cs +40 -25
  328. package/Runtime/Core/Extension/AnimatorExtensions.cs.meta +11 -11
  329. package/Runtime/Core/Extension/AsyncOperationExtensions.cs +404 -110
  330. package/Runtime/Core/Extension/AsyncOperationExtensions.cs.meta +2 -2
  331. package/Runtime/Core/Extension/CircleExtensions.cs +125 -25
  332. package/Runtime/Core/Extension/CircleExtensions.cs.meta +11 -11
  333. package/Runtime/Core/Extension/ColorExtensions.cs +983 -644
  334. package/Runtime/Core/Extension/ColorExtensions.cs.meta +11 -11
  335. package/Runtime/Core/Extension/DictionaryExtensions.cs +606 -299
  336. package/Runtime/Core/Extension/DictionaryExtensions.cs.meta +11 -11
  337. package/Runtime/Core/Extension/DirectionExtensions.cs +377 -213
  338. package/Runtime/Core/Extension/DirectionExtensions.cs.meta +11 -11
  339. package/Runtime/Core/Extension/EnumExtensions.cs +535 -137
  340. package/Runtime/Core/Extension/EnumExtensions.cs.meta +2 -2
  341. package/Runtime/Core/Extension/IEnumerableExtensions.cs +341 -124
  342. package/Runtime/Core/Extension/IEnumerableExtensions.cs.meta +11 -11
  343. package/Runtime/Core/Extension/IListExtensions.cs +767 -248
  344. package/Runtime/Core/Extension/IListExtensions.cs.meta +11 -11
  345. package/Runtime/Core/Extension/IReadonlyListExtensions.cs +687 -37
  346. package/Runtime/Core/Extension/IReadonlyListExtensions.cs.meta +2 -2
  347. package/Runtime/Core/Extension/ProtoEqualityExtensions.cs +292 -0
  348. package/Runtime/Core/Extension/ProtoEqualityExtensions.cs.meta +3 -0
  349. package/Runtime/Core/Extension/RandomExtensions.cs +938 -109
  350. package/Runtime/Core/Extension/RandomExtensions.cs.meta +11 -11
  351. package/Runtime/Core/Extension/StringExtensions.cs +1635 -239
  352. package/Runtime/Core/Extension/StringExtensions.cs.meta +11 -11
  353. package/Runtime/Core/Extension/UnityExtensions.cs +4555 -1689
  354. package/Runtime/Core/Extension/UnityExtensions.cs.meta +11 -11
  355. package/Runtime/Core/Extension/WallstopStudiosLogger.cs +271 -245
  356. package/Runtime/Core/Extension/WallstopStudiosLogger.cs.meta +11 -11
  357. package/Runtime/Core/Extension.meta +8 -8
  358. package/Runtime/Core/Helper/ArrayConverter.cs +73 -39
  359. package/Runtime/Core/Helper/ArrayConverter.cs.meta +2 -2
  360. package/Runtime/Core/Helper/AssignUtilities.cs +33 -14
  361. package/Runtime/Core/Helper/AssignUtilities.cs.meta +11 -11
  362. package/Runtime/Core/Helper/DirectoryHelper.cs +210 -196
  363. package/Runtime/Core/Helper/DirectoryHelper.cs.meta +2 -2
  364. package/Runtime/Core/Helper/Enumerables.cs +51 -17
  365. package/Runtime/Core/Helper/Enumerables.cs.meta +11 -11
  366. package/Runtime/Core/Helper/FileHelper.cs +97 -77
  367. package/Runtime/Core/Helper/FileHelper.cs.meta +2 -2
  368. package/Runtime/Core/Helper/FormattingHelpers.cs +49 -38
  369. package/Runtime/Core/Helper/FormattingHelpers.cs.meta +2 -2
  370. package/Runtime/Core/Helper/FuncBasedComparer.cs +29 -0
  371. package/Runtime/Core/Helper/FuncBasedComparer.cs.meta +3 -0
  372. package/Runtime/Core/Helper/Geometry.cs +65 -43
  373. package/Runtime/Core/Helper/Geometry.cs.meta +11 -11
  374. package/Runtime/Core/Helper/Helpers.cs +1271 -831
  375. package/Runtime/Core/Helper/Helpers.cs.meta +11 -11
  376. package/Runtime/Core/Helper/IterationHelpers.cs +83 -32
  377. package/Runtime/Core/Helper/IterationHelpers.cs.meta +11 -11
  378. package/Runtime/Core/Helper/LifetimeHelpers.cs +20 -13
  379. package/Runtime/Core/Helper/LifetimeHelpers.cs.meta +11 -11
  380. package/Runtime/Core/Helper/LineHelper.cs +259 -194
  381. package/Runtime/Core/Helper/LineHelper.cs.meta +2 -2
  382. package/Runtime/Core/Helper/Logging/UnityLogTagFormatter.cs +549 -539
  383. package/Runtime/Core/Helper/Logging/UnityLogTagFormatter.cs.meta +2 -2
  384. package/Runtime/Core/Helper/Logging.meta +2 -2
  385. package/Runtime/Core/Helper/Objects.cs +477 -769
  386. package/Runtime/Core/Helper/Objects.cs.meta +11 -11
  387. package/Runtime/Core/Helper/Partials/LogHelpers.cs +13 -13
  388. package/Runtime/Core/Helper/Partials/LogHelpers.cs.meta +2 -2
  389. package/Runtime/Core/Helper/Partials/MathHelpers.cs +45 -30
  390. package/Runtime/Core/Helper/Partials/MathHelpers.cs.meta +2 -2
  391. package/Runtime/Core/Helper/Partials/ObjectHelpers.cs +506 -400
  392. package/Runtime/Core/Helper/Partials/ObjectHelpers.cs.meta +2 -2
  393. package/Runtime/Core/Helper/Partials/TransformHelpers.cs +393 -377
  394. package/Runtime/Core/Helper/Partials/TransformHelpers.cs.meta +2 -2
  395. package/Runtime/Core/Helper/Partials.meta +2 -2
  396. package/Runtime/Core/Helper/PathHelper.cs +42 -15
  397. package/Runtime/Core/Helper/PathHelper.cs.meta +2 -2
  398. package/Runtime/Core/Helper/ReflectionHelpers.cs +5287 -1963
  399. package/Runtime/Core/Helper/ReflectionHelpers.cs.meta +2 -2
  400. package/Runtime/Core/Helper/ReverseComparer.cs +33 -0
  401. package/Runtime/Core/Helper/ReverseComparer.cs.meta +3 -0
  402. package/Runtime/Core/Helper/SceneHelper.cs +251 -224
  403. package/Runtime/Core/Helper/SceneHelper.cs.meta +2 -2
  404. package/Runtime/Core/Helper/SpriteHelpers.cs +50 -41
  405. package/Runtime/Core/Helper/SpriteHelpers.cs.meta +11 -11
  406. package/Runtime/Core/Helper/StringInList.cs +61 -35
  407. package/Runtime/Core/Helper/StringInList.cs.meta +11 -11
  408. package/Runtime/Core/Helper/TestAssemblyHelper.cs +134 -0
  409. package/Runtime/Core/Helper/TestAssemblyHelper.cs.meta +11 -0
  410. package/Runtime/Core/Helper/UnityMainThreadDispatcher.cs +100 -82
  411. package/Runtime/Core/Helper/UnityMainThreadDispatcher.cs.meta +2 -2
  412. package/Runtime/Core/Helper/WallMath.cs +672 -166
  413. package/Runtime/Core/Helper/WallMath.cs.meta +11 -11
  414. package/Runtime/Core/Helper.meta +8 -8
  415. package/Runtime/Core/Math/Line2D.cs +263 -0
  416. package/Runtime/Core/Math/Line2D.cs.meta +11 -0
  417. package/Runtime/Core/Math/Line3D.cs +452 -0
  418. package/Runtime/Core/Math/Line3D.cs.meta +11 -0
  419. package/Runtime/Core/Math/Parabola.cs +241 -47
  420. package/Runtime/Core/Math/Parabola.cs.meta +11 -11
  421. package/Runtime/Core/Math/PointPolygonCheck.cs +175 -36
  422. package/Runtime/Core/Math/PointPolygonCheck.cs.meta +11 -11
  423. package/Runtime/Core/Math/Range.cs +157 -92
  424. package/Runtime/Core/Math/Range.cs.meta +11 -11
  425. package/Runtime/Core/Math.meta +8 -8
  426. package/Runtime/Core/Model/Direction.cs +25 -43
  427. package/Runtime/Core/Model/Direction.cs.meta +11 -11
  428. package/Runtime/Core/Model.meta +8 -8
  429. package/Runtime/Core/OneOf/FastOneOf.cs +252 -152
  430. package/Runtime/Core/OneOf/FastOneOf.cs.meta +11 -11
  431. package/Runtime/Core/OneOf/FastOneOf2.cs +198 -0
  432. package/Runtime/Core/OneOf/FastOneOf2.cs.meta +11 -0
  433. package/Runtime/Core/OneOf/FastOneOf4.cs +324 -0
  434. package/Runtime/Core/OneOf/FastOneOf4.cs.meta +11 -0
  435. package/Runtime/Core/OneOf/None.cs +30 -4
  436. package/Runtime/Core/OneOf/None.cs.meta +11 -11
  437. package/Runtime/Core/OneOf.meta +8 -8
  438. package/Runtime/Core/Random/AbstractRandom.cs +1318 -655
  439. package/Runtime/Core/Random/AbstractRandom.cs.meta +11 -11
  440. package/Runtime/Core/Random/DotNetRandom.cs +118 -54
  441. package/Runtime/Core/Random/DotNetRandom.cs.meta +2 -2
  442. package/Runtime/Core/Random/IRandom.cs +203 -161
  443. package/Runtime/Core/Random/IRandom.cs.meta +11 -11
  444. package/Runtime/Core/Random/IllusionFlow.cs +171 -107
  445. package/Runtime/Core/Random/IllusionFlow.cs.meta +2 -2
  446. package/Runtime/Core/Random/LinearCongruentialGenerator.cs +90 -49
  447. package/Runtime/Core/Random/LinearCongruentialGenerator.cs.meta +2 -2
  448. package/Runtime/Core/Random/NativePcgRandom.cs +139 -97
  449. package/Runtime/Core/Random/NativePcgRandom.cs.meta +11 -11
  450. package/Runtime/Core/Random/PRNG.cs +21 -7
  451. package/Runtime/Core/Random/PRNG.cs.meta +2 -2
  452. package/Runtime/Core/Random/PcgRandom.cs +243 -149
  453. package/Runtime/Core/Random/PcgRandom.cs.meta +11 -11
  454. package/Runtime/Core/Random/PerlinNoise.cs +369 -369
  455. package/Runtime/Core/Random/PerlinNoise.cs.meta +2 -2
  456. package/Runtime/Core/Random/RandomComparer.cs +34 -0
  457. package/Runtime/Core/Random/RandomComparer.cs.meta +3 -0
  458. package/Runtime/Core/Random/RandomState.cs +206 -131
  459. package/Runtime/Core/Random/RandomState.cs.meta +11 -11
  460. package/Runtime/Core/Random/RandomUtilities.cs +55 -26
  461. package/Runtime/Core/Random/RandomUtilities.cs.meta +11 -11
  462. package/Runtime/Core/Random/RomuDuo.cs +171 -116
  463. package/Runtime/Core/Random/RomuDuo.cs.meta +2 -2
  464. package/Runtime/Core/Random/SplitMix64.cs +134 -94
  465. package/Runtime/Core/Random/SplitMix64.cs.meta +2 -2
  466. package/Runtime/Core/Random/SquirrelRandom.cs +127 -84
  467. package/Runtime/Core/Random/SquirrelRandom.cs.meta +11 -11
  468. package/Runtime/Core/Random/SystemRandom.cs +203 -162
  469. package/Runtime/Core/Random/SystemRandom.cs.meta +11 -11
  470. package/Runtime/Core/Random/ThreadLocalRandom.cs +25 -12
  471. package/Runtime/Core/Random/ThreadLocalRandom.cs.meta +11 -11
  472. package/Runtime/Core/Random/UnityRandom.cs +109 -57
  473. package/Runtime/Core/Random/UnityRandom.cs.meta +11 -11
  474. package/Runtime/Core/Random/WyRandom.cs +158 -121
  475. package/Runtime/Core/Random/WyRandom.cs.meta +2 -2
  476. package/Runtime/Core/Random/XorShiftRandom.cs +106 -52
  477. package/Runtime/Core/Random/XorShiftRandom.cs.meta +11 -11
  478. package/Runtime/Core/Random/XoroShiroRandom.cs +184 -119
  479. package/Runtime/Core/Random/XoroShiroRandom.cs.meta +2 -2
  480. package/Runtime/Core/Random.meta +8 -8
  481. package/Runtime/Core/Serialization/JsonConverters/AnimationCurveConverter.cs +248 -0
  482. package/Runtime/Core/Serialization/JsonConverters/AnimationCurveConverter.cs.meta +11 -0
  483. package/Runtime/Core/Serialization/JsonConverters/BitSetConverter.cs +119 -0
  484. package/Runtime/Core/Serialization/JsonConverters/BitSetConverter.cs.meta +11 -0
  485. package/Runtime/Core/Serialization/JsonConverters/BoundingSphereConverter.cs +74 -0
  486. package/Runtime/Core/Serialization/JsonConverters/BoundingSphereConverter.cs.meta +11 -0
  487. package/Runtime/Core/Serialization/JsonConverters/BoundsConverter.cs +132 -0
  488. package/Runtime/Core/Serialization/JsonConverters/BoundsConverter.cs.meta +11 -0
  489. package/Runtime/Core/Serialization/JsonConverters/BoundsIntConverter.cs +135 -0
  490. package/Runtime/Core/Serialization/JsonConverters/BoundsIntConverter.cs.meta +11 -0
  491. package/Runtime/Core/Serialization/JsonConverters/Color32Converter.cs +98 -0
  492. package/Runtime/Core/Serialization/JsonConverters/Color32Converter.cs.meta +11 -0
  493. package/Runtime/Core/Serialization/JsonConverters/ColorBlockConverter.cs +123 -0
  494. package/Runtime/Core/Serialization/JsonConverters/ColorBlockConverter.cs.meta +11 -0
  495. package/Runtime/Core/Serialization/JsonConverters/ColorConverter.cs +88 -88
  496. package/Runtime/Core/Serialization/JsonConverters/ColorConverter.cs.meta +2 -2
  497. package/Runtime/Core/Serialization/JsonConverters/CyclicBufferConverterFactory.cs +112 -0
  498. package/Runtime/Core/Serialization/JsonConverters/CyclicBufferConverterFactory.cs.meta +11 -0
  499. package/Runtime/Core/Serialization/JsonConverters/DequeConverterFactory.cs +62 -0
  500. package/Runtime/Core/Serialization/JsonConverters/DequeConverterFactory.cs.meta +11 -0
  501. package/Runtime/Core/Serialization/JsonConverters/FastVector2IntConverter.cs +72 -0
  502. package/Runtime/Core/Serialization/JsonConverters/FastVector2IntConverter.cs.meta +11 -0
  503. package/Runtime/Core/Serialization/JsonConverters/FastVector3IntConverter.cs +80 -0
  504. package/Runtime/Core/Serialization/JsonConverters/FastVector3IntConverter.cs.meta +11 -0
  505. package/Runtime/Core/Serialization/JsonConverters/GameObjectConverter.cs +36 -36
  506. package/Runtime/Core/Serialization/JsonConverters/GameObjectConverter.cs.meta +2 -2
  507. package/Runtime/Core/Serialization/JsonConverters/GradientConverter.cs +245 -0
  508. package/Runtime/Core/Serialization/JsonConverters/GradientConverter.cs.meta +11 -0
  509. package/Runtime/Core/Serialization/JsonConverters/Hash128Converter.cs +92 -0
  510. package/Runtime/Core/Serialization/JsonConverters/Hash128Converter.cs.meta +11 -0
  511. package/Runtime/Core/Serialization/JsonConverters/ImmutableBitSetConverter.cs +119 -0
  512. package/Runtime/Core/Serialization/JsonConverters/ImmutableBitSetConverter.cs.meta +11 -0
  513. package/Runtime/Core/Serialization/JsonConverters/KVector2Converter.cs +72 -0
  514. package/Runtime/Core/Serialization/JsonConverters/KVector2Converter.cs.meta +11 -0
  515. package/Runtime/Core/Serialization/JsonConverters/LayerMaskConverter.cs +95 -0
  516. package/Runtime/Core/Serialization/JsonConverters/LayerMaskConverter.cs.meta +11 -0
  517. package/Runtime/Core/Serialization/JsonConverters/Matrix4x4Converter.cs +237 -218
  518. package/Runtime/Core/Serialization/JsonConverters/Matrix4x4Converter.cs.meta +2 -2
  519. package/Runtime/Core/Serialization/JsonConverters/MinMaxCurveConverter.cs +142 -0
  520. package/Runtime/Core/Serialization/JsonConverters/MinMaxCurveConverter.cs.meta +11 -0
  521. package/Runtime/Core/Serialization/JsonConverters/MinMaxGradientConverter.cs +135 -0
  522. package/Runtime/Core/Serialization/JsonConverters/MinMaxGradientConverter.cs.meta +11 -0
  523. package/Runtime/Core/Serialization/JsonConverters/PlaneConverter.cs +79 -0
  524. package/Runtime/Core/Serialization/JsonConverters/PlaneConverter.cs.meta +11 -0
  525. package/Runtime/Core/Serialization/JsonConverters/PoseConverter.cs +76 -0
  526. package/Runtime/Core/Serialization/JsonConverters/PoseConverter.cs.meta +11 -0
  527. package/Runtime/Core/Serialization/JsonConverters/QuaternionConverter.cs +88 -0
  528. package/Runtime/Core/Serialization/JsonConverters/QuaternionConverter.cs.meta +11 -0
  529. package/Runtime/Core/Serialization/JsonConverters/RangeConverterFactory.cs +106 -0
  530. package/Runtime/Core/Serialization/JsonConverters/RangeConverterFactory.cs.meta +11 -0
  531. package/Runtime/Core/Serialization/JsonConverters/RangeIntConverter.cs +71 -0
  532. package/Runtime/Core/Serialization/JsonConverters/RangeIntConverter.cs.meta +11 -0
  533. package/Runtime/Core/Serialization/JsonConverters/Ray2DConverter.cs +80 -0
  534. package/Runtime/Core/Serialization/JsonConverters/Ray2DConverter.cs.meta +11 -0
  535. package/Runtime/Core/Serialization/JsonConverters/RayConverter.cs +76 -0
  536. package/Runtime/Core/Serialization/JsonConverters/RayConverter.cs.meta +11 -0
  537. package/Runtime/Core/Serialization/JsonConverters/RaycastHitConverter.cs +115 -0
  538. package/Runtime/Core/Serialization/JsonConverters/RaycastHitConverter.cs.meta +11 -0
  539. package/Runtime/Core/Serialization/JsonConverters/RectConverter.cs +84 -0
  540. package/Runtime/Core/Serialization/JsonConverters/RectConverter.cs.meta +11 -0
  541. package/Runtime/Core/Serialization/JsonConverters/RectIntConverter.cs +88 -0
  542. package/Runtime/Core/Serialization/JsonConverters/RectIntConverter.cs.meta +11 -0
  543. package/Runtime/Core/Serialization/JsonConverters/RectOffsetConverter.cs +87 -0
  544. package/Runtime/Core/Serialization/JsonConverters/RectOffsetConverter.cs.meta +11 -0
  545. package/Runtime/Core/Serialization/JsonConverters/RenderTextureDescriptorConverter.cs +264 -0
  546. package/Runtime/Core/Serialization/JsonConverters/RenderTextureDescriptorConverter.cs.meta +11 -0
  547. package/Runtime/Core/Serialization/JsonConverters/ResolutionConverter.cs +158 -0
  548. package/Runtime/Core/Serialization/JsonConverters/ResolutionConverter.cs.meta +11 -0
  549. package/Runtime/Core/Serialization/JsonConverters/SceneConverter.cs +103 -0
  550. package/Runtime/Core/Serialization/JsonConverters/SceneConverter.cs.meta +11 -0
  551. package/Runtime/Core/Serialization/JsonConverters/SphericalHarmonicsL2Converter.cs +121 -0
  552. package/Runtime/Core/Serialization/JsonConverters/SphericalHarmonicsL2Converter.cs.meta +11 -0
  553. package/Runtime/Core/Serialization/JsonConverters/TouchConverter.cs +54 -0
  554. package/Runtime/Core/Serialization/JsonConverters/TouchConverter.cs.meta +11 -0
  555. package/Runtime/Core/Serialization/JsonConverters/TypeConverter.cs +30 -28
  556. package/Runtime/Core/Serialization/JsonConverters/TypeConverter.cs.meta +2 -2
  557. package/Runtime/Core/Serialization/JsonConverters/Vector2Converter.cs +72 -74
  558. package/Runtime/Core/Serialization/JsonConverters/Vector2Converter.cs.meta +11 -11
  559. package/Runtime/Core/Serialization/JsonConverters/Vector2IntConverter.cs +72 -0
  560. package/Runtime/Core/Serialization/JsonConverters/Vector2IntConverter.cs.meta +11 -0
  561. package/Runtime/Core/Serialization/JsonConverters/Vector3Converter.cs +80 -81
  562. package/Runtime/Core/Serialization/JsonConverters/Vector3Converter.cs.meta +11 -11
  563. package/Runtime/Core/Serialization/JsonConverters/Vector3IntConverter.cs +80 -0
  564. package/Runtime/Core/Serialization/JsonConverters/Vector3IntConverter.cs.meta +11 -0
  565. package/Runtime/Core/Serialization/JsonConverters/Vector4Converter.cs +88 -88
  566. package/Runtime/Core/Serialization/JsonConverters/Vector4Converter.cs.meta +2 -2
  567. package/Runtime/Core/Serialization/JsonConverters.meta +8 -8
  568. package/Runtime/Core/Serialization/ProtobufUnitySurrogates.cs +383 -0
  569. package/Runtime/Core/Serialization/ProtobufUnitySurrogates.cs.meta +11 -0
  570. package/Runtime/Core/Serialization/Serializer.cs +2020 -195
  571. package/Runtime/Core/Serialization/Serializer.cs.meta +11 -11
  572. package/Runtime/Core/Serialization.meta +8 -8
  573. package/Runtime/Core/Threading/SingleThreadedThreadPool.cs +228 -228
  574. package/Runtime/Core/Threading/SingleThreadedThreadPool.cs.meta +11 -11
  575. package/Runtime/Core/Threading.meta +8 -8
  576. package/Runtime/Core.meta +8 -8
  577. package/Runtime/Integrations/VContainer/ObjectResolverRelationalExtensions.cs +185 -0
  578. package/Runtime/Integrations/VContainer/ObjectResolverRelationalExtensions.cs.meta +11 -0
  579. package/Runtime/Integrations/VContainer/RelationalComponentEntryPoint.cs +109 -0
  580. package/Runtime/Integrations/VContainer/RelationalComponentEntryPoint.cs.meta +11 -0
  581. package/Runtime/Integrations/VContainer/RelationalComponentsBuilderExtensions.cs +78 -0
  582. package/Runtime/Integrations/VContainer/RelationalComponentsBuilderExtensions.cs.meta +11 -0
  583. package/Runtime/Integrations/VContainer/RelationalSceneAssignmentOptions.cs +83 -0
  584. package/Runtime/Integrations/VContainer/RelationalSceneAssignmentOptions.cs.meta +11 -0
  585. package/Runtime/Integrations/VContainer/WallstopStudios.UnityHelpers.Integration.VContainer.asmdef +30 -0
  586. package/Runtime/Integrations/VContainer/WallstopStudios.UnityHelpers.Integration.VContainer.asmdef.meta +7 -0
  587. package/Runtime/Integrations/VContainer.meta +8 -0
  588. package/Runtime/Integrations/Zenject/DiContainerRelationalExtensions.cs +180 -0
  589. package/Runtime/Integrations/Zenject/DiContainerRelationalExtensions.cs.meta +11 -0
  590. package/Runtime/Integrations/Zenject/RelationalComponentSceneInitializer.cs +105 -0
  591. package/Runtime/Integrations/Zenject/RelationalComponentSceneInitializer.cs.meta +11 -0
  592. package/Runtime/Integrations/Zenject/RelationalComponentsInstaller.cs +72 -0
  593. package/Runtime/Integrations/Zenject/RelationalComponentsInstaller.cs.meta +11 -0
  594. package/Runtime/Integrations/Zenject/RelationalSceneAssignmentOptions.cs +87 -0
  595. package/Runtime/Integrations/Zenject/RelationalSceneAssignmentOptions.cs.meta +11 -0
  596. package/Runtime/Integrations/Zenject/WallstopStudios.UnityHelpers.Integration.Zenject.asmdef +30 -0
  597. package/Runtime/Integrations/Zenject/WallstopStudios.UnityHelpers.Integration.Zenject.asmdef.meta +7 -0
  598. package/Runtime/Integrations/Zenject.meta +8 -0
  599. package/Runtime/Integrations.meta +8 -0
  600. package/Runtime/Protobuf-Net/System.Collections.Immutable.dll.meta +33 -33
  601. package/Runtime/Protobuf-Net/System.Runtime.CompilerServices.Unsafe.dll.meta +33 -33
  602. package/Runtime/Protobuf-Net/protobuf-net.Core.dll.meta +33 -33
  603. package/Runtime/Protobuf-Net/protobuf-net.dll.meta +33 -33
  604. package/Runtime/Protobuf-Net.meta +8 -8
  605. package/Runtime/Tags/AlwaysIncludeInAttributeMetadataCacheAttribute.cs +11 -0
  606. package/Runtime/Tags/AlwaysIncludeInAttributeMetadataCacheAttribute.cs.meta +11 -0
  607. package/Runtime/Tags/Attribute.cs +399 -205
  608. package/Runtime/Tags/Attribute.cs.meta +2 -2
  609. package/Runtime/Tags/AttributeEffect.cs +372 -281
  610. package/Runtime/Tags/AttributeEffect.cs.meta +2 -2
  611. package/Runtime/Tags/AttributeMetadataCache.cs +503 -0
  612. package/Runtime/Tags/AttributeMetadataCache.cs.meta +11 -0
  613. package/Runtime/Tags/AttributeMetadataFilters.cs +108 -0
  614. package/Runtime/Tags/AttributeMetadataFilters.cs.meta +11 -0
  615. package/Runtime/Tags/AttributeModification.cs +132 -48
  616. package/Runtime/Tags/AttributeModification.cs.meta +2 -2
  617. package/Runtime/Tags/AttributeUtilities.cs +376 -209
  618. package/Runtime/Tags/AttributeUtilities.cs.meta +2 -2
  619. package/Runtime/Tags/AttributesComponent.cs +237 -163
  620. package/Runtime/Tags/AttributesComponent.cs.meta +2 -2
  621. package/Runtime/Tags/CollisionSenses.cs +117 -91
  622. package/Runtime/Tags/CollisionSenses.cs.meta +2 -2
  623. package/Runtime/Tags/CosmeticEffectComponent.cs +112 -50
  624. package/Runtime/Tags/CosmeticEffectComponent.cs.meta +2 -2
  625. package/Runtime/Tags/CosmeticEffectData.cs +109 -63
  626. package/Runtime/Tags/CosmeticEffectData.cs.meta +2 -2
  627. package/Runtime/Tags/EffectHandle.cs +150 -65
  628. package/Runtime/Tags/EffectHandle.cs.meta +2 -2
  629. package/Runtime/Tags/EffectHandler.cs +470 -393
  630. package/Runtime/Tags/EffectHandler.cs.meta +2 -2
  631. package/Runtime/Tags/ModificationAction.cs +60 -9
  632. package/Runtime/Tags/ModificationAction.cs.meta +2 -2
  633. package/Runtime/Tags/ModifierDurationType.cs +71 -13
  634. package/Runtime/Tags/ModifierDurationType.cs.meta +2 -2
  635. package/Runtime/Tags/TagHandler.cs +373 -158
  636. package/Runtime/Tags/TagHandler.cs.meta +2 -2
  637. package/Runtime/Tags.meta +2 -2
  638. package/Runtime/Utils/AnimationEventEqualityComparer.cs +198 -161
  639. package/Runtime/Utils/AnimationEventEqualityComparer.cs.meta +11 -11
  640. package/Runtime/Utils/AnimatorEnumStateMachine.cs +110 -88
  641. package/Runtime/Utils/AnimatorEnumStateMachine.cs.meta +11 -11
  642. package/Runtime/Utils/Ascii85.cs +132 -115
  643. package/Runtime/Utils/Ascii85.cs.meta +2 -2
  644. package/Runtime/Utils/Buffers.cs +1151 -550
  645. package/Runtime/Utils/Buffers.cs.meta +11 -11
  646. package/Runtime/Utils/CenterPointOffset.cs +35 -30
  647. package/Runtime/Utils/CenterPointOffset.cs.meta +2 -2
  648. package/Runtime/Utils/ChildSpawner.cs +250 -157
  649. package/Runtime/Utils/ChildSpawner.cs.meta +2 -2
  650. package/Runtime/Utils/CircleLineRenderer.cs +142 -142
  651. package/Runtime/Utils/CircleLineRenderer.cs.meta +11 -11
  652. package/Runtime/Utils/CollisionProxy.cs +48 -48
  653. package/Runtime/Utils/CollisionProxy.cs.meta +2 -2
  654. package/Runtime/Utils/CoroutineHandler.cs +4 -4
  655. package/Runtime/Utils/CoroutineHandler.cs.meta +2 -2
  656. package/Runtime/Utils/DeferredDisposalResult.cs +20 -23
  657. package/Runtime/Utils/DeferredDisposalResult.cs.meta +2 -2
  658. package/Runtime/Utils/LZMA.cs +276 -53
  659. package/Runtime/Utils/LZMA.cs.meta +2 -2
  660. package/Runtime/Utils/MatchColliderToSprite.cs +104 -104
  661. package/Runtime/Utils/MatchColliderToSprite.cs.meta +2 -2
  662. package/Runtime/Utils/MatchTransform.cs +99 -82
  663. package/Runtime/Utils/MatchTransform.cs.meta +2 -2
  664. package/Runtime/Utils/Oscillator.cs +27 -27
  665. package/Runtime/Utils/Oscillator.cs.meta +11 -11
  666. package/Runtime/Utils/PolygonCollider2DOptimizer.cs +104 -83
  667. package/Runtime/Utils/PolygonCollider2DOptimizer.cs.meta +2 -2
  668. package/Runtime/Utils/RuntimeSingleton.cs +139 -88
  669. package/Runtime/Utils/RuntimeSingleton.cs.meta +11 -11
  670. package/Runtime/Utils/ScriptableObjectSingleton.cs +226 -85
  671. package/Runtime/Utils/ScriptableObjectSingleton.cs.meta +2 -2
  672. package/Runtime/Utils/SerializedStringComparer.cs +107 -107
  673. package/Runtime/Utils/SerializedStringComparer.cs.meta +2 -2
  674. package/Runtime/Utils/SetTextureImportData.cs +69 -69
  675. package/Runtime/Utils/SetTextureImportData.cs.meta +11 -11
  676. package/Runtime/Utils/SevenZip/Common/CRC.cs +70 -70
  677. package/Runtime/Utils/SevenZip/Common/CRC.cs.meta +11 -11
  678. package/Runtime/Utils/SevenZip/Common/InBuffer.cs +84 -84
  679. package/Runtime/Utils/SevenZip/Common/InBuffer.cs.meta +11 -11
  680. package/Runtime/Utils/SevenZip/Common/OutBuffer.cs +70 -70
  681. package/Runtime/Utils/SevenZip/Common/OutBuffer.cs.meta +11 -11
  682. package/Runtime/Utils/SevenZip/Common.meta +2 -2
  683. package/Runtime/Utils/SevenZip/Compress/LZ/IMatchFinder.cs +28 -28
  684. package/Runtime/Utils/SevenZip/Compress/LZ/IMatchFinder.cs.meta +11 -11
  685. package/Runtime/Utils/SevenZip/Compress/LZ/LzBinTree.cs +454 -454
  686. package/Runtime/Utils/SevenZip/Compress/LZ/LzBinTree.cs.meta +11 -11
  687. package/Runtime/Utils/SevenZip/Compress/LZ/LzInWindow.cs +179 -179
  688. package/Runtime/Utils/SevenZip/Compress/LZ/LzInWindow.cs.meta +11 -11
  689. package/Runtime/Utils/SevenZip/Compress/LZ/LzOutWindow.cs +137 -137
  690. package/Runtime/Utils/SevenZip/Compress/LZ/LzOutWindow.cs.meta +11 -11
  691. package/Runtime/Utils/SevenZip/Compress/LZ.meta +8 -8
  692. package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaBase.cs +110 -110
  693. package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaBase.cs.meta +11 -11
  694. package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaDecoder.cs +525 -527
  695. package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaDecoder.cs.meta +11 -11
  696. package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaEncoder.cs +1891 -1904
  697. package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaEncoder.cs.meta +11 -11
  698. package/Runtime/Utils/SevenZip/Compress/LZMA.meta +8 -8
  699. package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoder.cs +242 -242
  700. package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoder.cs.meta +11 -11
  701. package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBit.cs +146 -149
  702. package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBit.cs.meta +11 -11
  703. package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBitTree.cs +177 -177
  704. package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBitTree.cs.meta +11 -11
  705. package/Runtime/Utils/SevenZip/Compress/RangeCoder.meta +8 -8
  706. package/Runtime/Utils/SevenZip/Compress.meta +8 -8
  707. package/Runtime/Utils/SevenZip/ICoder.cs +177 -177
  708. package/Runtime/Utils/SevenZip/ICoder.cs.meta +11 -11
  709. package/Runtime/Utils/SevenZip.meta +2 -2
  710. package/Runtime/Utils/SpriteRendererMetadata.cs +346 -370
  711. package/Runtime/Utils/SpriteRendererMetadata.cs.meta +2 -2
  712. package/Runtime/Utils/SpriteRendererSyncer.cs +100 -100
  713. package/Runtime/Utils/SpriteRendererSyncer.cs.meta +2 -2
  714. package/Runtime/Utils/StartTracker.cs +15 -15
  715. package/Runtime/Utils/StartTracker.cs.meta +2 -2
  716. package/Runtime/Utils/TextureScale.cs +356 -179
  717. package/Runtime/Utils/TextureScale.cs.meta +2 -2
  718. package/Runtime/Utils/TypeNameSorter.cs +17 -17
  719. package/Runtime/Utils/TypeNameSorter.cs.meta +2 -2
  720. package/Runtime/Utils/UnityObjectNameComparer.cs +89 -89
  721. package/Runtime/Utils/UnityObjectNameComparer.cs.meta +2 -2
  722. package/Runtime/Utils.meta +8 -8
  723. package/Runtime/Visuals/AnimatedSpriteLayer.cs +217 -130
  724. package/Runtime/Visuals/AnimatedSpriteLayer.cs.meta +2 -2
  725. package/Runtime/Visuals/UGUI/EnhancedImage.cs +218 -85
  726. package/Runtime/Visuals/UGUI/EnhancedImage.cs.meta +2 -2
  727. package/Runtime/Visuals/UGUI.meta +2 -2
  728. package/Runtime/Visuals/UIToolkit/LayeredImage.cs +781 -484
  729. package/Runtime/Visuals/UIToolkit/LayeredImage.cs.meta +2 -2
  730. package/Runtime/Visuals/UIToolkit/MultiFileSelectorElement.cs +945 -322
  731. package/Runtime/Visuals/UIToolkit/MultiFileSelectorElement.cs.meta +2 -2
  732. package/Runtime/Visuals/UIToolkit.meta +2 -2
  733. package/Runtime/Visuals.meta +2 -2
  734. package/Runtime/WallstopStudios.UnityHelpers.asmdef +22 -14
  735. package/Runtime/WallstopStudios.UnityHelpers.asmdef.meta +7 -7
  736. package/Runtime.meta +8 -8
  737. package/SERIALIZATION.md +648 -0
  738. package/SERIALIZATION.md.meta +7 -0
  739. package/SINGLETONS.md +427 -0
  740. package/SINGLETONS.md.meta +7 -0
  741. package/SPATIAL_TREES_2D_GUIDE.md +261 -0
  742. package/SPATIAL_TREES_2D_GUIDE.md.meta +7 -0
  743. package/SPATIAL_TREES_3D_GUIDE.md +214 -0
  744. package/SPATIAL_TREES_3D_GUIDE.md.meta +7 -0
  745. package/SPATIAL_TREE_2D_PERFORMANCE.md +238 -0
  746. package/SPATIAL_TREE_2D_PERFORMANCE.md.meta +7 -0
  747. package/SPATIAL_TREE_3D_PERFORMANCE.md +240 -0
  748. package/SPATIAL_TREE_3D_PERFORMANCE.md.meta +7 -0
  749. package/SPATIAL_TREE_SEMANTICS.md +106 -0
  750. package/SPATIAL_TREE_SEMANTICS.md.meta +7 -0
  751. package/Samples~/DI - VContainer/Prefabs/RelationalConsumer.prefab +77 -0
  752. package/Samples~/DI - VContainer/Prefabs/RelationalConsumer.prefab.meta +8 -0
  753. package/Samples~/DI - VContainer/Prefabs/Spawner.prefab +47 -0
  754. package/Samples~/DI - VContainer/Prefabs/Spawner.prefab.meta +8 -0
  755. package/Samples~/DI - VContainer/Prefabs.meta +9 -0
  756. package/Samples~/DI - VContainer/README.md +334 -0
  757. package/Samples~/DI - VContainer/README.md.meta +8 -0
  758. package/Samples~/DI - VContainer/Scenes/VContainer_Sample.unity +120 -0
  759. package/Samples~/DI - VContainer/Scenes/VContainer_Sample.unity.meta +8 -0
  760. package/Samples~/DI - VContainer/Scenes.meta +9 -0
  761. package/Samples~/DI - VContainer/Scripts/GameLifetimeScope.cs +24 -0
  762. package/Samples~/DI - VContainer/Scripts/GameLifetimeScope.cs.meta +12 -0
  763. package/Samples~/DI - VContainer/Scripts/RelationalConsumer.cs +21 -0
  764. package/Samples~/DI - VContainer/Scripts/RelationalConsumer.cs.meta +12 -0
  765. package/Samples~/DI - VContainer/Scripts/Samples.UnityHelpers.DI.VContainer.asmdef +37 -0
  766. package/Samples~/DI - VContainer/Scripts/Samples.UnityHelpers.DI.VContainer.asmdef.meta +8 -0
  767. package/Samples~/DI - VContainer/Scripts/Spawner.cs +21 -0
  768. package/Samples~/DI - VContainer/Scripts/Spawner.cs.meta +12 -0
  769. package/Samples~/DI - VContainer/Scripts.meta +9 -0
  770. package/Samples~/DI - VContainer.meta +9 -0
  771. package/Samples~/DI - Zenject/Prefabs/RelationalConsumer.prefab +77 -0
  772. package/Samples~/DI - Zenject/Prefabs/RelationalConsumer.prefab.meta +8 -0
  773. package/Samples~/DI - Zenject/Prefabs/SpawnerZenject.prefab +47 -0
  774. package/Samples~/DI - Zenject/Prefabs/SpawnerZenject.prefab.meta +8 -0
  775. package/Samples~/DI - Zenject/Prefabs.meta +9 -0
  776. package/Samples~/DI - Zenject/README.md +389 -0
  777. package/Samples~/DI - Zenject/README.md.meta +7 -0
  778. package/Samples~/DI - Zenject/Scenes/Zenject_Sample.unity +164 -0
  779. package/Samples~/DI - Zenject/Scenes/Zenject_Sample.unity.meta +8 -0
  780. package/Samples~/DI - Zenject/Scenes.meta +9 -0
  781. package/Samples~/DI - Zenject/Scripts/RelationalConsumer.cs +19 -0
  782. package/Samples~/DI - Zenject/Scripts/RelationalConsumer.cs.meta +12 -0
  783. package/Samples~/DI - Zenject/Scripts/Samples.UnityHelpers.DI.Zenject.asmdef +36 -0
  784. package/Samples~/DI - Zenject/Scripts/Samples.UnityHelpers.DI.Zenject.asmdef.meta +8 -0
  785. package/Samples~/DI - Zenject/Scripts/SceneContextPlaceholder.cs +47 -0
  786. package/Samples~/DI - Zenject/Scripts/SceneContextPlaceholder.cs.meta +12 -0
  787. package/Samples~/DI - Zenject/Scripts/SpawnerZenject.cs +20 -0
  788. package/Samples~/DI - Zenject/Scripts/SpawnerZenject.cs.meta +12 -0
  789. package/Samples~/DI - Zenject/Scripts.meta +9 -0
  790. package/Samples~/DI - Zenject.meta +9 -0
  791. package/Samples~/Random - PRNG/README.md +12 -0
  792. package/Samples~/Random - PRNG/README.md.meta +8 -0
  793. package/Samples~/Random - PRNG/Scripts/RandomPrngDemo.cs +28 -0
  794. package/Samples~/Random - PRNG/Scripts/RandomPrngDemo.cs.meta +12 -0
  795. package/Samples~/Random - PRNG/Scripts/Samples.UnityHelpers.Random.Prng.asmdef +17 -0
  796. package/Samples~/Random - PRNG/Scripts/Samples.UnityHelpers.Random.Prng.asmdef.meta +8 -0
  797. package/Samples~/Random - PRNG/Scripts.meta +9 -0
  798. package/Samples~/Random - PRNG.meta +9 -0
  799. package/Samples~/Relational Components - Basic/README.md +19 -0
  800. package/Samples~/Relational Components - Basic/README.md.meta +8 -0
  801. package/Samples~/Relational Components - Basic/Scripts/RelationalBasicConsumer.cs +37 -0
  802. package/Samples~/Relational Components - Basic/Scripts/RelationalBasicConsumer.cs.meta +12 -0
  803. package/Samples~/Relational Components - Basic/Scripts/Samples.UnityHelpers.Relational.Basic.asmdef +17 -0
  804. package/Samples~/Relational Components - Basic/Scripts/Samples.UnityHelpers.Relational.Basic.asmdef.meta +8 -0
  805. package/Samples~/Relational Components - Basic/Scripts.meta +9 -0
  806. package/Samples~/Relational Components - Basic.meta +9 -0
  807. package/Samples~/Serialization - JSON/README.md +13 -0
  808. package/Samples~/Serialization - JSON/README.md.meta +8 -0
  809. package/Samples~/Serialization - JSON/Scripts/JsonSerializationDemo.cs +50 -0
  810. package/Samples~/Serialization - JSON/Scripts/JsonSerializationDemo.cs.meta +12 -0
  811. package/Samples~/Serialization - JSON/Scripts/Samples.UnityHelpers.Serialization.Json.asmdef +17 -0
  812. package/Samples~/Serialization - JSON/Scripts/Samples.UnityHelpers.Serialization.Json.asmdef.meta +8 -0
  813. package/Samples~/Serialization - JSON/Scripts.meta +9 -0
  814. package/Samples~/Serialization - JSON.meta +9 -0
  815. package/Samples~/Spatial Structures - 2D and 3D/README.md +13 -0
  816. package/Samples~/Spatial Structures - 2D and 3D/README.md.meta +8 -0
  817. package/Samples~/Spatial Structures - 2D and 3D/Scripts/Samples.UnityHelpers.SpatialStructures.asmdef +17 -0
  818. package/Samples~/Spatial Structures - 2D and 3D/Scripts/Samples.UnityHelpers.SpatialStructures.asmdef.meta +8 -0
  819. package/Samples~/Spatial Structures - 2D and 3D/Scripts/SpatialStructuresDemo.cs +62 -0
  820. package/Samples~/Spatial Structures - 2D and 3D/Scripts/SpatialStructuresDemo.cs.meta +12 -0
  821. package/Samples~/Spatial Structures - 2D and 3D/Scripts.meta +9 -0
  822. package/Samples~/Spatial Structures - 2D and 3D.meta +9 -0
  823. package/Samples~/UGUI - EnhancedImage/README.md +12 -0
  824. package/Samples~/UGUI - EnhancedImage/README.md.meta +8 -0
  825. package/Samples~/UGUI - EnhancedImage/Scripts/EnhancedImageDemo.cs +36 -0
  826. package/Samples~/UGUI - EnhancedImage/Scripts/EnhancedImageDemo.cs.meta +12 -0
  827. package/Samples~/UGUI - EnhancedImage/Scripts/Samples.UnityHelpers.UGUI.EnhancedImage.asmdef +17 -0
  828. package/Samples~/UGUI - EnhancedImage/Scripts/Samples.UnityHelpers.UGUI.EnhancedImage.asmdef.meta +8 -0
  829. package/Samples~/UGUI - EnhancedImage/Scripts.meta +9 -0
  830. package/Samples~/UGUI - EnhancedImage.meta +9 -0
  831. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/README.md +12 -0
  832. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/README.md.meta +8 -0
  833. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor/MultiFileSelectorSampleWindow.cs +45 -0
  834. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor/MultiFileSelectorSampleWindow.cs.meta +12 -0
  835. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor/Samples.UnityHelpers.UIToolkit.Editor.asmdef +19 -0
  836. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor/Samples.UnityHelpers.UIToolkit.Editor.asmdef.meta +8 -0
  837. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor.meta +9 -0
  838. package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts.meta +9 -0
  839. package/Samples~/UI Toolkit - MultiFile Selector (Editor).meta +9 -0
  840. package/Shaders/Materials/BackgroundMask-Material.mat +59 -59
  841. package/Shaders/Materials/BackgroundMask-Material.mat.meta +8 -8
  842. package/Shaders/Materials.meta +8 -8
  843. package/Shaders/ShaderGraph/BackgroundMask.shadergraph +1653 -1653
  844. package/Shaders/ShaderGraph/BackgroundMask.shadergraph.meta +10 -10
  845. package/Shaders/ShaderGraph/DebugDisplayValue.shadersubgraph +835 -835
  846. package/Shaders/ShaderGraph/DebugDisplayValue.shadersubgraph.meta +10 -10
  847. package/Shaders/ShaderGraph.meta +8 -8
  848. package/Shaders/Support/EnhancedImageSupport.shader +64 -0
  849. package/Shaders/Support/EnhancedImageSupport.shader.meta +9 -0
  850. package/Shaders/Support.meta +8 -0
  851. package/Shaders.meta +8 -8
  852. package/Styles/Elements/Progress/ArcedProgressBar.cs +345 -345
  853. package/Styles/Elements/Progress/ArcedProgressBar.cs.meta +2 -2
  854. package/Styles/Elements/Progress/CircularProgressBar.cs +307 -307
  855. package/Styles/Elements/Progress/CircularProgressBar.cs.meta +2 -2
  856. package/Styles/Elements/Progress/GlitchProgressBar.cs +416 -416
  857. package/Styles/Elements/Progress/GlitchProgressBar.cs.meta +2 -2
  858. package/Styles/Elements/Progress/LiquidProgressBar.cs +632 -632
  859. package/Styles/Elements/Progress/LiquidProgressBar.cs.meta +2 -2
  860. package/Styles/Elements/Progress/MarchingAntsProgressBar.cs +722 -722
  861. package/Styles/Elements/Progress/MarchingAntsProgressBar.cs.meta +2 -2
  862. package/Styles/Elements/Progress/RegularProgressBar.cs +405 -405
  863. package/Styles/Elements/Progress/RegularProgressBar.cs.meta +2 -2
  864. package/Styles/Elements/Progress/WigglyProgressBar.cs +837 -837
  865. package/Styles/Elements/Progress/WigglyProgressBar.cs.meta +2 -2
  866. package/Styles/Elements/Progress.meta +2 -2
  867. package/Styles/Elements.meta +2 -2
  868. package/Styles/USS/ArcedProgressBar.uss +18 -18
  869. package/Styles/USS/ArcedProgressBar.uss.meta +2 -2
  870. package/Styles/USS/CirclularProgressBar.uss +17 -17
  871. package/Styles/USS/CirclularProgressBar.uss.meta +2 -2
  872. package/Styles/USS/RegularProgressBar.uss +32 -32
  873. package/Styles/USS/RegularProgressBar.uss.meta +2 -2
  874. package/Styles/USS/WigglyProgressBar.uss +16 -16
  875. package/Styles/USS/WigglyProgressBar.uss.meta +2 -2
  876. package/Styles/USS.meta +2 -2
  877. package/Styles/WallstopStudios.UnityHelpers.Styles.asmdef +14 -17
  878. package/Styles/WallstopStudios.UnityHelpers.Styles.asmdef.meta +7 -7
  879. package/Styles.meta +2 -2
  880. package/THIRD_PARTY_NOTICES.md +74 -0
  881. package/THIRD_PARTY_NOTICES.md.meta +7 -0
  882. package/Tests/Editor/Attributes/AnimationEventHelpersTests.cs +155 -0
  883. package/Tests/Editor/Attributes/AnimationEventHelpersTests.cs.meta +11 -0
  884. package/Tests/Editor/Attributes.meta +8 -0
  885. package/Tests/Editor/Core/Attributes/RelationalComponentAssignerTests.cs +118 -0
  886. package/Tests/Editor/Core/Attributes/RelationalComponentAssignerTests.cs.meta +11 -0
  887. package/Tests/Editor/Core/Attributes.meta +8 -0
  888. package/Tests/Editor/Core.meta +8 -0
  889. package/Tests/Editor/Extensions/SerializedPropertyExtensionsTests.cs +194 -0
  890. package/Tests/Editor/Extensions/SerializedPropertyExtensionsTests.cs.meta +3 -0
  891. package/Tests/Editor/Extensions.meta +3 -0
  892. package/Tests/Editor/Helper/DummyScriptableObject.cs +6 -0
  893. package/Tests/Editor/Helper/DummyScriptableObject.cs.meta +3 -0
  894. package/Tests/Editor/Helper/HelpersTests.cs +101 -0
  895. package/Tests/Editor/Helper/HelpersTests.cs.meta +3 -0
  896. package/Tests/Editor/Helper/ObjectHelpersEditorTests.cs +63 -0
  897. package/Tests/Editor/Helper/ObjectHelpersEditorTests.cs.meta +11 -0
  898. package/Tests/Editor/Helper/PromptScope.cs +28 -0
  899. package/Tests/Editor/Helper/PromptScope.cs.meta +11 -0
  900. package/Tests/Editor/Helper/ReflectionHelpersEditorTests.cs +105 -0
  901. package/Tests/Editor/Helper/ReflectionHelpersEditorTests.cs.meta +11 -0
  902. package/Tests/Editor/Helper/SpriteHelpersTests.cs +334 -0
  903. package/Tests/Editor/Helper/SpriteHelpersTests.cs.meta +3 -0
  904. package/Tests/Editor/Helper/SpriteSettingsApplierAdditionalTests.cs +183 -0
  905. package/Tests/Editor/Helper/SpriteSettingsApplierAdditionalTests.cs.meta +11 -0
  906. package/Tests/Editor/Helper/SpriteSettingsApplierTests.cs +161 -0
  907. package/Tests/Editor/Helper/SpriteSettingsApplierTests.cs.meta +11 -0
  908. package/Tests/Editor/Helper.meta +3 -0
  909. package/Tests/Editor/Integrations/VContainer/VContainerIntegrationCompilationTests.cs +40 -0
  910. package/Tests/Editor/Integrations/VContainer/VContainerIntegrationCompilationTests.cs.meta +11 -0
  911. package/Tests/Editor/Integrations/VContainer/VContainerRelationalEntryPointTests.cs +77 -0
  912. package/Tests/Editor/Integrations/VContainer/VContainerRelationalEntryPointTests.cs.meta +11 -0
  913. package/Tests/Editor/Integrations/VContainer/WallstopStudios.UnityHelpers.Tests.Editor.VContainer.asmdef +36 -0
  914. package/Tests/Editor/Integrations/VContainer/WallstopStudios.UnityHelpers.Tests.Editor.VContainer.asmdef.meta +7 -0
  915. package/Tests/Editor/Integrations/VContainer.meta +8 -0
  916. package/Tests/Editor/Integrations/Zenject/WallstopStudios.UnityHelpers.Tests.Editor.Zenject.asmdef +36 -0
  917. package/Tests/Editor/Integrations/Zenject/WallstopStudios.UnityHelpers.Tests.Editor.Zenject.asmdef.meta +7 -0
  918. package/Tests/Editor/Integrations/Zenject/ZenjectIntegrationCompilationTests.cs +40 -0
  919. package/Tests/Editor/Integrations/Zenject/ZenjectIntegrationCompilationTests.cs.meta +11 -0
  920. package/Tests/Editor/Integrations/Zenject/ZenjectRelationalInitializerTests.cs +76 -0
  921. package/Tests/Editor/Integrations/Zenject/ZenjectRelationalInitializerTests.cs.meta +11 -0
  922. package/Tests/Editor/Integrations/Zenject.meta +8 -0
  923. package/Tests/Editor/Integrations.meta +8 -0
  924. package/Tests/Editor/MultiFileSelectorElementTests.cs +265 -0
  925. package/Tests/Editor/MultiFileSelectorElementTests.cs.meta +11 -0
  926. package/Tests/Editor/MultiFileSelectorPersistenceManagerTests.cs +100 -0
  927. package/Tests/Editor/MultiFileSelectorPersistenceManagerTests.cs.meta +11 -0
  928. package/Tests/Editor/Sprites/AnimationCopierWindowTests.cs +199 -0
  929. package/Tests/Editor/Sprites/AnimationCopierWindowTests.cs.meta +11 -0
  930. package/Tests/Editor/Sprites/ScriptableSpriteAtlasEditorTests.cs +108 -0
  931. package/Tests/Editor/Sprites/ScriptableSpriteAtlasEditorTests.cs.meta +11 -0
  932. package/Tests/Editor/Sprites/SpriteCropperAdditionalTests.cs +323 -0
  933. package/Tests/Editor/Sprites/SpriteCropperAdditionalTests.cs.meta +11 -0
  934. package/Tests/Editor/Sprites/SpriteCropperTests.cs +162 -0
  935. package/Tests/Editor/Sprites/SpriteCropperTests.cs.meta +11 -0
  936. package/Tests/Editor/Sprites/SpritePivotAdjusterAdditionalTests.cs +227 -0
  937. package/Tests/Editor/Sprites/SpritePivotAdjusterAdditionalTests.cs.meta +11 -0
  938. package/Tests/Editor/Sprites/SpritePivotAdjusterTests.cs +113 -0
  939. package/Tests/Editor/Sprites/SpritePivotAdjusterTests.cs.meta +11 -0
  940. package/Tests/Editor/Sprites/TexturePlatformNameHelperTests.cs +28 -0
  941. package/Tests/Editor/Sprites/TexturePlatformNameHelperTests.cs.meta +11 -0
  942. package/Tests/Editor/Sprites/TextureResizerWizardTests.cs +248 -0
  943. package/Tests/Editor/Sprites/TextureResizerWizardTests.cs.meta +11 -0
  944. package/Tests/Editor/Sprites/TextureSettingsApplierAPITests.cs +180 -0
  945. package/Tests/Editor/Sprites/TextureSettingsApplierAPITests.cs.meta +11 -0
  946. package/Tests/Editor/Sprites/TextureSettingsApplierWizardAdditionalTests.cs +295 -0
  947. package/Tests/Editor/Sprites/TextureSettingsApplierWizardAdditionalTests.cs.meta +11 -0
  948. package/Tests/Editor/Sprites/TextureSettingsApplierWizardTests.cs +134 -0
  949. package/Tests/Editor/Sprites/TextureSettingsApplierWizardTests.cs.meta +11 -0
  950. package/Tests/Editor/Sprites.meta +8 -0
  951. package/Tests/Editor/TestComponents/PrewarmTesterComponent.cs +10 -0
  952. package/Tests/Editor/TestComponents/PrewarmTesterComponent.cs.meta +11 -0
  953. package/Tests/Editor/TestComponents.meta +8 -0
  954. package/Tests/Editor/Tools/ImageBlurToolTests.cs +135 -0
  955. package/Tests/Editor/Tools/ImageBlurToolTests.cs.meta +11 -0
  956. package/Tests/Editor/Tools.meta +8 -0
  957. package/Tests/Editor/Utils/CommonTestBase.cs +208 -0
  958. package/Tests/Editor/Utils/CommonTestBase.cs.meta +11 -0
  959. package/Tests/Editor/Utils/ScriptableObjectSingletonCreatorEditorTests.cs +306 -0
  960. package/Tests/Editor/Utils/ScriptableObjectSingletonCreatorEditorTests.cs.meta +9 -0
  961. package/Tests/Editor/Utils/ScriptableObjectSingletonCreatorTests.cs +183 -0
  962. package/Tests/Editor/Utils/ScriptableObjectSingletonCreatorTests.cs.meta +11 -0
  963. package/Tests/Editor/Utils/ScriptableObjectSingletonTests.cs +466 -0
  964. package/Tests/Editor/Utils/ScriptableObjectSingletonTests.cs.meta +11 -0
  965. package/Tests/Editor/Utils.meta +3 -0
  966. package/Tests/Editor/WallstopStudios.UnityHelpers.Tests.Editor.asmdef +19 -0
  967. package/Tests/Editor/WallstopStudios.UnityHelpers.Tests.Editor.asmdef.meta +7 -0
  968. package/Tests/Editor/Windows/FitTextureSizeWindowTests.cs +781 -0
  969. package/Tests/Editor/Windows/FitTextureSizeWindowTests.cs.meta +11 -0
  970. package/Tests/Editor/Windows/PrefabCheckerFolderAdditionTests.cs +96 -0
  971. package/Tests/Editor/Windows/PrefabCheckerFolderAdditionTests.cs.meta +11 -0
  972. package/Tests/Editor/Windows/PrefabCheckerTests.cs +81 -0
  973. package/Tests/Editor/Windows/PrefabCheckerTests.cs.meta +11 -0
  974. package/Tests/Editor/Windows.meta +8 -0
  975. package/Tests/Editor.meta +8 -0
  976. package/Tests/Runtime/AssemblyInfo.cs +4 -0
  977. package/Tests/Runtime/AssemblyInfo.cs.meta +3 -0
  978. package/Tests/Runtime/Attributes/ChildComponentTests.cs +766 -81
  979. package/Tests/Runtime/Attributes/ChildComponentTests.cs.meta +2 -2
  980. package/Tests/Runtime/Attributes/Components/ExpectChildSpriteRenderers.cs +28 -28
  981. package/Tests/Runtime/Attributes/Components/ExpectChildSpriteRenderers.cs.meta +2 -2
  982. package/Tests/Runtime/Attributes/Components/ExpectParentSpriteRenderers.cs +28 -28
  983. package/Tests/Runtime/Attributes/Components/ExpectParentSpriteRenderers.cs.meta +2 -2
  984. package/Tests/Runtime/{Components → Attributes/Components}/RelationalComponentTesterComplex.cs +34 -34
  985. package/Tests/Runtime/{Components → Attributes/Components}/RelationalComponentTesterComplex.cs.meta +2 -2
  986. package/Tests/Runtime/Attributes/Components/RelationalComponentsTesterSimple.cs +37 -0
  987. package/Tests/Runtime/{Components → Attributes/Components}/RelationalComponentsTesterSimple.cs.meta +2 -2
  988. package/Tests/Runtime/Attributes/Components.meta +2 -2
  989. package/Tests/Runtime/Attributes/MiscRuntimeAttributeTests.cs +75 -0
  990. package/Tests/Runtime/Attributes/MiscRuntimeAttributeTests.cs.meta +11 -0
  991. package/Tests/Runtime/Attributes/NotNullAttributeTests.cs +26 -0
  992. package/Tests/Runtime/Attributes/NotNullAttributeTests.cs.meta +3 -0
  993. package/Tests/Runtime/Attributes/ParentComponentTests.cs +565 -68
  994. package/Tests/Runtime/Attributes/ParentComponentTests.cs.meta +2 -2
  995. package/Tests/Runtime/Attributes/RelationalComponentAdvancedTests.cs +614 -0
  996. package/Tests/Runtime/Attributes/RelationalComponentAdvancedTests.cs.meta +11 -0
  997. package/Tests/Runtime/Attributes/RelationalComponentBackwardCompatibilityTests.cs +478 -0
  998. package/Tests/Runtime/Attributes/RelationalComponentBackwardCompatibilityTests.cs.meta +11 -0
  999. package/Tests/Runtime/Attributes/RelationalComponentExtensionsTests.cs +56 -0
  1000. package/Tests/Runtime/Attributes/RelationalComponentExtensionsTests.cs.meta +11 -0
  1001. package/Tests/Runtime/Attributes/RelationalComponentHashSetTests.cs +226 -0
  1002. package/Tests/Runtime/Attributes/RelationalComponentHashSetTests.cs.meta +11 -0
  1003. package/Tests/Runtime/Attributes/RelationalComponentInitializerTests.cs +109 -0
  1004. package/Tests/Runtime/Attributes/RelationalComponentInitializerTests.cs.meta +11 -0
  1005. package/Tests/Runtime/Attributes/RelationalComponentTagAndNameFilterEdgeTests.cs +234 -0
  1006. package/Tests/Runtime/Attributes/RelationalComponentTagAndNameFilterEdgeTests.cs.meta +11 -0
  1007. package/Tests/Runtime/Attributes/SiblingComponentTests.cs +721 -0
  1008. package/Tests/Runtime/Attributes/SiblingComponentTests.cs.meta +11 -0
  1009. package/Tests/Runtime/Attributes/ValidateAssignmentAttributeTests.cs +96 -0
  1010. package/Tests/Runtime/Attributes/ValidateAssignmentAttributeTests.cs.meta +11 -0
  1011. package/Tests/Runtime/Attributes.meta +2 -2
  1012. package/Tests/Runtime/Core/Random/RandomComparerTests.cs +166 -0
  1013. package/Tests/Runtime/Core/Random/RandomComparerTests.cs.meta +11 -0
  1014. package/Tests/Runtime/Core/Random.meta +8 -0
  1015. package/Tests/Runtime/Core/Threading/SingleThreadedThreadPoolTests.cs +56 -56
  1016. package/Tests/Runtime/Core/Threading/SingleThreadedThreadPoolTests.cs.meta +2 -2
  1017. package/Tests/Runtime/Core/Threading.meta +2 -2
  1018. package/Tests/Runtime/Core.meta +2 -2
  1019. package/Tests/Runtime/DataStructures/BalancedKDTree2DTests.cs +562 -0
  1020. package/Tests/Runtime/DataStructures/{BalancedKDTreeTests.cs.meta → BalancedKDTree2DTests.cs.meta} +11 -11
  1021. package/Tests/Runtime/DataStructures/BalancedKDTree3DTests.cs +10 -0
  1022. package/Tests/Runtime/DataStructures/BalancedKDTree3DTests.cs.meta +11 -0
  1023. package/Tests/Runtime/DataStructures/BitSetTests.cs +1400 -0
  1024. package/Tests/Runtime/DataStructures/BitSetTests.cs.meta +3 -0
  1025. package/Tests/Runtime/DataStructures/BoundingBox3DTests.cs +1215 -0
  1026. package/Tests/Runtime/DataStructures/BoundingBox3DTests.cs.meta +11 -0
  1027. package/Tests/Runtime/DataStructures/CircleTests.cs +965 -0
  1028. package/Tests/Runtime/DataStructures/CircleTests.cs.meta +11 -0
  1029. package/Tests/Runtime/DataStructures/CyclicBufferTests.cs +2083 -324
  1030. package/Tests/Runtime/DataStructures/CyclicBufferTests.cs.meta +2 -2
  1031. package/Tests/Runtime/DataStructures/DequeTests.cs +790 -0
  1032. package/Tests/Runtime/DataStructures/DequeTests.cs.meta +3 -0
  1033. package/Tests/Runtime/DataStructures/DisjointSetTests.cs +1114 -0
  1034. package/Tests/Runtime/DataStructures/DisjointSetTests.cs.meta +3 -0
  1035. package/Tests/Runtime/DataStructures/FastOneOfTests.cs +966 -0
  1036. package/Tests/Runtime/DataStructures/FastOneOfTests.cs.meta +11 -0
  1037. package/Tests/Runtime/DataStructures/FastVector2IntTests.cs +286 -0
  1038. package/Tests/Runtime/DataStructures/FastVector2IntTests.cs.meta +11 -0
  1039. package/Tests/Runtime/DataStructures/FastVector3IntTests.cs +414 -0
  1040. package/Tests/Runtime/DataStructures/FastVector3IntTests.cs.meta +11 -0
  1041. package/Tests/Runtime/DataStructures/HeapTests.cs +1953 -0
  1042. package/Tests/Runtime/DataStructures/HeapTests.cs.meta +11 -0
  1043. package/Tests/Runtime/DataStructures/ImmutableBitSetTests.cs +833 -0
  1044. package/Tests/Runtime/DataStructures/ImmutableBitSetTests.cs.meta +3 -0
  1045. package/Tests/Runtime/DataStructures/KDTree3DTestsBase.cs +297 -0
  1046. package/Tests/Runtime/DataStructures/KDTree3DTestsBase.cs.meta +11 -0
  1047. package/Tests/Runtime/DataStructures/OctTree3DTests.cs +351 -0
  1048. package/Tests/Runtime/DataStructures/OctTree3DTests.cs.meta +11 -0
  1049. package/Tests/Runtime/DataStructures/PriorityQueueTests.cs +71 -0
  1050. package/Tests/Runtime/DataStructures/PriorityQueueTests.cs.meta +3 -0
  1051. package/Tests/Runtime/DataStructures/ProtobufSerializationTests.cs +475 -0
  1052. package/Tests/Runtime/DataStructures/ProtobufSerializationTests.cs.meta +11 -0
  1053. package/Tests/Runtime/DataStructures/QuadTree2DTests.cs +660 -0
  1054. package/Tests/Runtime/DataStructures/QuadTree2DTests.cs.meta +11 -0
  1055. package/Tests/Runtime/DataStructures/RTree2DTests.cs +823 -0
  1056. package/Tests/Runtime/DataStructures/RTree2DTests.cs.meta +3 -0
  1057. package/Tests/Runtime/DataStructures/RTree3DTests.cs +270 -0
  1058. package/Tests/Runtime/DataStructures/RTree3DTests.cs.meta +11 -0
  1059. package/Tests/Runtime/DataStructures/SparseSetTests.cs +1146 -0
  1060. package/Tests/Runtime/DataStructures/SparseSetTests.cs.meta +3 -0
  1061. package/Tests/Runtime/DataStructures/SpatialHashTests.cs +992 -0
  1062. package/Tests/Runtime/DataStructures/SpatialHashTests.cs.meta +11 -0
  1063. package/Tests/Runtime/DataStructures/SpatialTree2DBoundsConsistencyTests.cs +351 -0
  1064. package/Tests/Runtime/DataStructures/SpatialTree2DBoundsConsistencyTests.cs.meta +11 -0
  1065. package/Tests/Runtime/DataStructures/SpatialTree2DBoundsEdgeTests.cs +127 -0
  1066. package/Tests/Runtime/DataStructures/SpatialTree2DBoundsEdgeTests.cs.meta +11 -0
  1067. package/Tests/Runtime/DataStructures/SpatialTree2DBoundsFuzzTests.cs +218 -0
  1068. package/Tests/Runtime/DataStructures/SpatialTree2DBoundsFuzzTests.cs.meta +11 -0
  1069. package/Tests/Runtime/DataStructures/SpatialTree2DTests.cs +396 -0
  1070. package/Tests/Runtime/DataStructures/SpatialTree2DTests.cs.meta +11 -0
  1071. package/Tests/Runtime/DataStructures/SpatialTree3DBoundsConsistencyTests.cs +281 -0
  1072. package/Tests/Runtime/DataStructures/SpatialTree3DBoundsConsistencyTests.cs.meta +11 -0
  1073. package/Tests/Runtime/DataStructures/SpatialTree3DBoundsEdgeTests.cs +127 -0
  1074. package/Tests/Runtime/DataStructures/SpatialTree3DBoundsEdgeTests.cs.meta +11 -0
  1075. package/Tests/Runtime/DataStructures/SpatialTree3DBoundsFuzzTests.cs +170 -0
  1076. package/Tests/Runtime/DataStructures/SpatialTree3DBoundsFuzzTests.cs.meta +11 -0
  1077. package/Tests/Runtime/DataStructures/SpatialTree3DTests.cs +474 -0
  1078. package/Tests/Runtime/DataStructures/SpatialTree3DTests.cs.meta +11 -0
  1079. package/Tests/Runtime/DataStructures/SphereTests.cs +806 -0
  1080. package/Tests/Runtime/DataStructures/SphereTests.cs.meta +3 -0
  1081. package/Tests/Runtime/DataStructures/StringWrapperTests.cs +333 -0
  1082. package/Tests/Runtime/DataStructures/StringWrapperTests.cs.meta +11 -0
  1083. package/Tests/Runtime/DataStructures/TimedCacheTests.cs +669 -0
  1084. package/Tests/Runtime/DataStructures/TimedCacheTests.cs.meta +11 -0
  1085. package/Tests/Runtime/DataStructures/TrieTests.cs +3385 -0
  1086. package/Tests/Runtime/DataStructures/TrieTests.cs.meta +11 -0
  1087. package/Tests/Runtime/DataStructures/UnbalancedKDTree2DTests.cs +565 -0
  1088. package/Tests/Runtime/DataStructures/{UnbalancedKDTreeTests.cs.meta → UnbalancedKDTree2DTests.cs.meta} +11 -11
  1089. package/Tests/Runtime/DataStructures/UnbalancedKDTree3DTests.cs +10 -0
  1090. package/Tests/Runtime/DataStructures/UnbalancedKDTree3DTests.cs.meta +11 -0
  1091. package/Tests/Runtime/DataStructures.meta +8 -8
  1092. package/Tests/Runtime/Extensions/AnimatorExtensionsTests.cs +28 -0
  1093. package/Tests/Runtime/Extensions/AnimatorExtensionsTests.cs.meta +11 -0
  1094. package/Tests/Runtime/Extensions/AsyncOperationExtensionsTests.cs +667 -0
  1095. package/Tests/Runtime/Extensions/AsyncOperationExtensionsTests.cs.meta +11 -0
  1096. package/Tests/Runtime/Extensions/CircleExtensionsTests.cs +230 -0
  1097. package/Tests/Runtime/Extensions/CircleExtensionsTests.cs.meta +11 -0
  1098. package/Tests/Runtime/Extensions/ColorExtensionsTests.cs +55 -0
  1099. package/Tests/Runtime/Extensions/ColorExtensionsTests.cs.meta +11 -0
  1100. package/Tests/Runtime/Extensions/DictionaryExtensionTests.cs +724 -438
  1101. package/Tests/Runtime/Extensions/DictionaryExtensionTests.cs.meta +2 -2
  1102. package/Tests/Runtime/Extensions/DirectionExtensionsComprehensiveTests.cs +403 -0
  1103. package/Tests/Runtime/Extensions/DirectionExtensionsComprehensiveTests.cs.meta +11 -0
  1104. package/Tests/Runtime/Extensions/DirectionExtensionsTests.cs +69 -0
  1105. package/Tests/Runtime/Extensions/DirectionExtensionsTests.cs.meta +11 -0
  1106. package/Tests/Runtime/Extensions/EnumExtensionTests.cs +809 -153
  1107. package/Tests/Runtime/Extensions/EnumExtensionTests.cs.meta +2 -2
  1108. package/Tests/Runtime/Extensions/IEnumerableExtensionsTests.cs +191 -0
  1109. package/Tests/Runtime/Extensions/IEnumerableExtensionsTests.cs.meta +11 -0
  1110. package/Tests/Runtime/Extensions/IListExtensionTests.cs +955 -169
  1111. package/Tests/Runtime/Extensions/IListExtensionTests.cs.meta +2 -2
  1112. package/Tests/Runtime/Extensions/IReadonlyListExtensionTests.cs +266 -58
  1113. package/Tests/Runtime/Extensions/IReadonlyListExtensionTests.cs.meta +2 -2
  1114. package/Tests/Runtime/Extensions/LoggingExtensionTests.cs +721 -718
  1115. package/Tests/Runtime/Extensions/LoggingExtensionTests.cs.meta +2 -2
  1116. package/Tests/Runtime/Extensions/ProtoEqualityExtensionsTests.cs +565 -0
  1117. package/Tests/Runtime/Extensions/ProtoEqualityExtensionsTests.cs.meta +3 -0
  1118. package/Tests/Runtime/Extensions/ProtoEqualityPolymorphismTests.cs +100 -0
  1119. package/Tests/Runtime/Extensions/ProtoEqualityPolymorphismTests.cs.meta +11 -0
  1120. package/Tests/Runtime/Extensions/RandomExtensionTests.cs +719 -27
  1121. package/Tests/Runtime/Extensions/RandomExtensionTests.cs.meta +2 -2
  1122. package/Tests/Runtime/Extensions/StringExtensionTests.cs +2592 -31
  1123. package/Tests/Runtime/Extensions/StringExtensionTests.cs.meta +2 -2
  1124. package/Tests/Runtime/Extensions/UnityExtensionsBasicTests.cs +166 -0
  1125. package/Tests/Runtime/Extensions/UnityExtensionsBasicTests.cs.meta +11 -0
  1126. package/Tests/Runtime/Extensions/UnityExtensionsComprehensiveTests.cs +1446 -0
  1127. package/Tests/Runtime/Extensions/UnityExtensionsComprehensiveTests.cs.meta +11 -0
  1128. package/Tests/Runtime/Extensions/UnityExtensionsMathTests.cs +1779 -0
  1129. package/Tests/Runtime/Extensions/UnityExtensionsMathTests.cs.meta +11 -0
  1130. package/Tests/Runtime/Extensions/UnityExtensionsVector2HullTests.cs +292 -0
  1131. package/Tests/Runtime/Extensions/UnityExtensionsVector2HullTests.cs.meta +11 -0
  1132. package/Tests/Runtime/Extensions/UnityLogTagFormatterEdgeTests.cs +260 -0
  1133. package/Tests/Runtime/Extensions/UnityLogTagFormatterEdgeTests.cs.meta +11 -0
  1134. package/Tests/Runtime/Extensions.meta +2 -2
  1135. package/Tests/Runtime/Helper/ArrayConverterTests.cs +19 -19
  1136. package/Tests/Runtime/Helper/ArrayConverterTests.cs.meta +2 -2
  1137. package/Tests/Runtime/Helper/AssignUtilitiesTests.cs +38 -0
  1138. package/Tests/Runtime/Helper/AssignUtilitiesTests.cs.meta +11 -0
  1139. package/Tests/Runtime/Helper/DirectoryHelperTests.cs +347 -0
  1140. package/Tests/Runtime/Helper/DirectoryHelperTests.cs.meta +11 -0
  1141. package/Tests/Runtime/Helper/EnumerablesTests.cs +45 -0
  1142. package/Tests/Runtime/Helper/EnumerablesTests.cs.meta +11 -0
  1143. package/Tests/Runtime/Helper/FileHelperTests.cs +481 -0
  1144. package/Tests/Runtime/Helper/FileHelperTests.cs.meta +11 -0
  1145. package/Tests/Runtime/Helper/FormattingHelpersTests.cs +353 -0
  1146. package/Tests/Runtime/Helper/FormattingHelpersTests.cs.meta +11 -0
  1147. package/Tests/Runtime/Helper/FuncBasedComparerTests.cs +27 -0
  1148. package/Tests/Runtime/Helper/FuncBasedComparerTests.cs.meta +11 -0
  1149. package/Tests/Runtime/Helper/GeometryTests.cs +517 -0
  1150. package/Tests/Runtime/Helper/GeometryTests.cs.meta +3 -0
  1151. package/Tests/Runtime/Helper/HelpersTests.cs +749 -0
  1152. package/Tests/Runtime/Helper/HelpersTests.cs.meta +11 -0
  1153. package/Tests/Runtime/Helper/IterationHelpersTests.cs +173 -0
  1154. package/Tests/Runtime/Helper/IterationHelpersTests.cs.meta +11 -0
  1155. package/Tests/Runtime/Helper/LineHelperTests.cs +662 -0
  1156. package/Tests/Runtime/Helper/LineHelperTests.cs.meta +11 -0
  1157. package/Tests/Runtime/Helper/ObjectHelperTests.cs +444 -432
  1158. package/Tests/Runtime/Helper/ObjectHelperTests.cs.meta +2 -2
  1159. package/Tests/Runtime/Helper/ObjectsTests.cs +363 -0
  1160. package/Tests/Runtime/Helper/ObjectsTests.cs.meta +3 -0
  1161. package/Tests/Runtime/Helper/PathHelperTests.cs +183 -0
  1162. package/Tests/Runtime/Helper/PathHelperTests.cs.meta +11 -0
  1163. package/Tests/Runtime/Helper/ReflectionHelperTests.cs +2199 -1493
  1164. package/Tests/Runtime/Helper/ReflectionHelperTests.cs.meta +2 -2
  1165. package/Tests/Runtime/Helper/ReflectionHelpersMemberLookupTests.cs +192 -0
  1166. package/Tests/Runtime/Helper/ReflectionHelpersMemberLookupTests.cs.meta +11 -0
  1167. package/Tests/Runtime/Helper/ReflectionHelpersTypeScanningTests.cs +58 -0
  1168. package/Tests/Runtime/Helper/ReflectionHelpersTypeScanningTests.cs.meta +11 -0
  1169. package/Tests/Runtime/Helper/SceneHelperTests.cs +77 -94
  1170. package/Tests/Runtime/Helper/SceneHelperTests.cs.meta +2 -2
  1171. package/Tests/Runtime/Helper/UnityMainThreadDispatcherTests.cs +45 -0
  1172. package/Tests/Runtime/Helper/UnityMainThreadDispatcherTests.cs.meta +11 -0
  1173. package/Tests/Runtime/Helper/WallMathTests.cs +1884 -233
  1174. package/Tests/Runtime/Helper/WallMathTests.cs.meta +2 -2
  1175. package/Tests/Runtime/Helper.meta +2 -2
  1176. package/Tests/Runtime/Integrations/VContainer/RelationalComponentsVContainerTests.cs +560 -0
  1177. package/Tests/Runtime/Integrations/VContainer/RelationalComponentsVContainerTests.cs.meta +11 -0
  1178. package/Tests/Runtime/Integrations/VContainer/WallstopStudios.UnityHelpers.Tests.Runtime.VContainer.asmdef +38 -0
  1179. package/Tests/Runtime/Integrations/VContainer/WallstopStudios.UnityHelpers.Tests.Runtime.VContainer.asmdef.meta +7 -0
  1180. package/Tests/Runtime/Integrations/VContainer.meta +8 -0
  1181. package/Tests/Runtime/Integrations/Zenject/RelationalComponentsZenjectTests.cs +591 -0
  1182. package/Tests/Runtime/Integrations/Zenject/RelationalComponentsZenjectTests.cs.meta +11 -0
  1183. package/Tests/Runtime/Integrations/Zenject/WallstopStudios.UnityHelpers.Tests.Runtime.Zenject.asmdef +38 -0
  1184. package/Tests/Runtime/Integrations/Zenject/WallstopStudios.UnityHelpers.Tests.Runtime.Zenject.asmdef.meta +7 -0
  1185. package/Tests/Runtime/Integrations/Zenject.meta +8 -0
  1186. package/Tests/Runtime/Integrations.meta +8 -0
  1187. package/Tests/Runtime/Math/Line2DTests.cs +594 -0
  1188. package/Tests/Runtime/Math/Line2DTests.cs.meta +11 -0
  1189. package/Tests/Runtime/Math/Line3DTests.cs +655 -0
  1190. package/Tests/Runtime/Math/Line3DTests.cs.meta +11 -0
  1191. package/Tests/Runtime/Math/LineTests.cs +480 -0
  1192. package/Tests/Runtime/Math/LineTests.cs.meta +11 -0
  1193. package/Tests/Runtime/Math/ParabolaTests.cs +477 -0
  1194. package/Tests/Runtime/Math/ParabolaTests.cs.meta +11 -0
  1195. package/Tests/Runtime/Math/PointPolygonCheckTests.cs +939 -0
  1196. package/Tests/Runtime/Math/PointPolygonCheckTests.cs.meta +11 -0
  1197. package/Tests/Runtime/Math/RangeTests.cs +197 -0
  1198. package/Tests/Runtime/Math/RangeTests.cs.meta +11 -0
  1199. package/Tests/Runtime/Math.meta +8 -0
  1200. package/Tests/Runtime/Performance/BenchmarkReadmeUpdater.cs +81 -0
  1201. package/Tests/Runtime/Performance/BenchmarkReadmeUpdater.cs.meta +11 -0
  1202. package/Tests/Runtime/Performance/JsonSerializationPerformanceTests.cs +421 -0
  1203. package/Tests/Runtime/Performance/JsonSerializationPerformanceTests.cs.meta +3 -0
  1204. package/Tests/Runtime/Performance/ListExtensionPerformanceTests.cs +76 -76
  1205. package/Tests/Runtime/Performance/ListExtensionPerformanceTests.cs.meta +2 -2
  1206. package/Tests/Runtime/Performance/ProtoEqualsPerformanceTests.cs +161 -0
  1207. package/Tests/Runtime/Performance/ProtoEqualsPerformanceTests.cs.meta +11 -0
  1208. package/Tests/Runtime/Performance/ProtoSerializationPerformanceTests.cs +207 -0
  1209. package/Tests/Runtime/Performance/ProtoSerializationPerformanceTests.cs.meta +3 -0
  1210. package/Tests/Runtime/Performance/RandomPerformanceTests.cs +195 -181
  1211. package/Tests/Runtime/Performance/RandomPerformanceTests.cs.meta +11 -11
  1212. package/Tests/Runtime/Performance/RelationComponentPerformanceTests.cs +60 -61
  1213. package/Tests/Runtime/Performance/RelationComponentPerformanceTests.cs.meta +2 -2
  1214. package/Tests/Runtime/Performance/SpatialTree2DPerformanceTests.cs +692 -0
  1215. package/Tests/Runtime/Performance/SpatialTree2DPerformanceTests.cs.meta +11 -0
  1216. package/Tests/Runtime/Performance/SpatialTree3DPerformanceTests.cs +650 -0
  1217. package/Tests/Runtime/Performance/SpatialTree3DPerformanceTests.cs.meta +11 -0
  1218. package/Tests/Runtime/Performance.meta +8 -8
  1219. package/Tests/Runtime/Random/DotNetRandomTests.cs +9 -9
  1220. package/Tests/Runtime/Random/DotNetRandomTests.cs.meta +2 -2
  1221. package/Tests/Runtime/Random/IllusionFlowTests.cs +12 -12
  1222. package/Tests/Runtime/Random/IllusionFlowTests.cs.meta +2 -2
  1223. package/Tests/Runtime/Random/LinearCongruentialGeneratorTests.cs +12 -12
  1224. package/Tests/Runtime/Random/LinearCongruentialGeneratorTests.cs.meta +2 -2
  1225. package/Tests/Runtime/Random/PcgRandomTests.cs +9 -9
  1226. package/Tests/Runtime/Random/PcgRandomTests.cs.meta +11 -11
  1227. package/Tests/Runtime/Random/RandomProtoSerializationTests.cs +494 -0
  1228. package/Tests/Runtime/Random/RandomProtoSerializationTests.cs.meta +3 -0
  1229. package/Tests/Runtime/Random/RandomStateSerializationTests.cs +304 -0
  1230. package/Tests/Runtime/Random/RandomStateSerializationTests.cs.meta +4 -0
  1231. package/Tests/Runtime/Random/RandomTestBase.cs +836 -787
  1232. package/Tests/Runtime/Random/RandomTestBase.cs.meta +11 -11
  1233. package/Tests/Runtime/Random/RomuDuoRandomTests.cs +9 -9
  1234. package/Tests/Runtime/Random/RomuDuoRandomTests.cs.meta +2 -2
  1235. package/Tests/Runtime/Random/SplitMix64RandomTests.cs +9 -9
  1236. package/Tests/Runtime/Random/SplitMix64RandomTests.cs.meta +2 -2
  1237. package/Tests/Runtime/Random/SquirrelRandomTests.cs +14 -14
  1238. package/Tests/Runtime/Random/SquirrelRandomTests.cs.meta +11 -11
  1239. package/Tests/Runtime/Random/SystemRandomTests.cs +10 -10
  1240. package/Tests/Runtime/Random/SystemRandomTests.cs.meta +11 -11
  1241. package/Tests/Runtime/Random/UnityRandomTests.cs +9 -9
  1242. package/Tests/Runtime/Random/UnityRandomTests.cs.meta +11 -11
  1243. package/Tests/Runtime/Random/WyRandomTests.cs +9 -9
  1244. package/Tests/Runtime/Random/WyRandomTests.cs.meta +2 -2
  1245. package/Tests/Runtime/Random/XorShiftRandomTests.cs +9 -9
  1246. package/Tests/Runtime/Random/XorShiftRandomTests.cs.meta +11 -11
  1247. package/Tests/Runtime/Random/XoroShiroRandomTests.cs +9 -9
  1248. package/Tests/Runtime/Random/XoroShiroRandomTests.cs.meta +2 -2
  1249. package/Tests/Runtime/Random.meta +8 -8
  1250. package/Tests/Runtime/RuntimeTestTimeouts.cs +3 -0
  1251. package/Tests/Runtime/RuntimeTestTimeouts.cs.meta +11 -0
  1252. package/Tests/Runtime/Scenes/Test1.unity +723 -723
  1253. package/Tests/Runtime/Scenes/Test1.unity.meta +7 -7
  1254. package/Tests/Runtime/Scenes/Test2.unity +723 -723
  1255. package/Tests/Runtime/Scenes/Test2.unity.meta +7 -7
  1256. package/Tests/Runtime/Scenes.meta +2 -2
  1257. package/Tests/Runtime/Serialization/AdaptersJsonTests.cs +67 -0
  1258. package/Tests/Runtime/Serialization/AdaptersJsonTests.cs.meta +11 -0
  1259. package/Tests/Runtime/Serialization/BitSetJsonTests.cs +50 -0
  1260. package/Tests/Runtime/Serialization/BitSetJsonTests.cs.meta +11 -0
  1261. package/Tests/Runtime/Serialization/CyclicBufferJsonTests.cs +67 -0
  1262. package/Tests/Runtime/Serialization/CyclicBufferJsonTests.cs.meta +11 -0
  1263. package/Tests/Runtime/Serialization/DequeJsonTests.cs +70 -0
  1264. package/Tests/Runtime/Serialization/DequeJsonTests.cs.meta +11 -0
  1265. package/Tests/Runtime/Serialization/ImmutableBitSetJsonTests.cs +25 -0
  1266. package/Tests/Runtime/Serialization/ImmutableBitSetJsonTests.cs.meta +11 -0
  1267. package/Tests/Runtime/Serialization/JsonConverterTests.cs +1157 -0
  1268. package/Tests/Runtime/Serialization/JsonConverterTests.cs.meta +11 -0
  1269. package/Tests/Runtime/Serialization/JsonRoundtripComprehensiveTests.cs +239 -0
  1270. package/Tests/Runtime/Serialization/JsonRoundtripComprehensiveTests.cs.meta +11 -0
  1271. package/Tests/Runtime/Serialization/JsonSerializationCorrectnessTests.cs +458 -0
  1272. package/Tests/Runtime/Serialization/JsonSerializationCorrectnessTests.cs.meta +3 -0
  1273. package/Tests/Runtime/Serialization/JsonSerializationTest.cs +156 -156
  1274. package/Tests/Runtime/Serialization/JsonSerializationTest.cs.meta +2 -2
  1275. package/Tests/Runtime/Serialization/MathJsonTests.cs +79 -0
  1276. package/Tests/Runtime/Serialization/MathJsonTests.cs.meta +11 -0
  1277. package/Tests/Runtime/Serialization/ProtoInterfaceResolutionEdgeTests.cs +76 -0
  1278. package/Tests/Runtime/Serialization/ProtoInterfaceResolutionEdgeTests.cs.meta +11 -0
  1279. package/Tests/Runtime/Serialization/ProtoRootRegistrationTests.cs +80 -0
  1280. package/Tests/Runtime/Serialization/ProtoRootRegistrationTests.cs.meta +11 -0
  1281. package/Tests/Runtime/Serialization/ProtoRoundtripComprehensiveTests.cs +257 -0
  1282. package/Tests/Runtime/Serialization/ProtoRoundtripComprehensiveTests.cs.meta +11 -0
  1283. package/Tests/Runtime/Serialization/ProtoSerializationCorrectnessTests.cs +471 -0
  1284. package/Tests/Runtime/Serialization/ProtoSerializationCorrectnessTests.cs.meta +3 -0
  1285. package/Tests/Runtime/Serialization/ProtoSerializationTests.cs +169 -0
  1286. package/Tests/Runtime/Serialization/ProtoSerializationTests.cs.meta +11 -0
  1287. package/Tests/Runtime/Serialization/ProtoSerializeBehaviorTests.cs +62 -0
  1288. package/Tests/Runtime/Serialization/ProtoSerializeBehaviorTests.cs.meta +11 -0
  1289. package/Tests/Runtime/Serialization/SerializerAdditionalTests.cs +895 -0
  1290. package/Tests/Runtime/Serialization/SerializerAdditionalTests.cs.meta +3 -0
  1291. package/Tests/Runtime/Serialization/TypeConverterTests.cs +34 -0
  1292. package/Tests/Runtime/Serialization/TypeConverterTests.cs.meta +11 -0
  1293. package/Tests/Runtime/Serialization.meta +2 -2
  1294. package/Tests/Runtime/Tags/AttributeComponentTests.cs +174 -0
  1295. package/Tests/Runtime/Tags/AttributeComponentTests.cs.meta +3 -0
  1296. package/Tests/Runtime/Tags/AttributeDataTests.cs +312 -0
  1297. package/Tests/Runtime/Tags/AttributeDataTests.cs.meta +11 -0
  1298. package/Tests/Runtime/Tags/AttributeUtilitiesTests.cs +405 -0
  1299. package/Tests/Runtime/Tags/AttributeUtilitiesTests.cs.meta +3 -0
  1300. package/Tests/Runtime/Tags/CosmeticAndCollisionTests.cs +147 -0
  1301. package/Tests/Runtime/Tags/CosmeticAndCollisionTests.cs.meta +11 -0
  1302. package/Tests/Runtime/Tags/CosmeticEffectDataTests.cs +60 -0
  1303. package/Tests/Runtime/Tags/CosmeticEffectDataTests.cs.meta +3 -0
  1304. package/Tests/Runtime/Tags/EffectHandleTests.cs +61 -0
  1305. package/Tests/Runtime/Tags/EffectHandleTests.cs.meta +3 -0
  1306. package/Tests/Runtime/Tags/EffectHandlerTests.cs +270 -0
  1307. package/Tests/Runtime/Tags/EffectHandlerTests.cs.meta +3 -0
  1308. package/Tests/Runtime/Tags/Helpers/RecordingCosmeticComponent.cs +39 -0
  1309. package/Tests/Runtime/Tags/Helpers/RecordingCosmeticComponent.cs.meta +3 -0
  1310. package/Tests/Runtime/Tags/Helpers/TagTestBase.cs +49 -0
  1311. package/Tests/Runtime/Tags/Helpers/TagTestBase.cs.meta +3 -0
  1312. package/Tests/Runtime/Tags/Helpers/TestAttributesComponent.cs +28 -0
  1313. package/Tests/Runtime/Tags/Helpers/TestAttributesComponent.cs.meta +3 -0
  1314. package/Tests/Runtime/Tags/Helpers.meta +3 -0
  1315. package/Tests/Runtime/Tags/TagHandlerTests.cs +108 -0
  1316. package/Tests/Runtime/Tags/TagHandlerTests.cs.meta +3 -0
  1317. package/Tests/Runtime/Tags.meta +8 -0
  1318. package/Tests/Runtime/TestUtils/CommonTestBase.cs +213 -0
  1319. package/Tests/Runtime/TestUtils/CommonTestBase.cs.meta +11 -0
  1320. package/Tests/Runtime/TestUtils/GCAssert.cs +55 -0
  1321. package/Tests/Runtime/TestUtils/GCAssert.cs.meta +11 -0
  1322. package/Tests/Runtime/TestUtils/SpatialAssert.cs +33 -0
  1323. package/Tests/Runtime/TestUtils/SpatialAssert.cs.meta +11 -0
  1324. package/Tests/Runtime/TestUtils/SpatialDiagnostics.cs +195 -0
  1325. package/Tests/Runtime/TestUtils/SpatialDiagnostics.cs.meta +11 -0
  1326. package/Tests/Runtime/TestUtils.meta +8 -0
  1327. package/Tests/Runtime/Utils/AnimationEventEqualityComparerTests.cs +144 -0
  1328. package/Tests/Runtime/Utils/AnimationEventEqualityComparerTests.cs.meta +11 -0
  1329. package/Tests/Runtime/Utils/Ascii85Tests.cs +56 -0
  1330. package/Tests/Runtime/Utils/Ascii85Tests.cs.meta +11 -0
  1331. package/Tests/Runtime/Utils/BuffersTests.cs +1148 -741
  1332. package/Tests/Runtime/Utils/BuffersTests.cs.meta +2 -2
  1333. package/Tests/Runtime/Utils/BuffersWaitInstructionTests.cs +31 -0
  1334. package/Tests/Runtime/Utils/BuffersWaitInstructionTests.cs.meta +11 -0
  1335. package/Tests/Runtime/Utils/CenterPointOffsetTests.cs +67 -0
  1336. package/Tests/Runtime/Utils/CenterPointOffsetTests.cs.meta +11 -0
  1337. package/Tests/Runtime/Utils/ChildSpawnerTests.cs +490 -0
  1338. package/Tests/Runtime/Utils/ChildSpawnerTests.cs.meta +11 -0
  1339. package/Tests/Runtime/Utils/CircleLineRendererTests.cs +80 -0
  1340. package/Tests/Runtime/Utils/CircleLineRendererTests.cs.meta +11 -0
  1341. package/Tests/Runtime/Utils/CollisionProxyTests.cs +442 -0
  1342. package/Tests/Runtime/Utils/CollisionProxyTests.cs.meta +11 -0
  1343. package/Tests/Runtime/Utils/CoroutineHandlerTests.cs +353 -0
  1344. package/Tests/Runtime/Utils/CoroutineHandlerTests.cs.meta +11 -0
  1345. package/Tests/Runtime/Utils/DeferredDisposalResultTests.cs +44 -0
  1346. package/Tests/Runtime/Utils/DeferredDisposalResultTests.cs.meta +11 -0
  1347. package/Tests/Runtime/Utils/LZMAComprehensiveTests.cs +249 -0
  1348. package/Tests/Runtime/Utils/LZMAComprehensiveTests.cs.meta +11 -0
  1349. package/Tests/Runtime/Utils/LZMATests.cs +31 -0
  1350. package/Tests/Runtime/Utils/LZMATests.cs.meta +11 -0
  1351. package/Tests/Runtime/Utils/MatchColliderToSpriteAdditionalTests.cs +86 -0
  1352. package/Tests/Runtime/Utils/MatchColliderToSpriteAdditionalTests.cs.meta +11 -0
  1353. package/Tests/Runtime/Utils/MatchColliderToSpriteTests.cs +503 -0
  1354. package/Tests/Runtime/Utils/MatchColliderToSpriteTests.cs.meta +11 -0
  1355. package/Tests/Runtime/Utils/MatchTransformEdgeTests.cs +34 -0
  1356. package/Tests/Runtime/Utils/MatchTransformEdgeTests.cs.meta +11 -0
  1357. package/Tests/Runtime/Utils/MatchTransformTests.cs +495 -0
  1358. package/Tests/Runtime/Utils/MatchTransformTests.cs.meta +11 -0
  1359. package/Tests/Runtime/Utils/OscillatorTests.cs +540 -0
  1360. package/Tests/Runtime/Utils/OscillatorTests.cs.meta +11 -0
  1361. package/Tests/Runtime/Utils/PolygonCollider2DOptimizerTests.cs +52 -0
  1362. package/Tests/Runtime/Utils/PolygonCollider2DOptimizerTests.cs.meta +11 -0
  1363. package/Tests/Runtime/Utils/RuntimeSingletonTests.cs +766 -0
  1364. package/Tests/Runtime/Utils/RuntimeSingletonTests.cs.meta +11 -0
  1365. package/Tests/Runtime/Utils/SerializedStringComparerEdgeTests.cs +47 -0
  1366. package/Tests/Runtime/Utils/SerializedStringComparerEdgeTests.cs.meta +11 -0
  1367. package/Tests/Runtime/Utils/SerializedStringComparerTests.cs +361 -0
  1368. package/Tests/Runtime/Utils/SerializedStringComparerTests.cs.meta +11 -0
  1369. package/Tests/Runtime/Utils/SpriteRendererMetadataTests.cs +383 -398
  1370. package/Tests/Runtime/Utils/SpriteRendererMetadataTests.cs.meta +2 -2
  1371. package/Tests/Runtime/Utils/SpriteRendererSyncTests.cs +134 -0
  1372. package/Tests/Runtime/Utils/SpriteRendererSyncTests.cs.meta +11 -0
  1373. package/Tests/Runtime/Utils/StartTrackerTests.cs +24 -0
  1374. package/Tests/Runtime/Utils/StartTrackerTests.cs.meta +11 -0
  1375. package/Tests/Runtime/Utils/TextureScaleEdgeTests.cs +114 -0
  1376. package/Tests/Runtime/Utils/TextureScaleEdgeTests.cs.meta +11 -0
  1377. package/Tests/Runtime/Utils/TextureScaleTests.cs +298 -0
  1378. package/Tests/Runtime/Utils/TextureScaleTests.cs.meta +3 -0
  1379. package/Tests/Runtime/Utils/TypeNameSorterAdditionalTests.cs +36 -0
  1380. package/Tests/Runtime/Utils/TypeNameSorterAdditionalTests.cs.meta +11 -0
  1381. package/Tests/Runtime/Utils/TypeNameSorterTests.cs +34 -0
  1382. package/Tests/Runtime/Utils/TypeNameSorterTests.cs.meta +11 -0
  1383. package/Tests/Runtime/Utils/UnityObjectNameComparerEdgeTests.cs +63 -0
  1384. package/Tests/Runtime/Utils/UnityObjectNameComparerEdgeTests.cs.meta +11 -0
  1385. package/Tests/Runtime/Utils/UnityObjectNameComparerTests.cs +59 -0
  1386. package/Tests/Runtime/Utils/UnityObjectNameComparerTests.cs.meta +11 -0
  1387. package/Tests/Runtime/Utils.meta +2 -2
  1388. package/Tests/Runtime/Visuals/AnimatedSpriteLayerTests.cs +266 -0
  1389. package/Tests/Runtime/Visuals/AnimatedSpriteLayerTests.cs.meta +11 -0
  1390. package/Tests/Runtime/Visuals/EnhancedImageTests.cs +184 -0
  1391. package/Tests/Runtime/Visuals/EnhancedImageTests.cs.meta +11 -0
  1392. package/Tests/Runtime/Visuals/LayeredImageTests.cs +422 -0
  1393. package/Tests/Runtime/Visuals/LayeredImageTests.cs.meta +11 -0
  1394. package/Tests/Runtime/Visuals/VisualsTestHelpers.cs +132 -0
  1395. package/Tests/Runtime/Visuals/VisualsTestHelpers.cs.meta +11 -0
  1396. package/Tests/Runtime/Visuals.meta +3 -0
  1397. package/Tests/Runtime/WallstopStudios.UnityHelpers.Tests.Runtime.asmdef +24 -23
  1398. package/Tests/Runtime/WallstopStudios.UnityHelpers.Tests.Runtime.asmdef.meta +7 -7
  1399. package/Tests/Runtime.meta +8 -8
  1400. package/Tests.meta +8 -8
  1401. package/URP/VolumeProfiles/Post Processing Bloom Profile(URP).asset +63 -63
  1402. package/URP/VolumeProfiles/Post Processing Bloom Profile(URP).asset.meta +8 -8
  1403. package/URP/VolumeProfiles.meta +8 -8
  1404. package/URP.meta +8 -8
  1405. package/node_modules.meta +8 -0
  1406. package/package.json +95 -38
  1407. package/package.json.meta +7 -7
  1408. package/scripts/check-eol.ps1 +52 -0
  1409. package/scripts/check-eol.ps1.meta +7 -0
  1410. package/scripts/clean-nul.ps1 +29 -0
  1411. package/scripts/clean-nul.ps1.meta +7 -0
  1412. package/scripts/lint-doc-links.ps1 +80 -0
  1413. package/scripts/lint-doc-links.ps1.meta +7 -0
  1414. package/scripts/normalize-eol.ps1 +71 -0
  1415. package/scripts/normalize-eol.ps1.meta +7 -0
  1416. package/scripts.meta +8 -0
  1417. package/Editor/Sprites/ProjectAnimationSettings.cs +0 -50
  1418. package/Editor/Sprites/ProjectAnimationSettings.cs.meta +0 -3
  1419. package/Editor/Sprites/TextureSettingsApplier.cs +0 -178
  1420. package/Editor/Sprites/TextureSettingsApplier.cs.meta +0 -3
  1421. package/Runtime/Core/Attributes/ParentComponent.cs +0 -189
  1422. package/Runtime/Core/DataStructure/KDTree.cs +0 -434
  1423. package/Runtime/Core/DataStructure/QuadTree.cs +0 -431
  1424. package/Runtime/Core/DataStructure/RTree.cs +0 -356
  1425. package/Runtime/Core/Extension/HashSetExtensions.cs +0 -12
  1426. package/Runtime/Core/Extension/HashSetExtensions.cs.meta +0 -11
  1427. package/Runtime/Core/Math/Line.cs +0 -55
  1428. package/Runtime/Core/Math/Line.cs.meta +0 -11
  1429. package/Runtime/Core/Math/XXHash.cs +0 -310
  1430. package/Runtime/Core/Math/XXHash.cs.meta +0 -11
  1431. package/Tests/Runtime/Components/RelationalComponentsTesterSimple.cs +0 -40
  1432. package/Tests/Runtime/Components.meta +0 -3
  1433. package/Tests/Runtime/DataStructures/BalancedKDTreeTests.cs +0 -14
  1434. package/Tests/Runtime/DataStructures/QuadTreeTests.cs +0 -14
  1435. package/Tests/Runtime/DataStructures/QuadTreeTests.cs.meta +0 -11
  1436. package/Tests/Runtime/DataStructures/SpatialTreeTests.cs +0 -130
  1437. package/Tests/Runtime/DataStructures/SpatialTreeTests.cs.meta +0 -11
  1438. package/Tests/Runtime/DataStructures/UnbalancedKDTreeTests.cs +0 -14
  1439. package/Tests/Runtime/Helper/FormattingHelperTests.cs +0 -129
  1440. package/Tests/Runtime/Helper/FormattingHelperTests.cs.meta +0 -3
  1441. package/Tests/Runtime/Performance/KDTreePerformanceTests.cs +0 -14
  1442. package/Tests/Runtime/Performance/KDTreePerformanceTests.cs.meta +0 -11
  1443. package/Tests/Runtime/Performance/QuadTreePerformanceTests.cs +0 -14
  1444. package/Tests/Runtime/Performance/QuadTreePerformanceTests.cs.meta +0 -11
  1445. package/Tests/Runtime/Performance/SpatialTreePerformanceTest.cs +0 -158
  1446. package/Tests/Runtime/Performance/SpatialTreePerformanceTest.cs.meta +0 -11
  1447. package/Tests/Runtime/Performance/UnbalancedKDTreeTests.cs +0 -14
  1448. package/Tests/Runtime/Performance/UnbalancedKDTreeTests.cs.meta +0 -11
  1449. package/Third Party Notices.md +0 -1
@@ -1,881 +1,1532 @@
1
- namespace WallstopStudios.UnityHelpers.Editor.Sprites
2
- {
3
- #if UNITY_EDITOR
4
- using System;
5
- using System.Collections.Generic;
6
- using System.IO;
7
- using System.Linq;
8
- using System.Text.RegularExpressions;
9
- using UnityEditor;
10
- using UnityEngine;
11
- using Core.Extension;
12
- using Core.Helper;
13
- using CustomEditors;
14
- using Object = UnityEngine.Object;
15
-
16
- [Serializable]
17
- public sealed class AnimationData
18
- {
19
- public const float DefaultFramesPerSecond = 12;
20
-
21
- public List<Sprite> frames = new();
22
- public float framesPerSecond = DefaultFramesPerSecond;
23
- public string animationName = string.Empty;
24
- public bool isCreatedFromAutoParse;
25
- public bool loop;
26
- }
27
-
28
- public sealed class AnimationCreatorWindow : EditorWindow
29
- {
30
- private static readonly char[] WhiteSpaceSplitters = { ' ', '\t', '\n', '\r' };
31
-
32
- private SerializedObject _serializedObject;
33
- private SerializedProperty _animationDataProp;
34
- private SerializedProperty _animationSourcesProp;
35
- private SerializedProperty _spriteNameRegexProp;
36
- private SerializedProperty _textProp;
37
-
38
- public List<AnimationData> animationData = new();
39
- public List<Object> animationSources = new();
40
- public string spriteNameRegex = ".*";
41
- public string text;
42
-
43
- [HideInInspector]
44
- [SerializeField]
45
- private List<Sprite> _filteredSprites = new();
46
- private int _matchedSpriteCount;
47
- private int _unmatchedSpriteCount;
48
- private Regex _compiledRegex;
49
- private string _lastUsedRegex;
50
- private string _searchString = string.Empty;
51
- private Vector2 _scrollPosition;
52
- private string _errorMessage = string.Empty;
53
- private bool _animationDataIsExpanded = true;
54
-
55
- [MenuItem("Tools/Wallstop Studios/Unity Helpers/Animation Creator", priority = -3)]
56
- public static void ShowWindow()
57
- {
58
- GetWindow<AnimationCreatorWindow>("Animation Creator");
59
- }
60
-
61
- private void OnEnable()
62
- {
63
- _serializedObject = new SerializedObject(this);
64
- _animationDataProp = _serializedObject.FindProperty(nameof(animationData));
65
- _animationSourcesProp = _serializedObject.FindProperty(nameof(animationSources));
66
- _spriteNameRegexProp = _serializedObject.FindProperty(nameof(spriteNameRegex));
67
- _textProp = _serializedObject.FindProperty(nameof(text));
68
-
69
- UpdateRegex();
70
- FindAndFilterSprites();
71
- Repaint();
72
- }
73
-
74
- private void OnGUI()
75
- {
76
- _serializedObject.Update();
77
-
78
- _scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition);
79
-
80
- EditorGUILayout.LabelField("Configuration", EditorStyles.boldLabel);
81
- PersistentDirectoryGUI.PathSelectorObjectArray(
82
- _animationSourcesProp,
83
- nameof(AnimationCreatorWindow)
84
- );
85
- EditorGUILayout.PropertyField(_spriteNameRegexProp);
86
- EditorGUILayout.PropertyField(_textProp);
87
-
88
- if (!string.IsNullOrWhiteSpace(_errorMessage))
89
- {
90
- EditorGUILayout.HelpBox(_errorMessage, MessageType.Error);
91
- }
92
- else if (
93
- _animationSourcesProp.arraySize == 0
94
- || _animationSourcesProp.FindPropertyRelative("Array.size").intValue == 0
95
- || animationSources.TrueForAll(Objects.Null)
96
- )
97
- {
98
- EditorGUILayout.HelpBox(
99
- "Please specify at least one Animation Source (folder).",
100
- MessageType.Error
101
- );
102
- }
103
-
104
- EditorGUILayout.Space();
105
- EditorGUILayout.LabelField("Animation Data", EditorStyles.boldLabel);
106
- _searchString = EditorGUILayout.TextField("Search Animation Name", _searchString);
107
-
108
- DrawFilteredAnimationData();
109
-
110
- EditorGUILayout.Space();
111
- EditorGUILayout.LabelField("Sprite Filter Status", EditorStyles.boldLabel);
112
- EditorGUILayout.LabelField("Regex Pattern:", spriteNameRegex);
113
- EditorGUILayout.LabelField("Matched Sprites:", _matchedSpriteCount.ToString());
114
- EditorGUILayout.LabelField("Unmatched Sprites:", _unmatchedSpriteCount.ToString());
115
-
116
- EditorGUILayout.Space();
117
- EditorGUILayout.LabelField("Actions", EditorStyles.boldLabel);
118
-
119
- DrawActionButtons();
120
-
121
- EditorGUILayout.EndScrollView();
122
-
123
- _ = _serializedObject.ApplyModifiedProperties();
124
- }
125
-
126
- private void DrawCheckSpritesButton()
127
- {
128
- if (GUILayout.Button("Check/Refresh Filtered Sprites"))
129
- {
130
- UpdateRegex();
131
- FindAndFilterSprites();
132
- Repaint();
133
- }
134
- }
135
-
136
- private void DrawFilteredAnimationData()
137
- {
138
- int listSize = _animationDataProp.arraySize;
139
- string[] searchTerms = string.IsNullOrWhiteSpace(_searchString)
140
- ? Array.Empty<string>()
141
- : _searchString.Split(WhiteSpaceSplitters, StringSplitOptions.RemoveEmptyEntries);
142
-
143
- List<int> matchingIndices = new();
144
- for (int i = 0; i < listSize; ++i)
145
- {
146
- SerializedProperty elementProp = _animationDataProp.GetArrayElementAtIndex(i);
147
- SerializedProperty nameProp = elementProp.FindPropertyRelative(
148
- nameof(AnimationData.animationName)
149
- );
150
-
151
- string currentName =
152
- nameProp != null ? nameProp.stringValue ?? string.Empty : string.Empty;
153
-
154
- bool matchesSearch = true;
155
- if (searchTerms.Length > 0)
156
- {
157
- matchesSearch = searchTerms.All(term =>
158
- currentName.Contains(term, StringComparison.OrdinalIgnoreCase)
159
- );
160
- }
161
-
162
- if (matchesSearch)
163
- {
164
- matchingIndices.Add(i);
165
- }
166
- }
167
- int matchCount = matchingIndices.Count;
168
- string foldoutLabel =
169
- $"{_animationDataProp.displayName} (Showing {matchCount} / {listSize})";
170
- _animationDataIsExpanded = EditorGUILayout.Foldout(
171
- _animationDataIsExpanded,
172
- foldoutLabel,
173
- true
174
- );
175
-
176
- if (_animationDataIsExpanded)
177
- {
178
- using EditorGUI.IndentLevelScope indent = new();
179
- if (matchCount > 0)
180
- {
181
- foreach (int index in matchingIndices)
182
- {
183
- SerializedProperty elementProp = _animationDataProp.GetArrayElementAtIndex(
184
- index
185
- );
186
-
187
- SerializedProperty nameProp = elementProp.FindPropertyRelative(
188
- nameof(AnimationData.animationName)
189
- );
190
- string currentName =
191
- nameProp != null ? nameProp.stringValue ?? string.Empty : string.Empty;
192
- string labelText = string.IsNullOrWhiteSpace(currentName)
193
- ? $"Element {index} (No Name)"
194
- : currentName;
195
-
196
- EditorGUILayout.PropertyField(elementProp, new GUIContent(labelText), true);
197
- }
198
- }
199
- else if (listSize > 0)
200
- {
201
- EditorGUILayout.HelpBox(
202
- $"No animation data matched the search term '{_searchString}'.",
203
- MessageType.Info
204
- );
205
- }
206
- }
207
- }
208
-
209
- private void DrawActionButtons()
210
- {
211
- DrawCheckSpritesButton();
212
- EditorGUILayout.Space();
213
- EditorGUILayout.LabelField("Actions", EditorStyles.boldLabel);
214
- using (new EditorGUI.DisabledScope(_filteredSprites.Count == 0))
215
- {
216
- if (
217
- GUILayout.Button(
218
- $"Populate First Slot with {_filteredSprites.Count} Matched Sprites"
219
- )
220
- )
221
- {
222
- if (animationData.Count == 0)
223
- {
224
- this.LogWarn($"Add at least one Animation Data entry first.");
225
- }
226
- else if (animationData[0].frames.Count > 0)
227
- {
228
- if (
229
- !EditorUtility.DisplayDialog(
230
- "Confirm Overwrite",
231
- "This will replace the frames currently in the first animation slot. Are you sure?",
232
- "Replace",
233
- "Cancel"
234
- )
235
- )
236
- {
237
- return;
238
- }
239
- }
240
- if (animationData.Count > 0)
241
- {
242
- animationData[0].frames = new List<Sprite>(_filteredSprites);
243
- animationData[0].animationName = "All_Matched_Sprites";
244
- animationData[0].isCreatedFromAutoParse = false;
245
- _serializedObject.Update();
246
- Repaint();
247
- this.Log($"Populated first slot with {_filteredSprites.Count} sprites.");
248
- }
249
- }
250
-
251
- if (GUILayout.Button("Auto-Parse Matched Sprites into Animations"))
252
- {
253
- if (
254
- EditorUtility.DisplayDialog(
255
- "Confirm Auto-Parse",
256
- "This will replace the current animation list with animations generated from matched sprites based on their names (e.g., 'Player_Run_0', 'Player_Run_1'). Are you sure?",
257
- "Parse",
258
- "Cancel"
259
- )
260
- )
261
- {
262
- AutoParseSprites();
263
- _serializedObject.Update();
264
- Repaint();
265
- }
266
- }
267
- }
268
-
269
- if (GUILayout.Button("Create new Animation Data"))
270
- {
271
- animationData.Add(new AnimationData());
272
- _serializedObject.Update();
273
- Repaint();
274
- }
275
-
276
- if (_filteredSprites.Count == 0)
277
- {
278
- EditorGUILayout.HelpBox(
279
- "Cannot perform sprite actions: No sprites matched the filter criteria or sources are empty.",
280
- MessageType.Info
281
- );
282
- }
283
-
284
- bool canBulkName =
285
- animationData is { Count: > 0 }
286
- && animationData.Any(data => data.frames?.Count > 0)
287
- && !string.IsNullOrWhiteSpace(text);
288
-
289
- using (new EditorGUI.DisabledScope(!canBulkName))
290
- {
291
- EditorGUILayout.Space();
292
- EditorGUILayout.LabelField("Bulk Naming Operations", EditorStyles.boldLabel);
293
-
294
- if (GUILayout.Button($"Append '{text}' To All Animation Names"))
295
- {
296
- bool changed = false;
297
- foreach (AnimationData data in animationData)
298
- {
299
- if (
300
- !string.IsNullOrWhiteSpace(data.animationName)
301
- && !data.animationName.EndsWith($"_{text}")
302
- )
303
- {
304
- data.animationName += $"_{text}";
305
- changed = true;
306
- }
307
- }
308
- if (changed)
309
- {
310
- this.Log($"Appended '{text}' to animation names.");
311
- _serializedObject.Update();
312
- Repaint();
313
- }
314
- else
315
- {
316
- this.LogWarn(
317
- $"No animation names modified. Either none exist or they already end with '_{text}'."
318
- );
319
- }
320
- }
321
-
322
- if (GUILayout.Button($"Remove '{text}' From End of Names"))
323
- {
324
- bool changed = false;
325
- string suffix = $"_{text}";
326
- foreach (AnimationData data in animationData)
327
- {
328
- if (
329
- !string.IsNullOrWhiteSpace(data.animationName)
330
- && data.animationName.EndsWith(suffix)
331
- )
332
- {
333
- data.animationName = data.animationName.Remove(
334
- data.animationName.Length - suffix.Length
335
- );
336
- changed = true;
337
- }
338
- else if (
339
- !string.IsNullOrWhiteSpace(data.animationName)
340
- && data.animationName.EndsWith(text)
341
- )
342
- {
343
- data.animationName = data.animationName.Remove(
344
- data.animationName.Length - text.Length
345
- );
346
- changed = true;
347
- }
348
- }
349
- if (changed)
350
- {
351
- this.Log($"Removed '{text}' suffix from animation names.");
352
- _serializedObject.Update();
353
- Repaint();
354
- }
355
- else
356
- {
357
- this.LogWarn(
358
- $"No animation names modified. Either none exist or they do not end with '{text}' or '_{text}'."
359
- );
360
- }
361
- }
362
- }
363
-
364
- if (
365
- !canBulkName
366
- && animationData is { Count: > 0 }
367
- && animationData.Any(data => data.frames?.Count > 0)
368
- )
369
- {
370
- EditorGUILayout.HelpBox(
371
- "Enter text in the 'Text' field above to enable bulk naming operations.",
372
- MessageType.Info
373
- );
374
- }
375
-
376
- EditorGUILayout.Space();
377
- using (new EditorGUI.DisabledScope(animationData is not { Count: > 0 }))
378
- {
379
- if (GUILayout.Button("Create Animations"))
380
- {
381
- CreateAnimations();
382
- }
383
- }
384
- if (animationData is not { Count: > 0 })
385
- {
386
- EditorGUILayout.HelpBox(
387
- "Add Animation Data entries before creating.",
388
- MessageType.Warning
389
- );
390
- }
391
- }
392
-
393
- private void CreateAnimations()
394
- {
395
- if (animationData is not { Count: > 0 })
396
- {
397
- this.LogError($"No animation data to create.");
398
- return;
399
- }
400
-
401
- string[] searchTerms = string.IsNullOrWhiteSpace(_searchString)
402
- ? Array.Empty<string>()
403
- : _searchString
404
- .ToLowerInvariant()
405
- .Split(new[] { ' ', '\t', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
406
-
407
- List<AnimationData> dataToCreate = new();
408
- if (searchTerms.Length == 0)
409
- {
410
- dataToCreate.AddRange(animationData);
411
- }
412
- else
413
- {
414
- foreach (AnimationData data in animationData)
415
- {
416
- string lowerName = (data.animationName ?? string.Empty).ToLowerInvariant();
417
- if (searchTerms.All(term => lowerName.Contains(term)))
418
- {
419
- dataToCreate.Add(data);
420
- }
421
- }
422
- this.Log(
423
- $"Creating animations based on current search filter '{_searchString}'. Only {dataToCreate.Count} out of {animationData.Count} items will be processed."
424
- );
425
- }
426
-
427
- if (dataToCreate.Count == 0)
428
- {
429
- this.LogError(
430
- $"No animation data matches the current search filter '{_searchString}'. Nothing to create."
431
- );
432
- return;
433
- }
434
-
435
- int totalAnimations = dataToCreate.Count;
436
- int currentAnimationIndex = 0;
437
- bool errorOccurred = false;
438
-
439
- AssetDatabase.StartAssetEditing();
440
- try
441
- {
442
- foreach (AnimationData data in dataToCreate)
443
- {
444
- currentAnimationIndex++;
445
- string animationName = data.animationName;
446
- if (string.IsNullOrWhiteSpace(animationName))
447
- {
448
- this.LogWarn(
449
- $"Ignoring animation data entry (original index unknown due to filtering) without an animation name."
450
- );
451
- continue;
452
- }
453
-
454
- EditorUtility.DisplayProgressBar(
455
- "Creating Animations",
456
- $"Processing '{animationName}' ({currentAnimationIndex}/{totalAnimations})",
457
- (float)currentAnimationIndex / totalAnimations
458
- );
459
-
460
- float framesPerSecond = data.framesPerSecond;
461
- if (framesPerSecond <= 0)
462
- {
463
- this.LogWarn(
464
- $"Ignoring animation '{animationName}' with invalid FPS ({framesPerSecond})."
465
- );
466
- continue;
467
- }
468
-
469
- List<Sprite> frames = data.frames;
470
- if (frames is not { Count: > 0 })
471
- {
472
- this.LogWarn(
473
- $"Ignoring animation '{animationName}' because it has no frames."
474
- );
475
- continue;
476
- }
477
-
478
- List<Sprite> validFrames = frames.Where(f => f != null).ToList();
479
- if (validFrames.Count == 0)
480
- {
481
- this.LogWarn(
482
- $"Ignoring animation '{animationName}' because it only contains null frames."
483
- );
484
- continue;
485
- }
486
-
487
- validFrames.Sort((s1, s2) => EditorUtility.NaturalCompare(s1.name, s2.name));
488
-
489
- List<ObjectReferenceKeyframe> keyFrames = new(validFrames.Count);
490
- float timeStep = 1f / framesPerSecond;
491
- float currentTime = 0f;
492
-
493
- foreach (
494
- ObjectReferenceKeyframe keyFrame in validFrames.Select(
495
- sprite => new ObjectReferenceKeyframe
496
- {
497
- time = currentTime,
498
- value = sprite,
499
- }
500
- )
501
- )
502
- {
503
- keyFrames.Add(keyFrame);
504
- currentTime += timeStep;
505
- }
506
-
507
- if (keyFrames.Count <= 0)
508
- {
509
- this.LogWarn(
510
- $"No valid keyframes could be generated for animation '{animationName}'."
511
- );
512
- continue;
513
- }
514
-
515
- AnimationClip animationClip = new() { frameRate = framesPerSecond };
516
-
517
- if (data.loop)
518
- {
519
- AnimationClipSettings settings = AnimationUtility.GetAnimationClipSettings(
520
- animationClip
521
- );
522
- settings.loopTime = true;
523
- AnimationUtility.SetAnimationClipSettings(animationClip, settings);
524
- }
525
-
526
- AnimationUtility.SetObjectReferenceCurve(
527
- animationClip,
528
- EditorCurveBinding.PPtrCurve("", typeof(SpriteRenderer), "m_Sprite"),
529
- keyFrames.ToArray()
530
- );
531
-
532
- string firstFramePath = AssetDatabase.GetAssetPath(validFrames[0]);
533
- string assetPath =
534
- Path.GetDirectoryName(firstFramePath).SanitizePath() ?? "Assets";
535
- if (!assetPath.EndsWith("/"))
536
- {
537
- assetPath += "/";
538
- }
539
-
540
- string finalPath = AssetDatabase.GenerateUniqueAssetPath(
541
- $"{assetPath}{animationName}.anim"
542
- );
543
- AssetDatabase.CreateAsset(animationClip, finalPath);
544
- this.Log($"Created animation at '{finalPath}'.");
545
- }
546
- }
547
- catch (Exception e)
548
- {
549
- errorOccurred = true;
550
- this.LogError($"An error occurred during animation creation: {e}");
551
- }
552
- finally
553
- {
554
- EditorUtility.ClearProgressBar();
555
- if (!errorOccurred)
556
- {
557
- this.Log($"Finished creating {totalAnimations} animations.");
558
- }
559
- else
560
- {
561
- this.LogError($"Animation creation finished with errors. Check console.");
562
- }
563
-
564
- AssetDatabase.StopAssetEditing();
565
- AssetDatabase.SaveAssets();
566
- AssetDatabase.Refresh();
567
- }
568
- }
569
-
570
- private void UpdateRegex()
571
- {
572
- if (_compiledRegex == null || _lastUsedRegex != spriteNameRegex)
573
- {
574
- try
575
- {
576
- _compiledRegex = new Regex(spriteNameRegex, RegexOptions.Compiled);
577
- _lastUsedRegex = spriteNameRegex;
578
- _errorMessage = "";
579
- this.Log($"Regex updated to: {spriteNameRegex}");
580
- }
581
- catch (ArgumentException ex)
582
- {
583
- _compiledRegex = null;
584
- _lastUsedRegex = spriteNameRegex;
585
- _errorMessage = $"Invalid Regex: {ex.Message}";
586
- this.LogError($"Invalid Regex '{spriteNameRegex}': {ex.Message}");
587
- }
588
- }
589
- }
590
-
591
- private void FindAndFilterSprites()
592
- {
593
- _filteredSprites.Clear();
594
- _matchedSpriteCount = 0;
595
- _unmatchedSpriteCount = 0;
596
-
597
- if (animationSources is not { Count: > 0 } || _compiledRegex == null)
598
- {
599
- if (_compiledRegex == null && !string.IsNullOrWhiteSpace(spriteNameRegex))
600
- {
601
- this.LogWarn(
602
- $"Cannot find sprites, regex pattern '{spriteNameRegex}' is invalid."
603
- );
604
- }
605
- else if (animationSources is not { Count: > 0 })
606
- {
607
- this.LogWarn($"Cannot find sprites, no animation sources specified.");
608
- }
609
- return;
610
- }
611
-
612
- List<string> searchPaths = new();
613
- foreach (Object source in animationSources.Where(Objects.NotNull))
614
- {
615
- string path = AssetDatabase.GetAssetPath(source);
616
- if (!string.IsNullOrWhiteSpace(path) && AssetDatabase.IsValidFolder(path))
617
- {
618
- searchPaths.Add(path);
619
- }
620
- else if (source != null)
621
- {
622
- this.LogWarn($"Source '{source.name}' is not a valid folder. Skipping.");
623
- }
624
- }
625
-
626
- if (searchPaths.Count == 0)
627
- {
628
- this.LogWarn($"No valid folders found in Animation Sources.");
629
- return;
630
- }
631
-
632
- string[] assetGuids = AssetDatabase.FindAssets("t:sprite", searchPaths.ToArray());
633
- float totalAssets = assetGuids.Length;
634
- this.Log($"Found {totalAssets} total sprite assets in specified paths.");
635
-
636
- try
637
- {
638
- EditorUtility.DisplayProgressBar(
639
- "Finding and Filtering Sprites",
640
- $"Scanning {assetGuids.Length} assets...",
641
- 0f
642
- );
643
-
644
- for (int i = 0; i < totalAssets; i++)
645
- {
646
- string guid = assetGuids[i];
647
- string path = AssetDatabase.GUIDToAssetPath(guid);
648
-
649
- if (i % 20 == 0 || Mathf.Approximately(i, totalAssets - 1))
650
- {
651
- float progress = (i + 1) / totalAssets;
652
- EditorUtility.DisplayProgressBar(
653
- "Finding and Filtering Sprites",
654
- $"Checking: {Path.GetFileName(path)} ({i + 1}/{assetGuids.Length})",
655
- progress
656
- );
657
- }
658
-
659
- Sprite sprite = AssetDatabase.LoadAssetAtPath<Sprite>(path);
660
-
661
- if (sprite != null)
662
- {
663
- if (_compiledRegex.IsMatch(sprite.name))
664
- {
665
- _filteredSprites.Add(sprite);
666
- _matchedSpriteCount++;
667
- }
668
- else
669
- {
670
- _unmatchedSpriteCount++;
671
- }
672
- }
673
- }
674
- this.Log(
675
- $"Sprite filtering complete. Matched: {_matchedSpriteCount}, Unmatched: {_unmatchedSpriteCount}."
676
- );
677
- }
678
- finally
679
- {
680
- EditorUtility.ClearProgressBar();
681
- }
682
- }
683
-
684
- private void AutoParseSprites()
685
- {
686
- if (_filteredSprites.Count == 0)
687
- {
688
- this.LogWarn($"Cannot Auto-Parse, no matched sprites available.");
689
- return;
690
- }
691
-
692
- Dictionary<string, Dictionary<string, List<Sprite>>> spritesByPrefixAndAssetPath = new(
693
- StringComparer.Ordinal
694
- );
695
- int totalSprites = _filteredSprites.Count;
696
- int processedCount = 0;
697
- this.Log($"Starting auto-parse for {_filteredSprites.Count} matched sprites.");
698
-
699
- try
700
- {
701
- foreach (Sprite sprite in _filteredSprites)
702
- {
703
- processedCount++;
704
- if (processedCount % 10 == 0 || processedCount == totalSprites)
705
- {
706
- EditorUtility.DisplayProgressBar(
707
- "Auto-Parsing Sprites",
708
- $"Processing: {sprite.name} ({processedCount}/{totalSprites})",
709
- (float)processedCount / totalSprites
710
- );
711
- }
712
-
713
- string assetPath = AssetDatabase.GetAssetPath(sprite);
714
- string directoryPath = Path.GetDirectoryName(assetPath).SanitizePath() ?? "";
715
- string frameName = sprite.name;
716
-
717
- int splitIndex = frameName.LastIndexOf('_');
718
- string prefix = frameName;
719
-
720
- if (splitIndex > 0 && splitIndex < frameName.Length - 1)
721
- {
722
- bool allDigitsAfter = true;
723
- for (int j = splitIndex + 1; j < frameName.Length; j++)
724
- {
725
- if (!char.IsDigit(frameName[j]))
726
- {
727
- allDigitsAfter = false;
728
- break;
729
- }
730
- }
731
-
732
- if (allDigitsAfter)
733
- {
734
- prefix = frameName.Substring(0, splitIndex);
735
- }
736
- else
737
- {
738
- prefix = frameName;
739
- this.LogWarn(
740
- $"Sprite name '{frameName}' has an underscore but not only digits after the last one. Treating as single frame or check naming."
741
- );
742
- }
743
- }
744
- else if (splitIndex == -1)
745
- {
746
- prefix = frameName;
747
- this.LogWarn(
748
- $"Sprite name '{frameName}' has no underscore. Treating as single frame or check naming."
749
- );
750
- }
751
-
752
- if (!string.IsNullOrWhiteSpace(prefix))
753
- {
754
- if (
755
- !spritesByPrefixAndAssetPath.TryGetValue(
756
- directoryPath,
757
- out Dictionary<string, List<Sprite>> spritesByPrefix
758
- )
759
- )
760
- {
761
- spritesByPrefix = new Dictionary<string, List<Sprite>>(
762
- StringComparer.Ordinal
763
- );
764
- spritesByPrefixAndAssetPath.Add(directoryPath, spritesByPrefix);
765
- }
766
-
767
- spritesByPrefix.GetOrAdd(prefix).Add(sprite);
768
- }
769
- else
770
- {
771
- this.LogWarn(
772
- $"Could not extract valid prefix for frame '{frameName}' at path '{assetPath}'. Skipping."
773
- );
774
- }
775
- }
776
-
777
- if (spritesByPrefixAndAssetPath.Count > 0)
778
- {
779
- int removedCount = animationData.RemoveAll(data => data.isCreatedFromAutoParse);
780
- this.Log($"Removed {removedCount} previously auto-parsed animation entries.");
781
-
782
- int addedCount = 0;
783
- foreach (
784
- KeyValuePair<
785
- string,
786
- Dictionary<string, List<Sprite>>
787
- > kvpAssetPath in spritesByPrefixAndAssetPath
788
- )
789
- {
790
- string dirName = new DirectoryInfo(kvpAssetPath.Key).Name;
791
-
792
- foreach ((string key, List<Sprite> spritesInGroup) in kvpAssetPath.Value)
793
- {
794
- if (spritesInGroup.Count == 0)
795
- {
796
- continue;
797
- }
798
-
799
- spritesInGroup.Sort(
800
- (s1, s2) => EditorUtility.NaturalCompare(s1.name, s2.name)
801
- );
802
-
803
- string finalAnimName;
804
-
805
- bool keyIsLikelyFullName =
806
- spritesInGroup.Count > 0 && key == spritesInGroup[0].name;
807
-
808
- if (keyIsLikelyFullName)
809
- {
810
- int lastUnderscore = key.LastIndexOf('_');
811
-
812
- if (lastUnderscore > 0 && lastUnderscore < key.Length - 1)
813
- {
814
- string suffix = key.Substring(lastUnderscore + 1);
815
- finalAnimName = SanitizeName($"Anim_{suffix}");
816
- this.Log(
817
- $"Naming non-standard sprite group '{key}' as '{finalAnimName}' using suffix '{suffix}'."
818
- );
819
- }
820
- else
821
- {
822
- finalAnimName = SanitizeName($"Anim_{key}");
823
- this.LogWarn(
824
- $"Naming non-standard sprite group '{key}' as '{finalAnimName}'. Could not extract suffix."
825
- );
826
- }
827
- }
828
- else
829
- {
830
- finalAnimName = SanitizeName($"Anim_{key}");
831
- this.Log(
832
- $"Naming standard sprite group '{key}' as '{finalAnimName}'."
833
- );
834
- }
835
-
836
- animationData.Add(
837
- new AnimationData
838
- {
839
- frames = spritesInGroup,
840
- framesPerSecond = AnimationData.DefaultFramesPerSecond,
841
- animationName = finalAnimName,
842
- isCreatedFromAutoParse = true,
843
- loop = false,
844
- }
845
- );
846
- addedCount++;
847
- }
848
- }
849
-
850
- this.Log($"Auto-parsed into {addedCount} new animation groups.");
851
- }
852
- else
853
- {
854
- this.LogWarn(
855
- $"Auto-parsing did not result in any animation groups. Check sprite naming conventions (e.g., 'Prefix_0', 'Prefix_1')."
856
- );
857
- }
858
- }
859
- finally
860
- {
861
- EditorUtility.ClearProgressBar();
862
- _serializedObject.Update();
863
- }
864
- }
865
-
866
- private static string SanitizeName(string inputName)
867
- {
868
- inputName = inputName.Replace(" ", "_");
869
- inputName = Regex.Replace(inputName, @"[^a-zA-Z0-9_]", "");
870
-
871
- if (string.IsNullOrWhiteSpace(inputName))
872
- {
873
- return "Default_Animation";
874
- }
875
-
876
- return inputName.Trim('_');
877
- }
878
- }
879
-
880
- #endif
881
- }
1
+ namespace WallstopStudios.UnityHelpers.Editor.Sprites
2
+ {
3
+ #if UNITY_EDITOR
4
+ using System;
5
+ using System.Collections.Generic;
6
+ using System.IO;
7
+ using System.Linq;
8
+ using System.Text.RegularExpressions;
9
+ using UnityEditor;
10
+ using UnityEngine;
11
+ using CustomEditors;
12
+ using WallstopStudios.UnityHelpers.Core.Extension;
13
+ using WallstopStudios.UnityHelpers.Core.Helper;
14
+ using WallstopStudios.UnityHelpers.Utils;
15
+ using Object = UnityEngine.Object;
16
+
17
+ [Serializable]
18
+ public sealed class AnimationData
19
+ {
20
+ public const float DefaultFramesPerSecond = 12;
21
+
22
+ public List<Sprite> frames = new();
23
+ public float framesPerSecond = DefaultFramesPerSecond;
24
+ public string animationName = string.Empty;
25
+ public bool isCreatedFromAutoParse;
26
+ public bool loop;
27
+ }
28
+
29
+ /// <summary>
30
+ /// Builds AnimationClips from sprites using flexible grouping and naming rules. Supports
31
+ /// auto-parsing by folders, regex-based grouping, duplicate-resolution, dry-run previews, and
32
+ /// optional case-insensitive grouping.
33
+ /// </summary>
34
+ /// <remarks>
35
+ /// <para>
36
+ /// Problems this solves: turning folder(s) of sprites into one or many consistent
37
+ /// <see cref="AnimationClip"/> assets with predictable names and frame rates.
38
+ /// </para>
39
+ /// <para>
40
+ /// How it works: choose directories and a sprite name regex; optionally supply custom group
41
+ /// regex with named groups <c>base</c>/<c>index</c> or rely on common patterns
42
+ /// (e.g., name_01, name (2), name3). Configure per-animation FPS, loop flag, and naming
43
+ /// prefixes/suffixes. Use Calculate/Dry-Run sections to preview results before generating.
44
+ /// </para>
45
+ /// <para>
46
+ /// Pros: reproducible clip creation, battle-tested grouping heuristics, detailed previews.
47
+ /// Caveats: ensure regex correctness; strict numeric ordering can be toggled when mixed digits
48
+ /// produce undesired lexicographic ordering.
49
+ /// </para>
50
+ /// <example>
51
+ /// <![CDATA[
52
+ /// // Open via menu: Tools/Wallstop Studios/Unity Helpers/Animation Creator
53
+ /// // Example filter: ^Enemy_(?<base>Walk)_(?<index>\d+)$
54
+ /// // Add folders, enable "Resolve Duplicate Animation Names" to avoid conflicts,
55
+ /// // then Generate to create .anim files under a chosen folder.
56
+ /// ]]>
57
+ /// </example>
58
+ public sealed class AnimationCreatorWindow : EditorWindow
59
+ {
60
+ private static readonly char[] WhiteSpaceSplitters = { ' ', '\t', '\n', '\r' };
61
+
62
+ private SerializedObject _serializedObject;
63
+ private SerializedProperty _animationDataProp;
64
+ private SerializedProperty _animationSourcesProp;
65
+ private SerializedProperty _spriteNameRegexProp;
66
+ private SerializedProperty _textProp;
67
+ private SerializedProperty _autoRefreshProp;
68
+ private SerializedProperty _groupingCaseInsensitiveProp;
69
+ private SerializedProperty _includeFolderNameProp;
70
+ private SerializedProperty _includeFullFolderPathProp;
71
+ private SerializedProperty _autoParseNamePrefixProp;
72
+ private SerializedProperty _autoParseNameSuffixProp;
73
+ private SerializedProperty _useCustomGroupRegexProp;
74
+ private SerializedProperty _customGroupRegexProp;
75
+ private SerializedProperty _customGroupRegexIgnoreCaseProp;
76
+ private SerializedProperty _resolveDuplicateNamesProp;
77
+ private SerializedProperty _regexTestInputProp;
78
+ private SerializedProperty _strictNumericOrderingProp;
79
+
80
+ public List<AnimationData> animationData = new();
81
+ public List<Object> animationSources = new();
82
+ public string spriteNameRegex = ".*";
83
+ public string text;
84
+ public bool autoRefresh = true;
85
+ public bool groupingCaseInsensitive = true;
86
+ public bool includeFolderNameInAnimName;
87
+ public bool includeFullFolderPathInAnimName;
88
+ public string autoParseNamePrefix = string.Empty;
89
+ public string autoParseNameSuffix = string.Empty;
90
+ public bool useCustomGroupRegex;
91
+ public string customGroupRegex = string.Empty;
92
+ public bool customGroupRegexIgnoreCase = true;
93
+ public bool resolveDuplicateAnimationNames = true;
94
+ public string regexTestInput = string.Empty;
95
+ public bool strictNumericOrdering = false;
96
+
97
+ [HideInInspector]
98
+ [SerializeField]
99
+ private List<Sprite> _filteredSprites = new();
100
+ private int _matchedSpriteCount;
101
+ private int _unmatchedSpriteCount;
102
+ private Regex _compiledRegex;
103
+ private string _lastUsedRegex;
104
+ private string _searchString = string.Empty;
105
+ private Vector2 _scrollPosition;
106
+ private string _errorMessage = string.Empty;
107
+ private Regex _compiledGroupRegex;
108
+ private string _lastGroupRegex;
109
+ private string _groupRegexErrorMessage = string.Empty;
110
+ private int _lastSourcesHash;
111
+ private bool _animationDataIsExpanded = true;
112
+ private bool _autoParsePreviewExpanded = false;
113
+ private bool _autoParseDryRunExpanded = false;
114
+
115
+ private sealed class AutoParsePreviewRecord
116
+ {
117
+ public string folder;
118
+ public string baseName;
119
+ public int count;
120
+ public bool hasIndex;
121
+ }
122
+
123
+ private readonly List<AutoParsePreviewRecord> _autoParsePreview = new();
124
+
125
+ private sealed class AutoParseDryRunRecord
126
+ {
127
+ public string folderPath;
128
+ public string finalName;
129
+ public string finalAssetPath;
130
+ public int count;
131
+ public bool hasIndex;
132
+ public bool duplicateResolved;
133
+ }
134
+
135
+ private readonly List<AutoParseDryRunRecord> _autoParseDryRun = new();
136
+
137
+ private static readonly Regex s_ParenIndexRegex = new(
138
+ @"^(?<base>.*?)[\s]*\(\s*(?<index>\d+)\s*\)\s*$",
139
+ RegexOptions.Compiled | RegexOptions.CultureInvariant
140
+ );
141
+ private static readonly Regex s_SeparatorIndexRegex = new(
142
+ @"^(?<base>.*?)[_\-\.\s]+(?<index>\d+)$",
143
+ RegexOptions.Compiled | RegexOptions.CultureInvariant
144
+ );
145
+ private static readonly Regex s_TrailingIndexRegex = new(
146
+ @"^(?<base>.*?)(?<index>\d+)$",
147
+ RegexOptions.Compiled | RegexOptions.CultureInvariant
148
+ );
149
+
150
+ [MenuItem("Tools/Wallstop Studios/Unity Helpers/Animation Creator", priority = -3)]
151
+ public static void ShowWindow()
152
+ {
153
+ GetWindow<AnimationCreatorWindow>("Animation Creator");
154
+ }
155
+
156
+ private void OnEnable()
157
+ {
158
+ _serializedObject = new SerializedObject(this);
159
+ _animationDataProp = _serializedObject.FindProperty(nameof(animationData));
160
+ _animationSourcesProp = _serializedObject.FindProperty(nameof(animationSources));
161
+ _spriteNameRegexProp = _serializedObject.FindProperty(nameof(spriteNameRegex));
162
+ _textProp = _serializedObject.FindProperty(nameof(text));
163
+ _autoRefreshProp = _serializedObject.FindProperty(nameof(autoRefresh));
164
+ _groupingCaseInsensitiveProp = _serializedObject.FindProperty(
165
+ nameof(groupingCaseInsensitive)
166
+ );
167
+ _includeFolderNameProp = _serializedObject.FindProperty(
168
+ nameof(includeFolderNameInAnimName)
169
+ );
170
+ _includeFullFolderPathProp = _serializedObject.FindProperty(
171
+ nameof(includeFullFolderPathInAnimName)
172
+ );
173
+ _autoParseNamePrefixProp = _serializedObject.FindProperty(nameof(autoParseNamePrefix));
174
+ _autoParseNameSuffixProp = _serializedObject.FindProperty(nameof(autoParseNameSuffix));
175
+ _useCustomGroupRegexProp = _serializedObject.FindProperty(nameof(useCustomGroupRegex));
176
+ _customGroupRegexProp = _serializedObject.FindProperty(nameof(customGroupRegex));
177
+ _customGroupRegexIgnoreCaseProp = _serializedObject.FindProperty(
178
+ nameof(customGroupRegexIgnoreCase)
179
+ );
180
+ _resolveDuplicateNamesProp = _serializedObject.FindProperty(
181
+ nameof(resolveDuplicateAnimationNames)
182
+ );
183
+ _regexTestInputProp = _serializedObject.FindProperty(nameof(regexTestInput));
184
+ _strictNumericOrderingProp = _serializedObject.FindProperty(
185
+ nameof(strictNumericOrdering)
186
+ );
187
+
188
+ UpdateRegex();
189
+ UpdateGroupRegex();
190
+ FindAndFilterSprites();
191
+ _lastSourcesHash = ComputeSourcesHash();
192
+ Repaint();
193
+ }
194
+
195
+ private void OnGUI()
196
+ {
197
+ _serializedObject.Update();
198
+
199
+ _scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition);
200
+
201
+ EditorGUILayout.LabelField("Configuration", EditorStyles.boldLabel);
202
+ PersistentDirectoryGUI.PathSelectorObjectArray(
203
+ _animationSourcesProp,
204
+ nameof(AnimationCreatorWindow)
205
+ );
206
+ EditorGUILayout.PropertyField(_spriteNameRegexProp);
207
+ EditorGUILayout.PropertyField(_textProp);
208
+ EditorGUILayout.PropertyField(_autoRefreshProp, new GUIContent("Auto Refresh Filter"));
209
+
210
+ EditorGUILayout.Space();
211
+ EditorGUILayout.LabelField("Grouping & Naming", EditorStyles.boldLabel);
212
+ EditorGUILayout.PropertyField(
213
+ _groupingCaseInsensitiveProp,
214
+ new GUIContent("Case-Insensitive Grouping")
215
+ );
216
+ EditorGUILayout.PropertyField(
217
+ _includeFolderNameProp,
218
+ new GUIContent("Prefix Leaf Folder Name")
219
+ );
220
+ EditorGUILayout.PropertyField(
221
+ _includeFullFolderPathProp,
222
+ new GUIContent("Prefix Full Folder Path")
223
+ );
224
+ EditorGUILayout.PropertyField(
225
+ _autoParseNamePrefixProp,
226
+ new GUIContent("Auto-Parse Name Prefix")
227
+ );
228
+ EditorGUILayout.PropertyField(
229
+ _autoParseNameSuffixProp,
230
+ new GUIContent("Auto-Parse Name Suffix")
231
+ );
232
+ EditorGUILayout.PropertyField(
233
+ _resolveDuplicateNamesProp,
234
+ new GUIContent("Resolve Duplicate Animation Names")
235
+ );
236
+ EditorGUILayout.PropertyField(
237
+ _strictNumericOrderingProp,
238
+ new GUIContent("Strict Numeric Ordering")
239
+ );
240
+
241
+ EditorGUILayout.Space();
242
+ EditorGUILayout.LabelField("Custom Group Regex", EditorStyles.boldLabel);
243
+ EditorGUILayout.PropertyField(
244
+ _useCustomGroupRegexProp,
245
+ new GUIContent("Enable Custom Group Regex")
246
+ );
247
+ using (new EditorGUI.DisabledScope(!_useCustomGroupRegexProp.boolValue))
248
+ {
249
+ EditorGUILayout.PropertyField(
250
+ _customGroupRegexProp,
251
+ new GUIContent("Pattern (?<base>)(?<index>)")
252
+ );
253
+ EditorGUILayout.PropertyField(
254
+ _customGroupRegexIgnoreCaseProp,
255
+ new GUIContent("Ignore Case (Regex)")
256
+ );
257
+ }
258
+
259
+ EditorGUILayout.Space();
260
+ EditorGUILayout.LabelField("Regex Tester", EditorStyles.boldLabel);
261
+ EditorGUILayout.PropertyField(_regexTestInputProp, new GUIContent("Test Input"));
262
+ if (!string.IsNullOrEmpty(regexTestInput))
263
+ {
264
+ if (_compiledRegex != null)
265
+ {
266
+ bool match = _compiledRegex.IsMatch(regexTestInput);
267
+ EditorGUILayout.LabelField("Filter Regex Match:", match ? "Yes" : "No");
268
+ }
269
+ else
270
+ {
271
+ EditorGUILayout.LabelField("Filter Regex Match:", "Invalid Pattern");
272
+ }
273
+
274
+ if (useCustomGroupRegex)
275
+ {
276
+ if (_compiledGroupRegex != null)
277
+ {
278
+ Match m = _compiledGroupRegex.Match(regexTestInput);
279
+ if (m.Success)
280
+ {
281
+ string b = m.Groups["base"].Success ? m.Groups["base"].Value : "";
282
+ string idx = m.Groups["index"].Success ? m.Groups["index"].Value : "";
283
+ EditorGUILayout.LabelField("Custom Group Base:", b);
284
+ EditorGUILayout.LabelField(
285
+ "Custom Group Index:",
286
+ string.IsNullOrEmpty(idx) ? "(none)" : idx
287
+ );
288
+ }
289
+ else
290
+ {
291
+ EditorGUILayout.LabelField("Custom Group Result:", "No match");
292
+ }
293
+ }
294
+ else
295
+ {
296
+ EditorGUILayout.LabelField("Custom Group Result:", "Invalid Pattern");
297
+ }
298
+ }
299
+
300
+ if (TryExtractBaseAndIndex(regexTestInput, out string fbBase, out int fbIndex))
301
+ {
302
+ EditorGUILayout.LabelField("Fallback Base:", fbBase);
303
+ EditorGUILayout.LabelField(
304
+ "Fallback Index:",
305
+ fbIndex >= 0 ? fbIndex.ToString() : "(none)"
306
+ );
307
+ }
308
+ else
309
+ {
310
+ EditorGUILayout.LabelField("Fallback Result:", "No index; base = input");
311
+ }
312
+ }
313
+
314
+ if (!string.IsNullOrWhiteSpace(_errorMessage))
315
+ {
316
+ EditorGUILayout.HelpBox(_errorMessage, MessageType.Error);
317
+ }
318
+ if (!string.IsNullOrWhiteSpace(_groupRegexErrorMessage))
319
+ {
320
+ EditorGUILayout.HelpBox(_groupRegexErrorMessage, MessageType.Error);
321
+ }
322
+ else if (
323
+ _animationSourcesProp.arraySize == 0
324
+ || _animationSourcesProp.FindPropertyRelative("Array.size").intValue == 0
325
+ || animationSources.TrueForAll(val => Objects.Null(val))
326
+ )
327
+ {
328
+ EditorGUILayout.HelpBox(
329
+ "Please specify at least one Animation Source (folder).",
330
+ MessageType.Error
331
+ );
332
+ }
333
+
334
+ EditorGUILayout.Space();
335
+ EditorGUILayout.LabelField("Animation Data", EditorStyles.boldLabel);
336
+ _searchString = EditorGUILayout.TextField("Search Animation Name", _searchString);
337
+
338
+ DrawFilteredAnimationData();
339
+
340
+ EditorGUILayout.Space();
341
+ EditorGUILayout.LabelField("Sprite Filter Status", EditorStyles.boldLabel);
342
+ EditorGUILayout.LabelField("Regex Pattern:", spriteNameRegex);
343
+ EditorGUILayout.LabelField("Matched Sprites:", _matchedSpriteCount.ToString());
344
+ EditorGUILayout.LabelField("Unmatched Sprites:", _unmatchedSpriteCount.ToString());
345
+
346
+ EditorGUILayout.Space();
347
+ EditorGUILayout.LabelField("Actions", EditorStyles.boldLabel);
348
+
349
+ DrawActionButtons();
350
+
351
+ EditorGUILayout.Space();
352
+ EditorGUILayout.LabelField("Auto-Parse Preview", EditorStyles.boldLabel);
353
+ using (new EditorGUI.DisabledScope(_filteredSprites.Count == 0))
354
+ {
355
+ if (GUILayout.Button("Generate Auto-Parse Preview"))
356
+ {
357
+ GenerateAutoParsePreview();
358
+ _autoParsePreviewExpanded = true;
359
+ }
360
+ if (GUILayout.Button("Generate Dry-Run Apply"))
361
+ {
362
+ GenerateAutoParseDryRun();
363
+ _autoParseDryRunExpanded = true;
364
+ }
365
+ }
366
+ if (_filteredSprites.Count == 0)
367
+ {
368
+ EditorGUILayout.HelpBox("No matched sprites to preview.", MessageType.Info);
369
+ }
370
+ _autoParsePreviewExpanded = EditorGUILayout.Foldout(
371
+ _autoParsePreviewExpanded,
372
+ $"Preview Groups ({_autoParsePreview.Count})",
373
+ true
374
+ );
375
+ if (_autoParsePreviewExpanded && _autoParsePreview.Count > 0)
376
+ {
377
+ using (new EditorGUI.IndentLevelScope())
378
+ {
379
+ int shown = 0;
380
+ foreach (AutoParsePreviewRecord rec in _autoParsePreview)
381
+ {
382
+ EditorGUILayout.LabelField(
383
+ $"{rec.folder} / {rec.baseName}",
384
+ $"Frames: {rec.count} | Numeric: {(rec.hasIndex ? "Yes" : "No")}"
385
+ );
386
+ shown++;
387
+ if (shown >= 200)
388
+ {
389
+ EditorGUILayout.LabelField($"Showing first {shown} groups...");
390
+ break;
391
+ }
392
+ }
393
+ }
394
+ }
395
+ _autoParseDryRunExpanded = EditorGUILayout.Foldout(
396
+ _autoParseDryRunExpanded,
397
+ $"Dry-Run Results ({_autoParseDryRun.Count})",
398
+ true
399
+ );
400
+ if (_autoParseDryRunExpanded && _autoParseDryRun.Count > 0)
401
+ {
402
+ using (new EditorGUI.IndentLevelScope())
403
+ {
404
+ int shown = 0;
405
+ foreach (AutoParseDryRunRecord rec in _autoParseDryRun)
406
+ {
407
+ string info =
408
+ $"Name: {rec.finalName} | Frames: {rec.count} | Numeric: {(rec.hasIndex ? "Yes" : "No")}";
409
+ if (rec.duplicateResolved)
410
+ {
411
+ info += " | Renamed to avoid duplicate";
412
+ }
413
+ EditorGUILayout.LabelField(rec.folderPath, info);
414
+ EditorGUILayout.LabelField("→ Asset Path:", rec.finalAssetPath);
415
+ shown++;
416
+ if (shown >= 200)
417
+ {
418
+ EditorGUILayout.LabelField($"Showing first {shown} results...");
419
+ break;
420
+ }
421
+ }
422
+ }
423
+ }
424
+
425
+ EditorGUILayout.EndScrollView();
426
+
427
+ _ = _serializedObject.ApplyModifiedProperties();
428
+
429
+ // Auto refresh behavior at end of GUI to pick up any changed fields
430
+ if (autoRefresh)
431
+ {
432
+ bool regexChanged = _compiledRegex == null || _lastUsedRegex != spriteNameRegex;
433
+ int currentSourcesHash = ComputeSourcesHash();
434
+ bool sourcesChanged = currentSourcesHash != _lastSourcesHash;
435
+ if (regexChanged)
436
+ {
437
+ UpdateRegex();
438
+ }
439
+ if (regexChanged || sourcesChanged)
440
+ {
441
+ _lastSourcesHash = currentSourcesHash;
442
+ FindAndFilterSprites();
443
+ Repaint();
444
+ }
445
+ if (
446
+ _compiledGroupRegex == null
447
+ || _lastGroupRegex != customGroupRegex
448
+ || customGroupRegexIgnoreCase
449
+ != ((_compiledGroupRegex?.Options & RegexOptions.IgnoreCase) != 0)
450
+ )
451
+ {
452
+ UpdateGroupRegex();
453
+ }
454
+ }
455
+ }
456
+
457
+ private void DrawCheckSpritesButton()
458
+ {
459
+ if (GUILayout.Button("Check/Refresh Filtered Sprites"))
460
+ {
461
+ UpdateRegex();
462
+ FindAndFilterSprites();
463
+ Repaint();
464
+ }
465
+ }
466
+
467
+ private void DrawFilteredAnimationData()
468
+ {
469
+ int listSize = _animationDataProp.arraySize;
470
+ string[] searchTerms = string.IsNullOrWhiteSpace(_searchString)
471
+ ? Array.Empty<string>()
472
+ : _searchString.Split(WhiteSpaceSplitters, StringSplitOptions.RemoveEmptyEntries);
473
+
474
+ List<int> matchingIndices = new();
475
+ for (int i = 0; i < listSize; ++i)
476
+ {
477
+ SerializedProperty elementProp = _animationDataProp.GetArrayElementAtIndex(i);
478
+ SerializedProperty nameProp = elementProp.FindPropertyRelative(
479
+ nameof(AnimationData.animationName)
480
+ );
481
+
482
+ string currentName =
483
+ nameProp != null ? nameProp.stringValue ?? string.Empty : string.Empty;
484
+
485
+ bool matchesSearch = true;
486
+ if (searchTerms.Length > 0)
487
+ {
488
+ matchesSearch = searchTerms.All(term =>
489
+ currentName.Contains(term, StringComparison.OrdinalIgnoreCase)
490
+ );
491
+ }
492
+
493
+ if (matchesSearch)
494
+ {
495
+ matchingIndices.Add(i);
496
+ }
497
+ }
498
+ int matchCount = matchingIndices.Count;
499
+ string foldoutLabel =
500
+ $"{_animationDataProp.displayName} (Showing {matchCount} / {listSize})";
501
+ _animationDataIsExpanded = EditorGUILayout.Foldout(
502
+ _animationDataIsExpanded,
503
+ foldoutLabel,
504
+ true
505
+ );
506
+
507
+ if (_animationDataIsExpanded)
508
+ {
509
+ using EditorGUI.IndentLevelScope indent = new();
510
+ if (matchCount > 0)
511
+ {
512
+ foreach (int index in matchingIndices)
513
+ {
514
+ SerializedProperty elementProp = _animationDataProp.GetArrayElementAtIndex(
515
+ index
516
+ );
517
+
518
+ SerializedProperty nameProp = elementProp.FindPropertyRelative(
519
+ nameof(AnimationData.animationName)
520
+ );
521
+ string currentName =
522
+ nameProp != null ? nameProp.stringValue ?? string.Empty : string.Empty;
523
+ string labelText = string.IsNullOrWhiteSpace(currentName)
524
+ ? $"Element {index} (No Name)"
525
+ : currentName;
526
+
527
+ EditorGUILayout.PropertyField(elementProp, new GUIContent(labelText), true);
528
+ }
529
+ }
530
+ else if (listSize > 0)
531
+ {
532
+ EditorGUILayout.HelpBox(
533
+ $"No animation data matched the search term '{_searchString}'.",
534
+ MessageType.Info
535
+ );
536
+ }
537
+ }
538
+ }
539
+
540
+ private void DrawActionButtons()
541
+ {
542
+ DrawCheckSpritesButton();
543
+ EditorGUILayout.Space();
544
+ EditorGUILayout.LabelField("Actions", EditorStyles.boldLabel);
545
+ using (new EditorGUI.DisabledScope(_filteredSprites.Count == 0))
546
+ {
547
+ if (
548
+ GUILayout.Button(
549
+ $"Populate First Slot with {_filteredSprites.Count} Matched Sprites"
550
+ )
551
+ )
552
+ {
553
+ if (animationData.Count == 0)
554
+ {
555
+ this.LogWarn($"Add at least one Animation Data entry first.");
556
+ }
557
+ else if (animationData[0].frames.Count > 0)
558
+ {
559
+ if (
560
+ !Utils.EditorUi.Confirm(
561
+ "Confirm Overwrite",
562
+ "This will replace the frames currently in the first animation slot. Are you sure?",
563
+ "Replace",
564
+ "Cancel",
565
+ defaultWhenSuppressed: true
566
+ )
567
+ )
568
+ {
569
+ return;
570
+ }
571
+ }
572
+ if (animationData.Count > 0)
573
+ {
574
+ animationData[0].frames = new List<Sprite>(_filteredSprites);
575
+ animationData[0].animationName = "All_Matched_Sprites";
576
+ animationData[0].isCreatedFromAutoParse = false;
577
+ _serializedObject.Update();
578
+ Repaint();
579
+ this.Log($"Populated first slot with {_filteredSprites.Count} sprites.");
580
+ }
581
+ }
582
+
583
+ if (GUILayout.Button("Auto-Parse Matched Sprites into Animations"))
584
+ {
585
+ if (
586
+ Utils.EditorUi.Confirm(
587
+ "Confirm Auto-Parse",
588
+ "This will replace the current animation list with animations generated from matched sprites based on their names (e.g., 'Player_Run_0', 'Player_Run_1'). Are you sure?",
589
+ "Parse",
590
+ "Cancel",
591
+ defaultWhenSuppressed: true
592
+ )
593
+ )
594
+ {
595
+ AutoParseSprites();
596
+ _serializedObject.Update();
597
+ Repaint();
598
+ }
599
+ }
600
+ }
601
+
602
+ if (GUILayout.Button("Create new Animation Data"))
603
+ {
604
+ animationData.Add(new AnimationData());
605
+ _serializedObject.Update();
606
+ Repaint();
607
+ }
608
+
609
+ if (_filteredSprites.Count == 0)
610
+ {
611
+ EditorGUILayout.HelpBox(
612
+ "Cannot perform sprite actions: No sprites matched the filter criteria or sources are empty.",
613
+ MessageType.Info
614
+ );
615
+ }
616
+
617
+ bool canBulkName =
618
+ animationData is { Count: > 0 }
619
+ && animationData.Any(data => data.frames?.Count > 0)
620
+ && !string.IsNullOrWhiteSpace(text);
621
+
622
+ using (new EditorGUI.DisabledScope(!canBulkName))
623
+ {
624
+ EditorGUILayout.Space();
625
+ EditorGUILayout.LabelField("Bulk Naming Operations", EditorStyles.boldLabel);
626
+
627
+ if (GUILayout.Button($"Append '{text}' To All Animation Names"))
628
+ {
629
+ bool changed = false;
630
+ foreach (AnimationData data in animationData)
631
+ {
632
+ if (
633
+ !string.IsNullOrWhiteSpace(data.animationName)
634
+ && !data.animationName.EndsWith($"_{text}")
635
+ )
636
+ {
637
+ data.animationName += $"_{text}";
638
+ changed = true;
639
+ }
640
+ }
641
+ if (changed)
642
+ {
643
+ this.Log($"Appended '{text}' to animation names.");
644
+ _serializedObject.Update();
645
+ Repaint();
646
+ }
647
+ else
648
+ {
649
+ this.LogWarn(
650
+ $"No animation names modified. Either none exist or they already end with '_{text}'."
651
+ );
652
+ }
653
+ }
654
+
655
+ if (GUILayout.Button($"Remove '{text}' From End of Names"))
656
+ {
657
+ bool changed = false;
658
+ string suffix = $"_{text}";
659
+ foreach (AnimationData data in animationData)
660
+ {
661
+ if (
662
+ !string.IsNullOrWhiteSpace(data.animationName)
663
+ && data.animationName.EndsWith(suffix)
664
+ )
665
+ {
666
+ data.animationName = data.animationName.Remove(
667
+ data.animationName.Length - suffix.Length
668
+ );
669
+ changed = true;
670
+ }
671
+ else if (
672
+ !string.IsNullOrWhiteSpace(data.animationName)
673
+ && data.animationName.EndsWith(text)
674
+ )
675
+ {
676
+ data.animationName = data.animationName.Remove(
677
+ data.animationName.Length - text.Length
678
+ );
679
+ changed = true;
680
+ }
681
+ }
682
+ if (changed)
683
+ {
684
+ this.Log($"Removed '{text}' suffix from animation names.");
685
+ _serializedObject.Update();
686
+ Repaint();
687
+ }
688
+ else
689
+ {
690
+ this.LogWarn(
691
+ $"No animation names modified. Either none exist or they do not end with '{text}' or '_{text}'."
692
+ );
693
+ }
694
+ }
695
+ }
696
+
697
+ if (
698
+ !canBulkName
699
+ && animationData is { Count: > 0 }
700
+ && animationData.Any(data => data.frames?.Count > 0)
701
+ )
702
+ {
703
+ EditorGUILayout.HelpBox(
704
+ "Enter text in the 'Text' field above to enable bulk naming operations.",
705
+ MessageType.Info
706
+ );
707
+ }
708
+
709
+ EditorGUILayout.Space();
710
+ using (new EditorGUI.DisabledScope(animationData is not { Count: > 0 }))
711
+ {
712
+ if (GUILayout.Button("Create Animations"))
713
+ {
714
+ CreateAnimations();
715
+ }
716
+ }
717
+ if (animationData is not { Count: > 0 })
718
+ {
719
+ EditorGUILayout.HelpBox(
720
+ "Add Animation Data entries before creating.",
721
+ MessageType.Warning
722
+ );
723
+ }
724
+ }
725
+
726
+ private void CreateAnimations()
727
+ {
728
+ if (animationData is not { Count: > 0 })
729
+ {
730
+ this.LogError($"No animation data to create.");
731
+ return;
732
+ }
733
+
734
+ string[] searchTerms = string.IsNullOrWhiteSpace(_searchString)
735
+ ? Array.Empty<string>()
736
+ : _searchString
737
+ .ToLowerInvariant()
738
+ .Split(new[] { ' ', '\t', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
739
+
740
+ List<AnimationData> dataToCreate = new();
741
+ if (searchTerms.Length == 0)
742
+ {
743
+ dataToCreate.AddRange(animationData);
744
+ }
745
+ else
746
+ {
747
+ foreach (AnimationData data in animationData)
748
+ {
749
+ string lowerName = (data.animationName ?? string.Empty).ToLowerInvariant();
750
+ if (searchTerms.All(term => lowerName.Contains(term)))
751
+ {
752
+ dataToCreate.Add(data);
753
+ }
754
+ }
755
+ this.Log(
756
+ $"Creating animations based on current search filter '{_searchString}'. Only {dataToCreate.Count} out of {animationData.Count} items will be processed."
757
+ );
758
+ }
759
+
760
+ if (dataToCreate.Count == 0)
761
+ {
762
+ this.LogError(
763
+ $"No animation data matches the current search filter '{_searchString}'. Nothing to create."
764
+ );
765
+ return;
766
+ }
767
+
768
+ int totalAnimations = dataToCreate.Count;
769
+ int currentAnimationIndex = 0;
770
+ bool errorOccurred = false;
771
+
772
+ AssetDatabase.StartAssetEditing();
773
+ try
774
+ {
775
+ foreach (AnimationData data in dataToCreate)
776
+ {
777
+ currentAnimationIndex++;
778
+ string animationName = data.animationName;
779
+ if (string.IsNullOrWhiteSpace(animationName))
780
+ {
781
+ this.LogWarn(
782
+ $"Ignoring animation data entry (original index unknown due to filtering) without an animation name."
783
+ );
784
+ continue;
785
+ }
786
+
787
+ Utils.EditorUi.ShowProgress(
788
+ "Creating Animations",
789
+ $"Processing '{animationName}' ({currentAnimationIndex}/{totalAnimations})",
790
+ (float)currentAnimationIndex / totalAnimations
791
+ );
792
+
793
+ float framesPerSecond = data.framesPerSecond;
794
+ if (framesPerSecond <= 0)
795
+ {
796
+ this.LogWarn(
797
+ $"Ignoring animation '{animationName}' with invalid FPS ({framesPerSecond})."
798
+ );
799
+ continue;
800
+ }
801
+
802
+ List<Sprite> frames = data.frames;
803
+ if (frames is not { Count: > 0 })
804
+ {
805
+ this.LogWarn(
806
+ $"Ignoring animation '{animationName}' because it has no frames."
807
+ );
808
+ continue;
809
+ }
810
+
811
+ using PooledResource<List<Sprite>> validFramesResource =
812
+ Buffers<Sprite>.List.Get();
813
+ List<Sprite> validFrames = validFramesResource.resource;
814
+ foreach (Sprite f in frames)
815
+ {
816
+ if (f != null)
817
+ {
818
+ validFrames.Add(f);
819
+ }
820
+ }
821
+ if (validFrames.Count == 0)
822
+ {
823
+ this.LogWarn(
824
+ $"Ignoring animation '{animationName}' because it only contains null frames."
825
+ );
826
+ continue;
827
+ }
828
+
829
+ validFrames.Sort((s1, s2) => EditorUtility.NaturalCompare(s1.name, s2.name));
830
+
831
+ float timeStep = 1f / framesPerSecond;
832
+ using PooledResource<ObjectReferenceKeyframe[]> keyframesResource =
833
+ WallstopFastArrayPool<ObjectReferenceKeyframe>.Get(
834
+ validFrames.Count,
835
+ out ObjectReferenceKeyframe[] keyframes
836
+ );
837
+ float currentTime = 0f;
838
+ for (int k = 0; k < validFrames.Count; k++)
839
+ {
840
+ keyframes[k].time = currentTime;
841
+ keyframes[k].value = validFrames[k];
842
+ currentTime += timeStep;
843
+ }
844
+
845
+ if (keyframes.Length <= 0)
846
+ {
847
+ this.LogWarn(
848
+ $"No valid keyframes could be generated for animation '{animationName}'."
849
+ );
850
+ continue;
851
+ }
852
+
853
+ AnimationClip animationClip = new() { frameRate = framesPerSecond };
854
+
855
+ if (data.loop)
856
+ {
857
+ AnimationClipSettings settings = AnimationUtility.GetAnimationClipSettings(
858
+ animationClip
859
+ );
860
+ settings.loopTime = true;
861
+ AnimationUtility.SetAnimationClipSettings(animationClip, settings);
862
+ }
863
+
864
+ AnimationUtility.SetObjectReferenceCurve(
865
+ animationClip,
866
+ EditorCurveBinding.PPtrCurve("", typeof(SpriteRenderer), "m_Sprite"),
867
+ keyframes
868
+ );
869
+
870
+ string firstFramePath = AssetDatabase.GetAssetPath(validFrames[0]);
871
+ string assetPath =
872
+ Path.GetDirectoryName(firstFramePath).SanitizePath() ?? "Assets";
873
+ if (!assetPath.EndsWith("/"))
874
+ {
875
+ assetPath += "/";
876
+ }
877
+
878
+ string finalPath = AssetDatabase.GenerateUniqueAssetPath(
879
+ $"{assetPath}{animationName}.anim"
880
+ );
881
+ AssetDatabase.CreateAsset(animationClip, finalPath);
882
+ this.Log($"Created animation at '{finalPath}'.");
883
+ }
884
+ }
885
+ catch (Exception e)
886
+ {
887
+ errorOccurred = true;
888
+ this.LogError($"An error occurred during animation creation: {e}");
889
+ }
890
+ finally
891
+ {
892
+ Utils.EditorUi.ClearProgress();
893
+ if (!errorOccurred)
894
+ {
895
+ this.Log($"Finished creating {totalAnimations} animations.");
896
+ }
897
+ else
898
+ {
899
+ this.LogError($"Animation creation finished with errors. Check console.");
900
+ }
901
+
902
+ AssetDatabase.StopAssetEditing();
903
+ AssetDatabase.SaveAssets();
904
+ AssetDatabase.Refresh();
905
+ }
906
+ }
907
+
908
+ private void UpdateRegex()
909
+ {
910
+ if (_compiledRegex == null || _lastUsedRegex != spriteNameRegex)
911
+ {
912
+ try
913
+ {
914
+ _compiledRegex = new Regex(
915
+ spriteNameRegex,
916
+ RegexOptions.Compiled | RegexOptions.CultureInvariant
917
+ );
918
+ _lastUsedRegex = spriteNameRegex;
919
+ _errorMessage = "";
920
+ this.Log($"Regex updated to: {spriteNameRegex}");
921
+ }
922
+ catch (ArgumentException ex)
923
+ {
924
+ _compiledRegex = null;
925
+ _lastUsedRegex = spriteNameRegex;
926
+ _errorMessage = $"Invalid Regex: {ex.Message}";
927
+ this.LogError($"Invalid Regex '{spriteNameRegex}': {ex.Message}");
928
+ }
929
+ }
930
+ }
931
+
932
+ private void UpdateGroupRegex()
933
+ {
934
+ _groupRegexErrorMessage = string.Empty;
935
+ _compiledGroupRegex = null;
936
+ if (!useCustomGroupRegex)
937
+ {
938
+ _lastGroupRegex = customGroupRegex;
939
+ return;
940
+ }
941
+
942
+ if (string.IsNullOrWhiteSpace(customGroupRegex))
943
+ {
944
+ _lastGroupRegex = customGroupRegex;
945
+ _groupRegexErrorMessage = "Custom Group Regex enabled but pattern is empty.";
946
+ return;
947
+ }
948
+
949
+ try
950
+ {
951
+ RegexOptions options = RegexOptions.Compiled | RegexOptions.CultureInvariant;
952
+ if (customGroupRegexIgnoreCase)
953
+ {
954
+ options |= RegexOptions.IgnoreCase;
955
+ }
956
+ _compiledGroupRegex = new Regex(customGroupRegex, options);
957
+ _lastGroupRegex = customGroupRegex;
958
+ }
959
+ catch (ArgumentException ex)
960
+ {
961
+ _compiledGroupRegex = null;
962
+ _lastGroupRegex = customGroupRegex;
963
+ _groupRegexErrorMessage = $"Invalid Custom Group Regex: {ex.Message}";
964
+ this.LogError($"Invalid Custom Group Regex '{customGroupRegex}': {ex.Message}");
965
+ }
966
+ }
967
+
968
+ private void FindAndFilterSprites()
969
+ {
970
+ _filteredSprites.Clear();
971
+ _matchedSpriteCount = 0;
972
+ _unmatchedSpriteCount = 0;
973
+
974
+ if (animationSources is not { Count: > 0 } || _compiledRegex == null)
975
+ {
976
+ if (_compiledRegex == null && !string.IsNullOrWhiteSpace(spriteNameRegex))
977
+ {
978
+ this.LogWarn(
979
+ $"Cannot find sprites, regex pattern '{spriteNameRegex}' is invalid."
980
+ );
981
+ }
982
+ else if (animationSources is not { Count: > 0 })
983
+ {
984
+ this.LogWarn($"Cannot find sprites, no animation sources specified.");
985
+ }
986
+ return;
987
+ }
988
+
989
+ List<string> searchPaths = new();
990
+ foreach (Object source in animationSources.Where(Objects.NotNull))
991
+ {
992
+ string path = AssetDatabase.GetAssetPath(source);
993
+ if (!string.IsNullOrWhiteSpace(path) && AssetDatabase.IsValidFolder(path))
994
+ {
995
+ searchPaths.Add(path);
996
+ }
997
+ else if (source != null)
998
+ {
999
+ this.LogWarn($"Source '{source.name}' is not a valid folder. Skipping.");
1000
+ }
1001
+ }
1002
+
1003
+ if (searchPaths.Count == 0)
1004
+ {
1005
+ this.LogWarn($"No valid folders found in Animation Sources.");
1006
+ return;
1007
+ }
1008
+
1009
+ string[] assetGuids = AssetDatabase.FindAssets("t:sprite", searchPaths.ToArray());
1010
+ int totalAssets = assetGuids.Length;
1011
+ this.Log($"Found {totalAssets} total sprite assets in specified paths.");
1012
+
1013
+ try
1014
+ {
1015
+ Utils.EditorUi.ShowProgress(
1016
+ "Finding and Filtering Sprites",
1017
+ $"Scanning {assetGuids.Length} assets...",
1018
+ 0f
1019
+ );
1020
+
1021
+ for (int i = 0; i < totalAssets; i++)
1022
+ {
1023
+ string guid = assetGuids[i];
1024
+ string path = AssetDatabase.GUIDToAssetPath(guid);
1025
+
1026
+ if (i % 20 == 0 || i == totalAssets - 1)
1027
+ {
1028
+ float progress = (i + 1) / (float)totalAssets;
1029
+ Utils.EditorUi.ShowProgress(
1030
+ "Finding and Filtering Sprites",
1031
+ $"Checking: {Path.GetFileName(path)} ({i + 1}/{assetGuids.Length})",
1032
+ progress
1033
+ );
1034
+ }
1035
+
1036
+ Sprite sprite = AssetDatabase.LoadAssetAtPath<Sprite>(path);
1037
+
1038
+ if (sprite != null)
1039
+ {
1040
+ if (_compiledRegex.IsMatch(sprite.name))
1041
+ {
1042
+ _filteredSprites.Add(sprite);
1043
+ _matchedSpriteCount++;
1044
+ }
1045
+ else
1046
+ {
1047
+ _unmatchedSpriteCount++;
1048
+ }
1049
+ }
1050
+ }
1051
+ this.Log(
1052
+ $"Sprite filtering complete. Matched: {_matchedSpriteCount}, Unmatched: {_unmatchedSpriteCount}."
1053
+ );
1054
+ }
1055
+ finally
1056
+ {
1057
+ Utils.EditorUi.ClearProgress();
1058
+ }
1059
+ }
1060
+
1061
+ private void AutoParseSprites()
1062
+ {
1063
+ if (_filteredSprites.Count == 0)
1064
+ {
1065
+ this.LogWarn($"Cannot Auto-Parse, no matched sprites available.");
1066
+ return;
1067
+ }
1068
+
1069
+ try
1070
+ {
1071
+ Dictionary<string, Dictionary<string, List<(int index, Sprite sprite)>>> groups =
1072
+ GroupFilteredSprites(withProgress: true);
1073
+
1074
+ if (groups.Count == 0)
1075
+ {
1076
+ this.LogWarn(
1077
+ $"Auto-parsing did not result in any animation groups. Check naming."
1078
+ );
1079
+ return;
1080
+ }
1081
+
1082
+ int removedCount = animationData.RemoveAll(data => data.isCreatedFromAutoParse);
1083
+ this.Log($"Removed {removedCount} previously auto-parsed animation entries.");
1084
+
1085
+ int added = ApplyAutoParseGroups(groups);
1086
+ this.Log($"Auto-parsed into {added} new animation groups.");
1087
+ }
1088
+ finally
1089
+ {
1090
+ Utils.EditorUi.ClearProgress();
1091
+ _serializedObject.Update();
1092
+ }
1093
+ }
1094
+
1095
+ private static string SanitizeName(string inputName)
1096
+ {
1097
+ inputName = inputName.Replace(" ", "_");
1098
+ inputName = Regex.Replace(inputName, @"[^a-zA-Z0-9_]", "");
1099
+
1100
+ if (string.IsNullOrWhiteSpace(inputName))
1101
+ {
1102
+ return "Default_Animation";
1103
+ }
1104
+
1105
+ return inputName.Trim('_');
1106
+ }
1107
+
1108
+ private static string StripDensitySuffix(string name)
1109
+ {
1110
+ // Removes common density suffixes like @2x, @0.5x, @3x at the end
1111
+ return Regex.Replace(name, @"@\d+(?:\.\d+)?x$", string.Empty);
1112
+ }
1113
+
1114
+ private static bool TryExtractBaseAndIndex(string name, out string baseName, out int index)
1115
+ {
1116
+ baseName = null;
1117
+ index = -1;
1118
+
1119
+ // Try patterns in order of specificity
1120
+ // 1) name(001), name (1)
1121
+ Match m = s_ParenIndexRegex.Match(name);
1122
+ if (m.Success)
1123
+ {
1124
+ baseName = m.Groups["base"].Value;
1125
+ _ = int.TryParse(m.Groups["index"].Value, out index);
1126
+ baseName = baseName.TrimEnd('_', '-', '.', ' ');
1127
+ return true;
1128
+ }
1129
+
1130
+ // 2) name_001, name-001, name 001, name.001 (last numeric segment)
1131
+ m = s_SeparatorIndexRegex.Match(name);
1132
+ if (m.Success)
1133
+ {
1134
+ baseName = m.Groups["base"].Value;
1135
+ _ = int.TryParse(m.Groups["index"].Value, out index);
1136
+ baseName = baseName.TrimEnd('_', '-', '.', ' ');
1137
+ return true;
1138
+ }
1139
+
1140
+ // 3) name001 (trailing digits without separators)
1141
+ m = s_TrailingIndexRegex.Match(name);
1142
+ if (m.Success && m.Groups["base"].Length > 0)
1143
+ {
1144
+ baseName = m.Groups["base"].Value;
1145
+ _ = int.TryParse(m.Groups["index"].Value, out index);
1146
+ baseName = baseName.TrimEnd('_', '-', '.', ' ');
1147
+ return true;
1148
+ }
1149
+
1150
+ // Not found
1151
+ return false;
1152
+ }
1153
+
1154
+ private int ComputeSourcesHash()
1155
+ {
1156
+ unchecked
1157
+ {
1158
+ int hash = 17;
1159
+ if (animationSources != null)
1160
+ {
1161
+ for (int i = 0; i < animationSources.Count; i++)
1162
+ {
1163
+ Object src = animationSources[i];
1164
+ int id = src != null ? src.GetInstanceID() : 0;
1165
+ string path = src != null ? AssetDatabase.GetAssetPath(src) : string.Empty;
1166
+ hash = hash * 31 + id;
1167
+ hash = hash * 31 + (path?.GetHashCode() ?? 0);
1168
+ }
1169
+ }
1170
+ return hash;
1171
+ }
1172
+ }
1173
+
1174
+ private Dictionary<
1175
+ string,
1176
+ Dictionary<string, List<(int index, Sprite sprite)>>
1177
+ > GroupFilteredSprites(bool withProgress)
1178
+ {
1179
+ Dictionary<
1180
+ string,
1181
+ Dictionary<string, List<(int index, Sprite sprite)>>
1182
+ > spritesByBaseAndAssetPath = new(StringComparer.Ordinal);
1183
+
1184
+ int total = _filteredSprites.Count;
1185
+ int processed = 0;
1186
+
1187
+ foreach (Sprite sprite in _filteredSprites)
1188
+ {
1189
+ processed++;
1190
+ if (withProgress && (processed % 10 == 0 || processed == total))
1191
+ {
1192
+ Utils.EditorUi.ShowProgress(
1193
+ "Auto-Parsing Sprites",
1194
+ $"Processing: {sprite.name} ({processed}/{total})",
1195
+ (float)processed / total
1196
+ );
1197
+ }
1198
+
1199
+ string assetPath = AssetDatabase.GetAssetPath(sprite);
1200
+ string directoryPath =
1201
+ Path.GetDirectoryName(assetPath).SanitizePath() ?? string.Empty;
1202
+ string frameName = StripDensitySuffix(sprite.name);
1203
+
1204
+ string baseName;
1205
+ int frameIndex;
1206
+
1207
+ if (useCustomGroupRegex && _compiledGroupRegex != null)
1208
+ {
1209
+ Match m = _compiledGroupRegex.Match(frameName);
1210
+ if (m.Success)
1211
+ {
1212
+ Group baseGroup = m.Groups["base"];
1213
+ Group indexGroup = m.Groups["index"];
1214
+ baseName = baseGroup.Success ? baseGroup.Value : frameName;
1215
+ frameIndex =
1216
+ indexGroup.Success && int.TryParse(indexGroup.Value, out int idx)
1217
+ ? idx
1218
+ : -1;
1219
+ }
1220
+ else if (!TryExtractBaseAndIndex(frameName, out baseName, out frameIndex))
1221
+ {
1222
+ baseName = frameName;
1223
+ frameIndex = -1;
1224
+ }
1225
+ }
1226
+ else if (!TryExtractBaseAndIndex(frameName, out baseName, out frameIndex))
1227
+ {
1228
+ baseName = frameName;
1229
+ frameIndex = -1;
1230
+ }
1231
+
1232
+ if (string.IsNullOrWhiteSpace(baseName))
1233
+ {
1234
+ this.LogWarn(
1235
+ $"Could not extract valid base name for '{frameName}' at '{assetPath}'. Skipping."
1236
+ );
1237
+ continue;
1238
+ }
1239
+
1240
+ if (
1241
+ !spritesByBaseAndAssetPath.TryGetValue(
1242
+ directoryPath,
1243
+ out Dictionary<string, List<(int index, Sprite sprite)>> byBase
1244
+ )
1245
+ )
1246
+ {
1247
+ byBase = new Dictionary<string, List<(int index, Sprite sprite)>>(
1248
+ groupingCaseInsensitive
1249
+ ? StringComparer.OrdinalIgnoreCase
1250
+ : StringComparer.Ordinal
1251
+ );
1252
+ spritesByBaseAndAssetPath.Add(directoryPath, byBase);
1253
+ }
1254
+
1255
+ List<(int index, Sprite sprite)> list = byBase.GetOrAdd(baseName);
1256
+ list.Add((frameIndex, sprite));
1257
+ }
1258
+
1259
+ return spritesByBaseAndAssetPath;
1260
+ }
1261
+
1262
+ private int ApplyAutoParseGroups(
1263
+ Dictionary<string, Dictionary<string, List<(int index, Sprite sprite)>>> groups
1264
+ )
1265
+ {
1266
+ int addedCount = 0;
1267
+
1268
+ HashSet<string> usedNames = new(StringComparer.OrdinalIgnoreCase);
1269
+ foreach (AnimationData data in animationData)
1270
+ {
1271
+ if (!data.isCreatedFromAutoParse && !string.IsNullOrWhiteSpace(data.animationName))
1272
+ {
1273
+ usedNames.Add(data.animationName);
1274
+ }
1275
+ }
1276
+
1277
+ foreach (
1278
+ KeyValuePair<
1279
+ string,
1280
+ Dictionary<string, List<(int index, Sprite sprite)>>
1281
+ > kvpAssetPath in groups
1282
+ )
1283
+ {
1284
+ string folderName = new DirectoryInfo(kvpAssetPath.Key).Name;
1285
+ foreach (
1286
+ (string baseKey, List<(int index, Sprite sprite)> entries) in kvpAssetPath.Value
1287
+ )
1288
+ {
1289
+ if (entries.Count == 0)
1290
+ {
1291
+ continue;
1292
+ }
1293
+
1294
+ bool hasAnyIndex = entries.Any(e => e.index >= 0);
1295
+ if (strictNumericOrdering)
1296
+ {
1297
+ if (hasAnyIndex)
1298
+ {
1299
+ entries.Sort((a, b) => a.index.CompareTo(b.index));
1300
+ }
1301
+ // else leave discovery order
1302
+ }
1303
+ else
1304
+ {
1305
+ if (hasAnyIndex)
1306
+ {
1307
+ entries.Sort((a, b) => a.index.CompareTo(b.index));
1308
+ }
1309
+ else
1310
+ {
1311
+ entries.Sort(
1312
+ (a, b) => EditorUtility.NaturalCompare(a.sprite.name, b.sprite.name)
1313
+ );
1314
+ }
1315
+ }
1316
+
1317
+ List<Sprite> framesForAnim = new(entries.Count);
1318
+ foreach ((int index, Sprite sprite) e in entries)
1319
+ {
1320
+ framesForAnim.Add(e.sprite);
1321
+ }
1322
+
1323
+ string finalAnimName = ComposeFinalName(
1324
+ baseKey,
1325
+ kvpAssetPath.Key,
1326
+ usedNames,
1327
+ out bool _
1328
+ );
1329
+ usedNames.Add(finalAnimName);
1330
+
1331
+ animationData.Add(
1332
+ new AnimationData
1333
+ {
1334
+ frames = framesForAnim,
1335
+ framesPerSecond = AnimationData.DefaultFramesPerSecond,
1336
+ animationName = finalAnimName,
1337
+ isCreatedFromAutoParse = true,
1338
+ loop = false,
1339
+ }
1340
+ );
1341
+ addedCount++;
1342
+ }
1343
+ }
1344
+
1345
+ return addedCount;
1346
+ }
1347
+
1348
+ private static string EnsureUniqueName(string baseName, ISet<string> used)
1349
+ {
1350
+ if (!used.Contains(baseName))
1351
+ {
1352
+ return baseName;
1353
+ }
1354
+ int counter = 2;
1355
+ string candidate;
1356
+ do
1357
+ {
1358
+ candidate = $"{baseName}_{counter}";
1359
+ counter++;
1360
+ } while (used.Contains(candidate));
1361
+ return candidate;
1362
+ }
1363
+
1364
+ private string ComposeFinalName(
1365
+ string baseKey,
1366
+ string directoryPath,
1367
+ ISet<string> usedNames,
1368
+ out bool duplicateResolved
1369
+ )
1370
+ {
1371
+ string finalNameCore = baseKey;
1372
+ string folderPrefix = GetFolderPrefix(directoryPath);
1373
+ if (!string.IsNullOrEmpty(folderPrefix))
1374
+ {
1375
+ finalNameCore = folderPrefix + "_" + finalNameCore;
1376
+ }
1377
+ if (!string.IsNullOrEmpty(autoParseNamePrefix))
1378
+ {
1379
+ finalNameCore = autoParseNamePrefix + finalNameCore;
1380
+ }
1381
+ if (!string.IsNullOrEmpty(autoParseNameSuffix))
1382
+ {
1383
+ finalNameCore = finalNameCore + autoParseNameSuffix;
1384
+ }
1385
+ string finalAnimName = SanitizeName(finalNameCore);
1386
+
1387
+ duplicateResolved = false;
1388
+ if (resolveDuplicateAnimationNames && usedNames != null)
1389
+ {
1390
+ if (usedNames.Contains(finalAnimName))
1391
+ {
1392
+ finalAnimName = EnsureUniqueName(finalAnimName, usedNames);
1393
+ duplicateResolved = true;
1394
+ }
1395
+ }
1396
+ return finalAnimName;
1397
+ }
1398
+
1399
+ private string GetFolderPrefix(string directoryPath)
1400
+ {
1401
+ if (!includeFolderNameInAnimName && !includeFullFolderPathInAnimName)
1402
+ {
1403
+ return string.Empty;
1404
+ }
1405
+ if (string.IsNullOrWhiteSpace(directoryPath))
1406
+ {
1407
+ return string.Empty;
1408
+ }
1409
+ string sanitized = directoryPath.Replace('\\', '/');
1410
+ if (includeFullFolderPathInAnimName)
1411
+ {
1412
+ if (sanitized.StartsWith("Assets/", StringComparison.OrdinalIgnoreCase))
1413
+ {
1414
+ sanitized = sanitized.Substring("Assets/".Length);
1415
+ }
1416
+ sanitized = sanitized.Trim('/');
1417
+ sanitized = sanitized.Replace('/', '_');
1418
+ return SanitizeName(sanitized);
1419
+ }
1420
+ return new DirectoryInfo(directoryPath).Name;
1421
+ }
1422
+
1423
+ private void GenerateAutoParseDryRun()
1424
+ {
1425
+ _autoParseDryRun.Clear();
1426
+ Dictionary<string, Dictionary<string, List<(int index, Sprite sprite)>>> groups =
1427
+ GroupFilteredSprites(withProgress: false);
1428
+
1429
+ HashSet<string> usedNames = new(StringComparer.OrdinalIgnoreCase);
1430
+ foreach (AnimationData data in animationData)
1431
+ {
1432
+ if (!data.isCreatedFromAutoParse && !string.IsNullOrWhiteSpace(data.animationName))
1433
+ {
1434
+ usedNames.Add(data.animationName);
1435
+ }
1436
+ }
1437
+
1438
+ foreach (
1439
+ KeyValuePair<
1440
+ string,
1441
+ Dictionary<string, List<(int index, Sprite sprite)>>
1442
+ > kvp in groups
1443
+ )
1444
+ {
1445
+ string dir = kvp.Key;
1446
+ foreach ((string baseKey, List<(int index, Sprite sprite)> entries) in kvp.Value)
1447
+ {
1448
+ bool hasAnyIndex = entries.Any(e => e.index >= 0);
1449
+ if (strictNumericOrdering)
1450
+ {
1451
+ if (hasAnyIndex)
1452
+ {
1453
+ entries.Sort((a, b) => a.index.CompareTo(b.index));
1454
+ }
1455
+ }
1456
+ else
1457
+ {
1458
+ if (hasAnyIndex)
1459
+ {
1460
+ entries.Sort((a, b) => a.index.CompareTo(b.index));
1461
+ }
1462
+ else
1463
+ {
1464
+ entries.Sort(
1465
+ (a, b) => EditorUtility.NaturalCompare(a.sprite.name, b.sprite.name)
1466
+ );
1467
+ }
1468
+ }
1469
+
1470
+ string finalName = ComposeFinalName(
1471
+ baseKey,
1472
+ dir,
1473
+ usedNames,
1474
+ out bool wasResolved
1475
+ );
1476
+ usedNames.Add(finalName);
1477
+
1478
+ string folderPath = dir;
1479
+ if (!folderPath.EndsWith("/"))
1480
+ {
1481
+ folderPath += "/";
1482
+ }
1483
+ string finalAssetPath = folderPath + finalName + ".anim";
1484
+
1485
+ _autoParseDryRun.Add(
1486
+ new AutoParseDryRunRecord
1487
+ {
1488
+ folderPath = dir,
1489
+ finalName = finalName,
1490
+ finalAssetPath = finalAssetPath,
1491
+ count = entries.Count,
1492
+ hasIndex = hasAnyIndex,
1493
+ duplicateResolved = wasResolved,
1494
+ }
1495
+ );
1496
+ }
1497
+ }
1498
+ }
1499
+
1500
+ private void GenerateAutoParsePreview()
1501
+ {
1502
+ _autoParsePreview.Clear();
1503
+ Dictionary<string, Dictionary<string, List<(int index, Sprite sprite)>>> groups =
1504
+ GroupFilteredSprites(withProgress: false);
1505
+ foreach (
1506
+ KeyValuePair<
1507
+ string,
1508
+ Dictionary<string, List<(int index, Sprite sprite)>>
1509
+ > dir in groups
1510
+ )
1511
+ {
1512
+ string folderName = new DirectoryInfo(dir.Key).Name;
1513
+ foreach ((string baseKey, List<(int index, Sprite sprite)> entries) in dir.Value)
1514
+ {
1515
+ AutoParsePreviewRecord rec = new()
1516
+ {
1517
+ folder = folderName,
1518
+ baseName = baseKey,
1519
+ count = entries.Count,
1520
+ hasIndex = entries.Any(e => e.index >= 0),
1521
+ };
1522
+ _autoParsePreview.Add(rec);
1523
+ }
1524
+ }
1525
+ _autoParsePreview.Sort(
1526
+ (a, b) => string.Compare(a.folder, b.folder, StringComparison.Ordinal)
1527
+ );
1528
+ }
1529
+ }
1530
+
1531
+ #endif
1532
+ }