com.wallstop-studios.unity-helpers 2.0.0-rc81.7 → 2.0.0

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