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,1537 +1,1586 @@
1
- // ReSharper disable HeapView.CanAvoidClosure
2
- namespace WallstopStudios.UnityHelpers.Editor.Sprites
3
- {
4
- #if UNITY_EDITOR
5
- using System;
6
- using System.Collections.Generic;
7
- using System.Diagnostics;
8
- using System.IO;
9
- using System.Linq;
10
- using System.Runtime.Serialization;
11
- using Core.Extension;
12
- using Core.Helper;
13
- using UnityEditor;
14
- using UnityEditor.UIElements;
15
- using UnityEngine;
16
- using UnityEngine.UIElements;
17
- using Object = UnityEngine.Object;
18
-
19
- public sealed class SpriteSheetAnimationCreator : EditorWindow
20
- {
21
- private const float ThumbnailSize = 64f;
22
-
23
- private Texture2D _selectedSpriteSheet;
24
- private readonly List<Sprite> _availableSprites = new();
25
-
26
- private readonly List<AnimationDefinition> _animationDefinitions = new();
27
-
28
- private ObjectField _spriteSheetField;
29
- private Button _refreshSpritesButton;
30
- private Button _loadSpritesButton;
31
- private ScrollView _spriteThumbnailsScrollView;
32
- private VisualElement _spriteThumbnailsContainer;
33
- private ListView _animationDefinitionsListView;
34
- private Button _addAnimationDefinitionButton;
35
- private Button _generateAnimationsButton;
36
-
37
- private VisualElement _previewContainer;
38
- private Image _previewImage;
39
- private Label _previewFrameLabel;
40
- private Button _playPreviewButton;
41
- private Button _stopPreviewButton;
42
- private Button _prevFrameButton;
43
- private Button _nextFrameButton;
44
- private Slider _previewScrubber;
45
-
46
- private bool _isDraggingToSelectSprites;
47
- private int _spriteSelectionDragStartIndex = -1;
48
- private int _spriteSelectionDragCurrentIndex = -1;
49
- private StyleColor _selectedThumbnailBackgroundColor = new(
50
- new Color(0.2f, 0.5f, 0.8f, 0.4f)
51
- );
52
- private readonly StyleColor _defaultThumbnailBackgroundColor = new(StyleKeyword.Null);
53
-
54
- private bool _isPreviewing;
55
- private int _currentPreviewAnimDefIndex = -1;
56
- private int _currentPreviewSpriteIndex;
57
- private AnimationDefinition _currentPreviewDefinition;
58
- private readonly EditorApplication.CallbackFunction _editorUpdateCallback;
59
- private readonly Stopwatch _timer = Stopwatch.StartNew();
60
-
61
- private TimeSpan? _lastTick;
62
-
63
- [MenuItem("Tools/Wallstop Studios/Unity Helpers/Sprite Sheet Animation Creator")]
64
- public static void ShowWindow()
65
- {
66
- SpriteSheetAnimationCreator window = GetWindow<SpriteSheetAnimationCreator>();
67
- window.titleContent = new GUIContent("Sprite Animation Creator");
68
- window.minSize = new Vector2(600, 700);
69
- }
70
-
71
- [Serializable]
72
- [DataContract]
73
- public sealed class AnimationDefinition
74
- {
75
- public string Name = "New Animation";
76
- public bool loop;
77
- public float cycleOffset;
78
- public int StartSpriteIndex;
79
- public int EndSpriteIndex;
80
- public float DefaultFrameRate = 12f;
81
- public AnimationCurve FrameRateCurve = AnimationCurve.Constant(0, 1, 12f);
82
- public List<Sprite> SpritesToAnimate = new();
83
-
84
- public TextField nameField;
85
- public IntegerField startIndexField;
86
- public IntegerField endIndexField;
87
- public FloatField defaultFrameRateField;
88
- public CurveField frameRateCurveField;
89
- public Label spriteCountLabel;
90
- public Button previewButton;
91
- public Button removeButton;
92
- public Toggle loopingField;
93
- public FloatField cycleOffsetField;
94
- }
95
-
96
- public SpriteSheetAnimationCreator()
97
- {
98
- _editorUpdateCallback = OnEditorUpdate;
99
- }
100
-
101
- public void CreateGUI()
102
- {
103
- VisualElement root = rootVisualElement;
104
- root.style.paddingLeft = 10;
105
- root.style.paddingRight = 10;
106
- root.style.paddingTop = 10;
107
- root.style.paddingBottom = 10;
108
-
109
- VisualElement topSection = new()
110
- {
111
- style = { flexDirection = FlexDirection.Row, marginBottom = 10 },
112
- };
113
- _spriteSheetField = new ObjectField("Sprite Sheet")
114
- {
115
- objectType = typeof(Texture2D),
116
- allowSceneObjects = false,
117
- style =
118
- {
119
- flexGrow = 1,
120
- flexShrink = 0,
121
- minHeight = 20,
122
- },
123
- };
124
- _spriteSheetField.RegisterValueChangedCallback(OnSpriteSheetSelected);
125
- topSection.Add(_spriteSheetField);
126
-
127
- _loadSpritesButton = new Button(() =>
128
- {
129
- string filePath = string.Empty;
130
- if (_spriteSheetField.value != null)
131
- {
132
- filePath = AssetDatabase.GetAssetPath(_spriteSheetField.value);
133
- }
134
-
135
- if (string.IsNullOrWhiteSpace(filePath))
136
- {
137
- filePath = Application.dataPath;
138
- }
139
-
140
- string selectedPath = EditorUtility.OpenFilePanel(
141
- "Select Sprite Sheet",
142
- filePath,
143
- "png,jpg,gif,bmp,psd"
144
- );
145
- if (string.IsNullOrWhiteSpace(selectedPath))
146
- {
147
- return;
148
- }
149
-
150
- string relativePath = DirectoryHelper.AbsoluteToUnityRelativePath(selectedPath);
151
- if (!string.IsNullOrWhiteSpace(relativePath))
152
- {
153
- Texture2D loadedTexture = AssetDatabase.LoadAssetAtPath<Texture2D>(
154
- relativePath
155
- );
156
- if (loadedTexture != null)
157
- {
158
- _spriteSheetField.value = loadedTexture;
159
- }
160
- }
161
- })
162
- {
163
- text = "Load Sprites",
164
- style = { marginLeft = 5, minHeight = 20 },
165
- };
166
- topSection.Add(_loadSpritesButton);
167
-
168
- _refreshSpritesButton = new Button(LoadAndDisplaySprites)
169
- {
170
- text = "Refresh Sprites",
171
- style = { marginLeft = 5, minHeight = 20 },
172
- };
173
- topSection.Add(_refreshSpritesButton);
174
- root.Add(topSection);
175
-
176
- Label thumbnailsLabel = new(
177
- "Available Sprites (Drag to select range for new animation):"
178
- )
179
- {
180
- style =
181
- {
182
- unityFontStyleAndWeight = FontStyle.Bold,
183
- marginTop = 5,
184
- marginBottom = 5,
185
- },
186
- };
187
- root.Add(thumbnailsLabel);
188
- _spriteThumbnailsScrollView = new ScrollView(ScrollViewMode.Horizontal)
189
- {
190
- style =
191
- {
192
- height = ThumbnailSize + 20 + 10,
193
- minHeight = ThumbnailSize + 20 + 10,
194
- borderTopWidth = 1,
195
- borderBottomWidth = 1,
196
- borderLeftWidth = 1,
197
- borderRightWidth = 1,
198
- borderBottomColor = Color.gray,
199
- borderTopColor = Color.gray,
200
- borderLeftColor = Color.gray,
201
- borderRightColor = Color.gray,
202
- paddingLeft = 5,
203
- paddingRight = 5,
204
- paddingTop = 5,
205
- paddingBottom = 5,
206
- marginBottom = 10,
207
- },
208
- };
209
- _spriteThumbnailsContainer = new VisualElement
210
- {
211
- style = { flexDirection = FlexDirection.Row },
212
- };
213
-
214
- _spriteThumbnailsContainer.RegisterCallback<PointerMoveEvent>(evt =>
215
- {
216
- if (
217
- _isDraggingToSelectSprites
218
- && _spriteThumbnailsContainer.HasPointerCapture(evt.pointerId)
219
- )
220
- {
221
- VisualElement currentElementOver = evt.target as VisualElement;
222
-
223
- VisualElement thumbChild = currentElementOver;
224
- while (thumbChild != null && thumbChild.parent != _spriteThumbnailsContainer)
225
- {
226
- thumbChild = thumbChild.parent;
227
- }
228
-
229
- if (
230
- thumbChild is { userData: int hoveredIndex }
231
- && _spriteSelectionDragCurrentIndex != hoveredIndex
232
- )
233
- {
234
- _spriteSelectionDragCurrentIndex = hoveredIndex;
235
- UpdateSpriteSelectionHighlight();
236
- }
237
- }
238
- });
239
-
240
- _spriteThumbnailsContainer.RegisterCallback<PointerUpEvent>(
241
- evt =>
242
- {
243
- if (
244
- evt.button == 0
245
- && _isDraggingToSelectSprites
246
- && _spriteThumbnailsContainer.HasPointerCapture(evt.pointerId)
247
- )
248
- {
249
- _spriteThumbnailsContainer.ReleasePointer(evt.pointerId);
250
- _isDraggingToSelectSprites = false;
251
-
252
- if (
253
- _spriteSelectionDragStartIndex != -1
254
- && _spriteSelectionDragCurrentIndex != -1
255
- )
256
- {
257
- int start = Mathf.Min(
258
- _spriteSelectionDragStartIndex,
259
- _spriteSelectionDragCurrentIndex
260
- );
261
- int end = Mathf.Max(
262
- _spriteSelectionDragStartIndex,
263
- _spriteSelectionDragCurrentIndex
264
- );
265
-
266
- if (start <= end)
267
- {
268
- CreateAnimationDefinitionFromSelection(start, end);
269
- }
270
- }
271
- ClearSpriteSelectionHighlight();
272
- _spriteSelectionDragStartIndex = -1;
273
- _spriteSelectionDragCurrentIndex = -1;
274
- }
275
- },
276
- TrickleDown.TrickleDown
277
- );
278
-
279
- _spriteThumbnailsScrollView.Add(_spriteThumbnailsContainer);
280
- root.Add(_spriteThumbnailsScrollView);
281
-
282
- Label animDefsLabel = new("Animation Definitions:")
283
- {
284
- style =
285
- {
286
- unityFontStyleAndWeight = FontStyle.Bold,
287
- marginTop = 10,
288
- marginBottom = 5,
289
- },
290
- };
291
- root.Add(animDefsLabel);
292
-
293
- _animationDefinitionsListView = new ListView(
294
- _animationDefinitions,
295
- 130,
296
- MakeAnimationDefinitionItem,
297
- BindAnimationDefinitionItem
298
- )
299
- {
300
- selectionType = SelectionType.None,
301
- style = { flexGrow = 1, minHeight = 200 },
302
- };
303
- root.Add(_animationDefinitionsListView);
304
-
305
- _addAnimationDefinitionButton = new Button(AddAnimationDefinition)
306
- {
307
- text = "Add Animation Definition",
308
- style = { marginTop = 5 },
309
- };
310
- root.Add(_addAnimationDefinitionButton);
311
-
312
- Label previewSectionLabel = new("Animation Preview:")
313
- {
314
- style =
315
- {
316
- unityFontStyleAndWeight = FontStyle.Bold,
317
- marginTop = 15,
318
- marginBottom = 5,
319
- },
320
- };
321
- root.Add(previewSectionLabel);
322
-
323
- _previewContainer = new VisualElement
324
- {
325
- style =
326
- {
327
- flexDirection = FlexDirection.Column,
328
- alignItems = Align.Center,
329
- borderTopWidth = 1,
330
- borderBottomWidth = 1,
331
- borderLeftWidth = 1,
332
- borderRightWidth = 1,
333
- borderBottomColor = Color.gray,
334
- borderTopColor = Color.gray,
335
- borderLeftColor = Color.gray,
336
- borderRightColor = Color.gray,
337
- paddingBottom = 10,
338
- paddingTop = 10,
339
- minHeight = 150,
340
- },
341
- };
342
- _previewImage = new Image
343
- {
344
- scaleMode = ScaleMode.ScaleToFit,
345
- style =
346
- {
347
- width = 128,
348
- height = 128,
349
- marginBottom = 10,
350
- backgroundColor = new StyleColor(new Color(0.2f, 0.2f, 0.2f)),
351
- },
352
- };
353
- _previewContainer.Add(_previewImage);
354
-
355
- _previewFrameLabel = new Label("Frame: -/- | FPS: -")
356
- {
357
- style = { alignSelf = Align.Center, marginBottom = 5 },
358
- };
359
- _previewContainer.Add(_previewFrameLabel);
360
-
361
- _previewScrubber = new Slider(0, 1)
362
- {
363
- style =
364
- {
365
- minWidth = 200,
366
- marginBottom = 5,
367
- visibility = Visibility.Hidden,
368
- },
369
- };
370
- _previewScrubber.RegisterValueChangedCallback(evt =>
371
- {
372
- if (
373
- _currentPreviewDefinition != null
374
- && 0 < _currentPreviewDefinition.SpritesToAnimate.Count
375
- )
376
- {
377
- int frame = Mathf.FloorToInt(
378
- evt.newValue * (_currentPreviewDefinition.SpritesToAnimate.Count - 1)
379
- );
380
- SetPreviewFrame(frame);
381
- }
382
- });
383
- _previewContainer.Add(_previewScrubber);
384
-
385
- VisualElement previewControls = new()
386
- {
387
- style = { flexDirection = FlexDirection.Row, justifyContent = Justify.Center },
388
- };
389
- _prevFrameButton = new Button(() => AdjustPreviewFrame(-1))
390
- {
391
- text = "◀",
392
- style = { minWidth = 40 },
393
- };
394
- _playPreviewButton = new Button(PlayCurrentPreview)
395
- {
396
- text = "▶ Play",
397
- style = { minWidth = 70 },
398
- };
399
- _stopPreviewButton = new Button(StopCurrentPreview)
400
- {
401
- text = "◼ Stop",
402
- style = { minWidth = 70, display = DisplayStyle.None },
403
- };
404
- _nextFrameButton = new Button(() => AdjustPreviewFrame(1))
405
- {
406
- text = "▶",
407
- style = { minWidth = 40 },
408
- };
409
- previewControls.Add(_prevFrameButton);
410
- previewControls.Add(_playPreviewButton);
411
- previewControls.Add(_stopPreviewButton);
412
- previewControls.Add(_nextFrameButton);
413
- _previewContainer.Add(previewControls);
414
- root.Add(_previewContainer);
415
-
416
- _generateAnimationsButton = new Button(GenerateAnimations)
417
- {
418
- text = "Generate Animation Files",
419
- style = { marginTop = 15, height = 30 },
420
- };
421
- root.Add(_generateAnimationsButton);
422
-
423
- if (_selectedSpriteSheet != null)
424
- {
425
- _spriteSheetField.SetValueWithoutNotify(_selectedSpriteSheet);
426
- LoadAndDisplaySprites();
427
- }
428
- _animationDefinitionsListView.Rebuild();
429
- }
430
-
431
- private void OnEnable()
432
- {
433
- EditorApplication.update += _editorUpdateCallback;
434
-
435
- string data = SessionState.GetString(GetType().FullName, "");
436
- if (!string.IsNullOrEmpty(data))
437
- {
438
- JsonUtility.FromJsonOverwrite(data, this);
439
- }
440
- if (_selectedSpriteSheet != null)
441
- {
442
- EditorApplication.delayCall += () =>
443
- {
444
- if (_spriteSheetField != null)
445
- {
446
- _spriteSheetField.value = _selectedSpriteSheet;
447
- }
448
- LoadAndDisplaySprites();
449
- _animationDefinitionsListView.Rebuild();
450
- };
451
- }
452
- }
453
-
454
- private void OnDisable()
455
- {
456
- EditorApplication.update -= _editorUpdateCallback;
457
- StopCurrentPreview();
458
-
459
- string data = JsonUtility.ToJson(this);
460
- SessionState.SetString(GetType().FullName, data);
461
- }
462
-
463
- private void OnEditorUpdate()
464
- {
465
- if (
466
- !_isPreviewing
467
- || _currentPreviewDefinition is not { SpritesToAnimate: { Count: > 0 } }
468
- )
469
- {
470
- return;
471
- }
472
-
473
- _lastTick ??= _timer.Elapsed;
474
- float targetFps = 0;
475
- if (1 < _currentPreviewDefinition.SpritesToAnimate.Count)
476
- {
477
- _currentPreviewDefinition.FrameRateCurve.Evaluate(
478
- _currentPreviewSpriteIndex
479
- / (_currentPreviewDefinition.SpritesToAnimate.Count - 1f)
480
- );
481
- }
482
-
483
- if (targetFps <= 0)
484
- {
485
- targetFps = _currentPreviewDefinition.DefaultFrameRate;
486
- }
487
-
488
- if (targetFps <= 0)
489
- {
490
- targetFps = 1;
491
- }
492
-
493
- TimeSpan elapsed = _timer.Elapsed;
494
- TimeSpan deltaTime = TimeSpan.FromMilliseconds(1000 / targetFps);
495
- if (_lastTick + deltaTime > elapsed)
496
- {
497
- return;
498
- }
499
-
500
- _lastTick += deltaTime;
501
- int nextFrame = _currentPreviewSpriteIndex.WrappedIncrement(
502
- _currentPreviewDefinition.SpritesToAnimate.Count
503
- );
504
- SetPreviewFrame(nextFrame);
505
- }
506
-
507
- private void UpdateSpriteSelectionHighlight()
508
- {
509
- if (
510
- !_isDraggingToSelectSprites
511
- || _spriteSelectionDragStartIndex == -1
512
- || _spriteSelectionDragCurrentIndex == -1
513
- )
514
- {
515
- ClearSpriteSelectionHighlight();
516
- return;
517
- }
518
-
519
- int minIdx = Mathf.Min(
520
- _spriteSelectionDragStartIndex,
521
- _spriteSelectionDragCurrentIndex
522
- );
523
- int maxIdx = Mathf.Max(
524
- _spriteSelectionDragStartIndex,
525
- _spriteSelectionDragCurrentIndex
526
- );
527
-
528
- for (int i = 0; i < _spriteThumbnailsContainer.childCount; i++)
529
- {
530
- VisualElement thumb = _spriteThumbnailsContainer.ElementAt(i);
531
- if (thumb.userData is int thumbIndex)
532
- {
533
- if (thumbIndex >= minIdx && thumbIndex <= maxIdx)
534
- {
535
- thumb.style.backgroundColor = _selectedThumbnailBackgroundColor;
536
- thumb.style.borderBottomColor =
537
- _selectedThumbnailBackgroundColor.value * 1.5f;
538
- thumb.style.borderTopColor = _selectedThumbnailBackgroundColor.value * 1.5f;
539
- thumb.style.borderLeftColor =
540
- _selectedThumbnailBackgroundColor.value * 1.5f;
541
- thumb.style.borderRightColor =
542
- _selectedThumbnailBackgroundColor.value * 1.5f;
543
- }
544
- else
545
- {
546
- thumb.style.backgroundColor = _defaultThumbnailBackgroundColor;
547
- thumb.style.borderBottomColor = Color.clear;
548
- thumb.style.borderTopColor = Color.clear;
549
- thumb.style.borderLeftColor = Color.clear;
550
- thumb.style.borderRightColor = Color.clear;
551
- }
552
- }
553
- }
554
- }
555
-
556
- private void ClearSpriteSelectionHighlight()
557
- {
558
- for (int i = 0; i < _spriteThumbnailsContainer.childCount; i++)
559
- {
560
- VisualElement thumb = _spriteThumbnailsContainer.ElementAt(i);
561
- thumb.style.backgroundColor = _defaultThumbnailBackgroundColor;
562
- thumb.style.borderBottomColor = Color.clear;
563
- thumb.style.borderTopColor = Color.clear;
564
- thumb.style.borderLeftColor = Color.clear;
565
- thumb.style.borderRightColor = Color.clear;
566
- }
567
- }
568
-
569
- private void CreateAnimationDefinitionFromSelection(
570
- int startSpriteIndex,
571
- int endSpriteIndex
572
- )
573
- {
574
- if (
575
- startSpriteIndex < 0
576
- || endSpriteIndex < 0
577
- || startSpriteIndex >= _availableSprites.Count
578
- || endSpriteIndex >= _availableSprites.Count
579
- )
580
- {
581
- this.LogWarn(
582
- $"Invalid sprite indices for new animation definition from selection."
583
- );
584
- return;
585
- }
586
-
587
- AnimationDefinition newDefinition = new()
588
- {
589
- Name =
590
- _selectedSpriteSheet != null
591
- ? $"{_selectedSpriteSheet.name}_Anim_{_animationDefinitions.Count}"
592
- : $"New_Animation_{_animationDefinitions.Count}",
593
- StartSpriteIndex = startSpriteIndex,
594
- EndSpriteIndex = endSpriteIndex,
595
- DefaultFrameRate = 12f,
596
- };
597
-
598
- newDefinition.FrameRateCurve = AnimationCurve.Constant(
599
- 0,
600
- 1,
601
- newDefinition.DefaultFrameRate
602
- );
603
-
604
- _animationDefinitions.Add(newDefinition);
605
- UpdateSpritesForDefinition(newDefinition);
606
- _currentPreviewAnimDefIndex = _animationDefinitions.Count - 1;
607
- StartOrUpdateCurrentPreview(newDefinition);
608
- _animationDefinitionsListView.Rebuild();
609
-
610
- if (_animationDefinitionsListView.itemsSource.Count > 0)
611
- {
612
- _animationDefinitionsListView.ScrollToItem(_animationDefinitions.Count - 1);
613
- }
614
- }
615
-
616
- private void OnSpriteSheetSelected(ChangeEvent<Object> evt)
617
- {
618
- _selectedSpriteSheet = evt.newValue as Texture2D;
619
- _animationDefinitions.Clear();
620
- AddAnimationDefinition();
621
- _animationDefinitionsListView.Rebuild();
622
- LoadAndDisplaySprites();
623
- StopCurrentPreview();
624
- _previewImage.sprite = null;
625
- _previewImage.style.backgroundImage = null;
626
- _previewFrameLabel.text = "Frame: -/- | FPS: -";
627
- }
628
-
629
- private void LoadAndDisplaySprites()
630
- {
631
- if (_selectedSpriteSheet == null)
632
- {
633
- EditorUtility.DisplayDialog("Error", "No sprite sheet selected.", "OK");
634
- _availableSprites.Clear();
635
- UpdateSpriteThumbnails();
636
- return;
637
- }
638
-
639
- string path = AssetDatabase.GetAssetPath(_selectedSpriteSheet);
640
- if (string.IsNullOrEmpty(path))
641
- {
642
- EditorUtility.DisplayDialog("Error", "Selected texture is not an asset.", "OK");
643
- return;
644
- }
645
-
646
- TextureImporter importer = AssetImporter.GetAtPath(path) as TextureImporter;
647
- if (importer == null)
648
- {
649
- EditorUtility.DisplayDialog(
650
- "Error",
651
- "Could not get TextureImporter for the selected texture.",
652
- "OK"
653
- );
654
- return;
655
- }
656
-
657
- bool importSettingsChanged = false;
658
- if (importer.textureType != TextureImporterType.Sprite)
659
- {
660
- importer.textureType = TextureImporterType.Sprite;
661
- importSettingsChanged = true;
662
- }
663
- if (importer.spriteImportMode != SpriteImportMode.Multiple)
664
- {
665
- bool fix = EditorUtility.DisplayDialog(
666
- "Sprite Mode",
667
- "The selected texture is not in 'Sprite Mode: Multiple'. This is required to extract individual sprites.\n\nAttempt to change it automatically?",
668
- "Yes, Change It",
669
- "No, I'll Do It"
670
- );
671
- if (fix)
672
- {
673
- importer.spriteImportMode = SpriteImportMode.Multiple;
674
-
675
- importSettingsChanged = true;
676
- }
677
- else
678
- {
679
- _availableSprites.Clear();
680
- UpdateSpriteThumbnails();
681
- return;
682
- }
683
- }
684
-
685
- if (importSettingsChanged)
686
- {
687
- EditorUtility.SetDirty(importer);
688
- importer.SaveAndReimport();
689
- AssetDatabase.Refresh();
690
- }
691
-
692
- _availableSprites.Clear();
693
- Object[] assets = AssetDatabase.LoadAllAssetRepresentationsAtPath(path);
694
- foreach (Object asset in assets)
695
- {
696
- if (asset is Sprite sprite && sprite != null)
697
- {
698
- _availableSprites.Add(sprite);
699
- }
700
- }
701
-
702
- _availableSprites.SortByName();
703
-
704
- if (_availableSprites.Count == 0)
705
- {
706
- EditorUtility.DisplayDialog(
707
- "No Sprites",
708
- "No sprites found in the selected Texture. Ensure it's sliced correctly in the Sprite Editor.",
709
- "OK"
710
- );
711
- }
712
-
713
- UpdateSpriteThumbnails();
714
- UpdateAllAnimationDefinitionSprites();
715
- _animationDefinitionsListView.Rebuild();
716
- }
717
-
718
- private void UpdateSpriteThumbnails()
719
- {
720
- _spriteThumbnailsContainer.Clear();
721
- if (_availableSprites.Count == 0)
722
- {
723
- _spriteThumbnailsContainer.Add(new Label("No sprites loaded or sheet not sliced."));
724
- return;
725
- }
726
-
727
- for (int i = 0; i < _availableSprites.Count; ++i)
728
- {
729
- Sprite sprite = _availableSprites[i];
730
- VisualElement thumbContainer = new()
731
- {
732
- style =
733
- {
734
- alignItems = Align.Center,
735
- marginRight = 5,
736
- paddingBottom = 2,
737
- borderBottomWidth = 1,
738
- borderLeftWidth = 1,
739
- borderRightWidth = 1,
740
- borderTopWidth = 1,
741
- borderBottomColor = Color.clear,
742
- borderTopColor = Color.clear,
743
- borderLeftColor = Color.clear,
744
- borderRightColor = Color.clear,
745
- },
746
- };
747
- Image img = new()
748
- {
749
- sprite = sprite,
750
- scaleMode = ScaleMode.ScaleToFit,
751
- style = { width = ThumbnailSize, height = ThumbnailSize },
752
- };
753
- thumbContainer.Add(img);
754
- thumbContainer.Add(new Label($"{i}") { style = { fontSize = 9 } });
755
-
756
- int currentIndex = i;
757
- thumbContainer.userData = currentIndex;
758
-
759
- thumbContainer.RegisterCallback<PointerDownEvent>(evt =>
760
- {
761
- if (evt.button == 0)
762
- {
763
- _isDraggingToSelectSprites = true;
764
- _spriteSelectionDragStartIndex = currentIndex;
765
- _spriteSelectionDragCurrentIndex = currentIndex;
766
- UpdateSpriteSelectionHighlight();
767
-
768
- _spriteThumbnailsContainer.CapturePointer(evt.pointerId);
769
- evt.StopPropagation();
770
- }
771
- });
772
-
773
- thumbContainer.RegisterCallback<PointerEnterEvent>(_ =>
774
- {
775
- if (
776
- _isDraggingToSelectSprites
777
- && _spriteThumbnailsContainer.HasPointerCapture(PointerId.mousePointerId)
778
- && _spriteSelectionDragCurrentIndex != currentIndex
779
- )
780
- {
781
- _spriteSelectionDragCurrentIndex = currentIndex;
782
- UpdateSpriteSelectionHighlight();
783
- }
784
- });
785
- _spriteThumbnailsContainer.Add(thumbContainer);
786
- }
787
- }
788
-
789
- private void UpdateAllAnimationDefinitionSprites()
790
- {
791
- foreach (AnimationDefinition def in _animationDefinitions)
792
- {
793
- UpdateSpritesForDefinition(def);
794
- }
795
- }
796
-
797
- private static VisualElement MakeAnimationDefinitionItem()
798
- {
799
- VisualElement container = new()
800
- {
801
- style =
802
- {
803
- flexDirection = FlexDirection.Column,
804
- borderBottomWidth = 1,
805
- borderBottomColor = Color.gray,
806
- paddingBottom = 10,
807
- paddingTop = 5,
808
- },
809
- };
810
- VisualElement firstRow = new()
811
- {
812
- style =
813
- {
814
- flexDirection = FlexDirection.Row,
815
- alignItems = Align.Center,
816
- marginBottom = 3,
817
- },
818
- };
819
- VisualElement secondRow = new()
820
- {
821
- style =
822
- {
823
- flexDirection = FlexDirection.Row,
824
- alignItems = Align.Center,
825
- marginBottom = 3,
826
- },
827
- };
828
- VisualElement thirdRow = new()
829
- {
830
- style = { flexDirection = FlexDirection.Row, alignItems = Align.Center },
831
- };
832
- VisualElement fourthRow = new()
833
- {
834
- style = { flexDirection = FlexDirection.Row, alignItems = Align.Center },
835
- };
836
-
837
- TextField nameField = new("Name:")
838
- {
839
- style =
840
- {
841
- flexGrow = 1,
842
- flexShrink = 1,
843
- marginRight = 5,
844
- },
845
- };
846
- Label spriteCountLabel = new("Sprites: 0")
847
- {
848
- style = { minWidth = 80, marginRight = 5 },
849
- };
850
- Button removeButton = new() { text = "Remove", style = { minWidth = 60 } };
851
-
852
- firstRow.Add(nameField);
853
- firstRow.Add(spriteCountLabel);
854
- firstRow.Add(removeButton);
855
-
856
- IntegerField startField = new("Start Idx:")
857
- {
858
- style =
859
- {
860
- flexGrow = 1,
861
- flexShrink = 1,
862
- marginRight = 5,
863
- },
864
- tooltip = "Index of the first sprite (from 'Available Sprites' above, 0-based).",
865
- };
866
- IntegerField endField = new("End Idx:")
867
- {
868
- style =
869
- {
870
- flexGrow = 1,
871
- flexShrink = 1,
872
- marginRight = 5,
873
- },
874
- tooltip = "Index of the last sprite (inclusive).",
875
- };
876
- Button previewButton = new() { text = "Preview This", style = { minWidth = 100 } };
877
-
878
- secondRow.Add(startField);
879
- secondRow.Add(endField);
880
- secondRow.Add(previewButton);
881
-
882
- FloatField fpsField = new("Default FPS:")
883
- {
884
- style =
885
- {
886
- flexGrow = 1,
887
- flexShrink = 1,
888
- marginRight = 5,
889
- },
890
- };
891
- CurveField curveField = new("FPS Curve:") { style = { flexGrow = 1, flexShrink = 1 } };
892
-
893
- thirdRow.Add(fpsField);
894
- thirdRow.Add(curveField);
895
-
896
- Toggle looping = new("Looping:")
897
- {
898
- style =
899
- {
900
- flexGrow = 1,
901
- flexShrink = 1,
902
- marginRight = 5,
903
- },
904
- };
905
-
906
- FloatField cycleOffset = new("Cycle Offset:")
907
- {
908
- style =
909
- {
910
- flexGrow = 1,
911
- flexShrink = 1,
912
- marginRight = 5,
913
- },
914
- };
915
-
916
- fourthRow.Add(looping);
917
- fourthRow.Add(cycleOffset);
918
-
919
- container.Add(firstRow);
920
- container.Add(secondRow);
921
- container.Add(thirdRow);
922
- container.Add(fourthRow);
923
-
924
- container.userData = new AnimationDefUITags
925
- {
926
- nameField = nameField,
927
- startIndexField = startField,
928
- endIndexField = endField,
929
- defaultFrameRateField = fpsField,
930
- frameRateCurveField = curveField,
931
- spriteCountLabel = spriteCountLabel,
932
- previewButton = previewButton,
933
- removeButton = removeButton,
934
- looping = looping,
935
- cycleOffset = cycleOffset,
936
- };
937
- return container;
938
- }
939
-
940
- private class AnimationDefUITags
941
- {
942
- public TextField nameField;
943
- public IntegerField startIndexField;
944
- public IntegerField endIndexField;
945
- public FloatField defaultFrameRateField;
946
- public CurveField frameRateCurveField;
947
- public Label spriteCountLabel;
948
- public Button previewButton;
949
- public Button removeButton;
950
- public Toggle looping;
951
- public FloatField cycleOffset;
952
- }
953
-
954
- private void BindAnimationDefinitionItem(VisualElement element, int index)
955
- {
956
- AnimationDefinition definition = _animationDefinitions[index];
957
- if (element.userData is not AnimationDefUITags tags)
958
- {
959
- this.LogError(
960
- $"Element UserData was not AnimationDefUITags, found: {element.userData?.GetType()}."
961
- );
962
- return;
963
- }
964
-
965
- definition.nameField?.UnregisterValueChangedCallback(
966
- definition.nameField.userData as EventCallback<ChangeEvent<string>>
967
- );
968
-
969
- definition.startIndexField?.UnregisterValueChangedCallback(
970
- definition.startIndexField.userData as EventCallback<ChangeEvent<int>>
971
- );
972
-
973
- definition.endIndexField?.UnregisterValueChangedCallback(
974
- definition.endIndexField.userData as EventCallback<ChangeEvent<int>>
975
- );
976
-
977
- definition.defaultFrameRateField?.UnregisterValueChangedCallback(
978
- definition.defaultFrameRateField.userData as EventCallback<ChangeEvent<float>>
979
- );
980
-
981
- definition.frameRateCurveField?.UnregisterValueChangedCallback(
982
- definition.frameRateCurveField.userData
983
- as EventCallback<ChangeEvent<AnimationCurve>>
984
- );
985
-
986
- if (definition.removeButton != null)
987
- {
988
- definition.removeButton.clicked -= (Action)definition.removeButton.userData;
989
- }
990
-
991
- if (definition.previewButton != null)
992
- {
993
- definition.previewButton.clicked -= (Action)definition.previewButton.userData;
994
- }
995
-
996
- definition.loopingField?.UnregisterValueChangedCallback(
997
- (EventCallback<ChangeEvent<bool>>)definition.loopingField.userData
998
- );
999
- definition.cycleOffsetField?.UnregisterValueChangedCallback(
1000
- (EventCallback<ChangeEvent<float>>)definition.cycleOffsetField.userData
1001
- );
1002
-
1003
- definition.nameField = tags.nameField;
1004
- definition.startIndexField = tags.startIndexField;
1005
- definition.endIndexField = tags.endIndexField;
1006
- definition.defaultFrameRateField = tags.defaultFrameRateField;
1007
- definition.frameRateCurveField = tags.frameRateCurveField;
1008
- definition.spriteCountLabel = tags.spriteCountLabel;
1009
- definition.removeButton = tags.removeButton;
1010
- definition.previewButton = tags.previewButton;
1011
- definition.loopingField = tags.looping;
1012
- definition.cycleOffsetField = tags.cycleOffset;
1013
-
1014
- definition.nameField.SetValueWithoutNotify(definition.Name);
1015
- EventCallback<ChangeEvent<string>> nameChangeCallback = evt =>
1016
- {
1017
- definition.Name = evt.newValue;
1018
- };
1019
- definition.nameField.RegisterValueChangedCallback(nameChangeCallback);
1020
- definition.nameField.userData = nameChangeCallback;
1021
-
1022
- definition.startIndexField.SetValueWithoutNotify(definition.StartSpriteIndex);
1023
- EventCallback<ChangeEvent<int>> startChangeCallback = evt =>
1024
- {
1025
- definition.StartSpriteIndex = Mathf.Clamp(
1026
- evt.newValue,
1027
- 0,
1028
- _availableSprites.Count > 0 ? _availableSprites.Count - 1 : 0
1029
- );
1030
- if (
1031
- definition.StartSpriteIndex > definition.EndSpriteIndex
1032
- && 0 < _availableSprites.Count
1033
- )
1034
- {
1035
- definition.EndSpriteIndex = definition.StartSpriteIndex;
1036
- }
1037
-
1038
- definition.startIndexField.SetValueWithoutNotify(definition.StartSpriteIndex);
1039
- UpdateSpritesForDefinition(definition);
1040
- if (_currentPreviewAnimDefIndex == index)
1041
- {
1042
- StartOrUpdateCurrentPreview(definition);
1043
- }
1044
- };
1045
- definition.startIndexField.RegisterValueChangedCallback(startChangeCallback);
1046
- definition.startIndexField.userData = startChangeCallback;
1047
-
1048
- definition.endIndexField.SetValueWithoutNotify(definition.EndSpriteIndex);
1049
- EventCallback<ChangeEvent<int>> endChangeCallback = evt =>
1050
- {
1051
- definition.EndSpriteIndex = Mathf.Clamp(
1052
- evt.newValue,
1053
- 0,
1054
- _availableSprites.Count > 0 ? _availableSprites.Count - 1 : 0
1055
- );
1056
- if (
1057
- definition.EndSpriteIndex < definition.StartSpriteIndex
1058
- && 0 < _availableSprites.Count
1059
- )
1060
- {
1061
- definition.StartSpriteIndex = definition.EndSpriteIndex;
1062
- }
1063
-
1064
- definition.endIndexField.SetValueWithoutNotify(definition.EndSpriteIndex);
1065
- UpdateSpritesForDefinition(definition);
1066
- if (_currentPreviewAnimDefIndex == index)
1067
- {
1068
- StartOrUpdateCurrentPreview(definition);
1069
- }
1070
- };
1071
- definition.endIndexField.RegisterValueChangedCallback(endChangeCallback);
1072
- definition.endIndexField.userData = endChangeCallback;
1073
-
1074
- definition.defaultFrameRateField.SetValueWithoutNotify(definition.DefaultFrameRate);
1075
- EventCallback<ChangeEvent<float>> fpsChangeCallback = evt =>
1076
- {
1077
- definition.DefaultFrameRate = Mathf.Max(0.1f, evt.newValue);
1078
- definition.defaultFrameRateField.SetValueWithoutNotify(definition.DefaultFrameRate);
1079
-
1080
- if (IsCurveConstant(definition.FrameRateCurve))
1081
- {
1082
- definition.FrameRateCurve = AnimationCurve.Constant(
1083
- 0,
1084
- 1,
1085
- definition.DefaultFrameRate
1086
- );
1087
- definition.frameRateCurveField.SetValueWithoutNotify(definition.FrameRateCurve);
1088
- }
1089
- if (_currentPreviewAnimDefIndex == index)
1090
- {
1091
- StartOrUpdateCurrentPreview(definition);
1092
- }
1093
- };
1094
- definition.defaultFrameRateField.RegisterValueChangedCallback(fpsChangeCallback);
1095
- definition.defaultFrameRateField.userData = fpsChangeCallback;
1096
-
1097
- definition.frameRateCurveField.SetValueWithoutNotify(definition.FrameRateCurve);
1098
- EventCallback<ChangeEvent<AnimationCurve>> curveChangeCallback = evt =>
1099
- {
1100
- definition.FrameRateCurve = evt.newValue;
1101
- if (_currentPreviewAnimDefIndex == index)
1102
- {
1103
- StartOrUpdateCurrentPreview(definition);
1104
- }
1105
- };
1106
- definition.frameRateCurveField.RegisterValueChangedCallback(curveChangeCallback);
1107
- definition.frameRateCurveField.userData = curveChangeCallback;
1108
-
1109
- Action removeAction = () => RemoveAnimationDefinition(index);
1110
- definition.removeButton.clicked += removeAction;
1111
- definition.removeButton.userData = removeAction;
1112
-
1113
- Action previewAction = () =>
1114
- {
1115
- _currentPreviewAnimDefIndex = index;
1116
- StartOrUpdateCurrentPreview(definition);
1117
- };
1118
- definition.previewButton.clicked += previewAction;
1119
- definition.previewButton.userData = previewAction;
1120
-
1121
- EventCallback<ChangeEvent<bool>> loopingChangeCallback = evt =>
1122
- {
1123
- definition.loop = evt.newValue;
1124
- };
1125
-
1126
- definition.loopingField.RegisterValueChangedCallback(loopingChangeCallback);
1127
- definition.loopingField.userData = loopingChangeCallback;
1128
-
1129
- EventCallback<ChangeEvent<float>> cycleOffsetChangeCallback = evt =>
1130
- {
1131
- definition.cycleOffset = evt.newValue;
1132
- };
1133
- definition.cycleOffsetField.RegisterValueChangedCallback(cycleOffsetChangeCallback);
1134
- definition.cycleOffsetField.userData = cycleOffsetChangeCallback;
1135
-
1136
- UpdateSpritesForDefinition(definition);
1137
- }
1138
-
1139
- private static bool IsCurveConstant(AnimationCurve curve)
1140
- {
1141
- if (curve == null || curve.keys.Length < 2)
1142
- {
1143
- return true;
1144
- }
1145
-
1146
- float firstValue = curve.keys[0].value;
1147
- for (int i = 1; i < curve.keys.Length; ++i)
1148
- {
1149
- if (!Mathf.Approximately(curve.keys[i].value, firstValue))
1150
- {
1151
- return false;
1152
- }
1153
- }
1154
- return true;
1155
- }
1156
-
1157
- private void UpdateSpritesForDefinition(AnimationDefinition def)
1158
- {
1159
- def.SpritesToAnimate.Clear();
1160
- if (
1161
- 0 < _availableSprites.Count
1162
- && def.StartSpriteIndex <= def.EndSpriteIndex
1163
- && def.StartSpriteIndex < _availableSprites.Count
1164
- && def.EndSpriteIndex < _availableSprites.Count
1165
- && def.StartSpriteIndex >= 0
1166
- && def.EndSpriteIndex >= 0
1167
- )
1168
- {
1169
- for (int i = def.StartSpriteIndex; i <= def.EndSpriteIndex; ++i)
1170
- {
1171
- def.SpritesToAnimate.Add(_availableSprites[i]);
1172
- }
1173
- }
1174
- if (def.spriteCountLabel != null)
1175
- {
1176
- def.spriteCountLabel.text = $"Sprites: {def.SpritesToAnimate.Count}";
1177
- }
1178
- }
1179
-
1180
- private void AddAnimationDefinition()
1181
- {
1182
- AnimationDefinition newDefinition = new();
1183
- if (_selectedSpriteSheet != null)
1184
- {
1185
- newDefinition.Name =
1186
- $"{_selectedSpriteSheet.name}_Anim_{_animationDefinitions.Count}";
1187
- }
1188
- if (0 < _availableSprites.Count)
1189
- {
1190
- if (0 < _animationDefinitions.Count)
1191
- {
1192
- int nextStartIndex = _animationDefinitions[^1].EndSpriteIndex + 1;
1193
- if (_availableSprites.Count - 1 < nextStartIndex)
1194
- {
1195
- nextStartIndex = 0;
1196
- }
1197
- newDefinition.StartSpriteIndex = nextStartIndex;
1198
- }
1199
-
1200
- newDefinition.EndSpriteIndex = _availableSprites.Count - 1;
1201
- }
1202
- newDefinition.FrameRateCurve = AnimationCurve.Constant(
1203
- 0,
1204
- 1,
1205
- newDefinition.DefaultFrameRate
1206
- );
1207
- _animationDefinitions.Add(newDefinition);
1208
- _currentPreviewAnimDefIndex = _animationDefinitions.Count - 1;
1209
- StartOrUpdateCurrentPreview(newDefinition);
1210
- UpdateSpritesForDefinition(newDefinition);
1211
- _animationDefinitionsListView.Rebuild();
1212
- }
1213
-
1214
- private void RemoveAnimationDefinition(int index)
1215
- {
1216
- if (index >= 0 && index < _animationDefinitions.Count)
1217
- {
1218
- if (_currentPreviewAnimDefIndex == index)
1219
- {
1220
- StopCurrentPreview();
1221
- }
1222
-
1223
- _animationDefinitions.RemoveAt(index);
1224
- _animationDefinitionsListView.Rebuild();
1225
- if (_currentPreviewAnimDefIndex > index)
1226
- {
1227
- _currentPreviewAnimDefIndex--;
1228
- }
1229
- }
1230
- }
1231
-
1232
- private void StartOrUpdateCurrentPreview(AnimationDefinition def)
1233
- {
1234
- _currentPreviewDefinition = def;
1235
- if (def == null || def.SpritesToAnimate.Count == 0)
1236
- {
1237
- StopCurrentPreview();
1238
- _previewImage.sprite = null;
1239
- _previewImage.style.backgroundImage = null;
1240
- _previewFrameLabel.text = "Frame: -/- | FPS: -";
1241
- _previewScrubber.style.visibility = Visibility.Hidden;
1242
- return;
1243
- }
1244
-
1245
- _previewScrubber.style.visibility = Visibility.Visible;
1246
- _previewScrubber.highValue = def.SpritesToAnimate.Count > 1 ? 1f : 0f;
1247
- _previewScrubber.SetValueWithoutNotify(0);
1248
-
1249
- SetPreviewFrame(0);
1250
- }
1251
-
1252
- private void PlayCurrentPreview()
1253
- {
1254
- if (
1255
- _currentPreviewDefinition == null
1256
- || _currentPreviewDefinition.SpritesToAnimate.Count == 0
1257
- )
1258
- {
1259
- EditorUtility.DisplayDialog(
1260
- "Preview Error",
1261
- "No animation definition selected or definition has no sprites. Click 'Preview This' on an animation definition first.",
1262
- "OK"
1263
- );
1264
- return;
1265
- }
1266
-
1267
- _isPreviewing = true;
1268
- _playPreviewButton.style.display = DisplayStyle.None;
1269
- _stopPreviewButton.style.display = DisplayStyle.Flex;
1270
- }
1271
-
1272
- private void StopCurrentPreview()
1273
- {
1274
- _isPreviewing = false;
1275
- _lastTick = null;
1276
- _playPreviewButton.style.display = DisplayStyle.Flex;
1277
- _stopPreviewButton.style.display = DisplayStyle.None;
1278
- }
1279
-
1280
- private void SetPreviewFrame(int frameIndex)
1281
- {
1282
- if (_currentPreviewDefinition is not { SpritesToAnimate: { Count: > 0 } })
1283
- {
1284
- return;
1285
- }
1286
-
1287
- _currentPreviewSpriteIndex = Mathf.Clamp(
1288
- frameIndex,
1289
- 0,
1290
- _currentPreviewDefinition.SpritesToAnimate.Count - 1
1291
- );
1292
-
1293
- Sprite spriteToShow = _currentPreviewDefinition.SpritesToAnimate[
1294
- _currentPreviewSpriteIndex
1295
- ];
1296
- _previewImage.sprite = spriteToShow;
1297
- _previewImage.MarkDirtyRepaint();
1298
-
1299
- float currentCurveTime = 0f;
1300
- if (_currentPreviewDefinition.SpritesToAnimate.Count > 1)
1301
- {
1302
- currentCurveTime =
1303
- (float)_currentPreviewSpriteIndex
1304
- / (_currentPreviewDefinition.SpritesToAnimate.Count - 1);
1305
- }
1306
-
1307
- float fpsAtCurrent = _currentPreviewDefinition.FrameRateCurve.Evaluate(
1308
- currentCurveTime
1309
- * _currentPreviewDefinition.FrameRateCurve.keys.LastOrDefault().time
1310
- );
1311
- if (fpsAtCurrent <= 0)
1312
- {
1313
- fpsAtCurrent = _currentPreviewDefinition.DefaultFrameRate;
1314
- }
1315
-
1316
- _previewFrameLabel.text =
1317
- $"Frame: {_currentPreviewSpriteIndex + 1}/{_currentPreviewDefinition.SpritesToAnimate.Count} | FPS: {fpsAtCurrent:F1}";
1318
-
1319
- if (_currentPreviewDefinition.SpritesToAnimate.Count > 1)
1320
- {
1321
- _previewScrubber.SetValueWithoutNotify(
1322
- (float)_currentPreviewSpriteIndex
1323
- / (_currentPreviewDefinition.SpritesToAnimate.Count - 1)
1324
- );
1325
- }
1326
- else
1327
- {
1328
- _previewScrubber.SetValueWithoutNotify(0);
1329
- }
1330
- }
1331
-
1332
- private void AdjustPreviewFrame(int direction)
1333
- {
1334
- if (_currentPreviewDefinition is not { SpritesToAnimate: { Count: > 0 } })
1335
- {
1336
- return;
1337
- }
1338
-
1339
- StopCurrentPreview();
1340
-
1341
- int newFrame = _currentPreviewSpriteIndex + direction;
1342
-
1343
- int count = _currentPreviewDefinition.SpritesToAnimate.Count;
1344
- if (newFrame < 0)
1345
- {
1346
- newFrame = count - 1;
1347
- }
1348
-
1349
- if (newFrame >= count)
1350
- {
1351
- newFrame = 0;
1352
- }
1353
-
1354
- SetPreviewFrame(newFrame);
1355
- }
1356
-
1357
- private void GenerateAnimations()
1358
- {
1359
- if (_selectedSpriteSheet == null)
1360
- {
1361
- EditorUtility.DisplayDialog("Error", "No sprite sheet loaded.", "OK");
1362
- return;
1363
- }
1364
- if (_animationDefinitions.Count == 0)
1365
- {
1366
- EditorUtility.DisplayDialog("Error", "No animation definitions created.", "OK");
1367
- return;
1368
- }
1369
-
1370
- string sheetPath = AssetDatabase.GetAssetPath(_selectedSpriteSheet);
1371
- string directory = Path.GetDirectoryName(sheetPath);
1372
- string animationsFolder = EditorUtility.OpenFolderPanel(
1373
- "Select Output Directory",
1374
- directory,
1375
- string.Empty
1376
- );
1377
- if (string.IsNullOrWhiteSpace(animationsFolder))
1378
- {
1379
- return;
1380
- }
1381
-
1382
- if (!Directory.Exists(animationsFolder))
1383
- {
1384
- Directory.CreateDirectory(animationsFolder);
1385
- }
1386
-
1387
- if (!animationsFolder.StartsWith("Assets", StringComparison.OrdinalIgnoreCase))
1388
- {
1389
- animationsFolder = DirectoryHelper.AbsoluteToUnityRelativePath(animationsFolder);
1390
- }
1391
-
1392
- int createdCount = 0;
1393
- foreach (AnimationDefinition definition in _animationDefinitions)
1394
- {
1395
- if (definition.SpritesToAnimate.Count == 0)
1396
- {
1397
- this.LogWarn($"Skipping animation '{definition.Name}' as it has no sprites.");
1398
- continue;
1399
- }
1400
-
1401
- AnimationClip clip = new() { frameRate = 60 };
1402
-
1403
- EditorCurveBinding spriteBinding = new()
1404
- {
1405
- type = typeof(SpriteRenderer),
1406
- path = "",
1407
- propertyName = "m_Sprite",
1408
- };
1409
-
1410
- ObjectReferenceKeyframe[] keyframes = new ObjectReferenceKeyframe[
1411
- definition.SpritesToAnimate.Count
1412
- ];
1413
- float currentTime = 0f;
1414
- AnimationCurve curve = definition.FrameRateCurve;
1415
- if (curve == null || curve.keys.Length == 0)
1416
- {
1417
- this.LogWarn(
1418
- $"Animation '{definition.Name}' has an invalid FrameRateCurve. Falling back to DefaultFrameRate."
1419
- );
1420
- curve = AnimationCurve.Constant(0, 1, definition.DefaultFrameRate);
1421
- }
1422
-
1423
- if (curve.keys.Length == 0)
1424
- {
1425
- curve.AddKey(0, definition.DefaultFrameRate);
1426
- }
1427
-
1428
- float curveDuration = curve.keys.LastOrDefault().time;
1429
- if (curveDuration <= 0)
1430
- {
1431
- curveDuration = 1f;
1432
- }
1433
-
1434
- for (int i = 0; i < definition.SpritesToAnimate.Count; ++i)
1435
- {
1436
- keyframes[i] = new ObjectReferenceKeyframe
1437
- {
1438
- time = currentTime,
1439
- value = definition.SpritesToAnimate[i],
1440
- };
1441
-
1442
- if (i < definition.SpritesToAnimate.Count - 1)
1443
- {
1444
- float normalizedTimeForCurve =
1445
- definition.SpritesToAnimate.Count > 1
1446
- ? (float)i / (definition.SpritesToAnimate.Count - 1)
1447
- : 0;
1448
- float timeForCurveEval = normalizedTimeForCurve * curveDuration;
1449
-
1450
- float fps = curve.Evaluate(timeForCurveEval);
1451
- if (fps <= 0)
1452
- {
1453
- fps = definition.DefaultFrameRate;
1454
- }
1455
-
1456
- if (fps <= 0)
1457
- {
1458
- fps = 1;
1459
- }
1460
-
1461
- currentTime += 1.0f / fps;
1462
- }
1463
- }
1464
-
1465
- AnimationUtility.SetObjectReferenceCurve(clip, spriteBinding, keyframes);
1466
-
1467
- AnimationClipSettings settings = AnimationUtility.GetAnimationClipSettings(clip);
1468
- settings.loopTime = definition.loop;
1469
- settings.cycleOffset = definition.cycleOffset;
1470
- AnimationUtility.SetAnimationClipSettings(clip, settings);
1471
-
1472
- string animName = string.IsNullOrEmpty(definition.Name)
1473
- ? "UnnamedAnim"
1474
- : definition.Name;
1475
-
1476
- animName = Path.GetInvalidFileNameChars()
1477
- .Aggregate(animName, (current, character) => current.Replace(character, '_'));
1478
- string assetPath = Path.Combine(animationsFolder, $"{animName}.anim");
1479
- assetPath = AssetDatabase.GenerateUniqueAssetPath(assetPath);
1480
-
1481
- AssetDatabase.CreateAsset(clip, assetPath);
1482
- createdCount++;
1483
- }
1484
-
1485
- if (createdCount > 0)
1486
- {
1487
- AssetDatabase.SaveAssets();
1488
- AssetDatabase.Refresh();
1489
- EditorUtility.DisplayDialog(
1490
- "Success",
1491
- $"{createdCount} animation(s) created in:\n{animationsFolder}",
1492
- "OK"
1493
- );
1494
- }
1495
- else
1496
- {
1497
- EditorUtility.DisplayDialog(
1498
- "Finished",
1499
- "No valid animations were generated.",
1500
- "OK"
1501
- );
1502
- }
1503
- }
1504
-
1505
- private static void OnRootDragUpdated(DragUpdatedEvent evt)
1506
- {
1507
- if (DragAndDrop.objectReferences.Any(obj => obj is Texture2D))
1508
- {
1509
- DragAndDrop.visualMode = DragAndDropVisualMode.Copy;
1510
- }
1511
- }
1512
-
1513
- private void OnRootDragPerform(DragPerformEvent evt)
1514
- {
1515
- Texture2D draggedTexture =
1516
- DragAndDrop.objectReferences.FirstOrDefault(obj => obj is Texture2D) as Texture2D;
1517
- if (draggedTexture != null)
1518
- {
1519
- _spriteSheetField.value = draggedTexture;
1520
- DragAndDrop.AcceptDrag();
1521
- }
1522
- }
1523
-
1524
- public void OnBecameVisible()
1525
- {
1526
- rootVisualElement.RegisterCallback<DragUpdatedEvent>(OnRootDragUpdated);
1527
- rootVisualElement.RegisterCallback<DragPerformEvent>(OnRootDragPerform);
1528
- }
1529
-
1530
- public void OnBecameInvisible()
1531
- {
1532
- rootVisualElement.UnregisterCallback<DragUpdatedEvent>(OnRootDragUpdated);
1533
- rootVisualElement.UnregisterCallback<DragPerformEvent>(OnRootDragPerform);
1534
- }
1535
- }
1536
- #endif
1537
- }
1
+ // ReSharper disable HeapView.CanAvoidClosure
2
+ namespace WallstopStudios.UnityHelpers.Editor.Sprites
3
+ {
4
+ #if UNITY_EDITOR
5
+ using System;
6
+ using System.Collections.Generic;
7
+ using System.Diagnostics;
8
+ using System.IO;
9
+ using System.Linq;
10
+ using System.Runtime.Serialization;
11
+ using UnityEditor;
12
+ using UnityEditor.UIElements;
13
+ using UnityEngine;
14
+ using UnityEngine.UIElements;
15
+ using WallstopStudios.UnityHelpers.Core.Extension;
16
+ using WallstopStudios.UnityHelpers.Core.Helper;
17
+ using Object = UnityEngine.Object;
18
+
19
+ /// <summary>
20
+ /// Creates one or more AnimationClips from a single sprite sheet by selecting sprite ranges,
21
+ /// defining loop/cycle offset, and configuring per-animation constant or curve-based frame
22
+ /// rates. Includes live preview and per-definition controls.
23
+ /// </summary>
24
+ /// <remarks>
25
+ /// <para>
26
+ /// Problems this solves: turning a sliced sprite sheet into multiple clips (e.g., Idle, Walk,
27
+ /// Attack) with minimal friction and previewing playback before saving.
28
+ /// </para>
29
+ /// <para>
30
+ /// How it works: load a Texture2D with multiple sprites (sliced), pick index ranges to form an
31
+ /// animation definition, and optionally use an <see cref="AnimationCurve"/> for variable frame
32
+ /// rate. Preview playback with transport controls; save generated clips to assets.
33
+ /// </para>
34
+ /// <para>
35
+ /// Pros: rapid clip creation from a single sheet; visual selection and iteration.
36
+ /// Caveats: relies on existing sprite slicing; saving overwrites/creates .anim assets.
37
+ /// </para>
38
+ /// </remarks>
39
+ public sealed class SpriteSheetAnimationCreator : EditorWindow
40
+ {
41
+ private static bool SuppressUserPrompts { get; set; }
42
+
43
+ static SpriteSheetAnimationCreator()
44
+ {
45
+ try
46
+ {
47
+ if (Application.isBatchMode || IsInvokedByTestRunner())
48
+ {
49
+ SuppressUserPrompts = true;
50
+ }
51
+ }
52
+ catch { }
53
+ }
54
+
55
+ private static bool IsInvokedByTestRunner()
56
+ {
57
+ string[] args = Environment.GetCommandLineArgs();
58
+ for (int i = 0; i < args.Length; ++i)
59
+ {
60
+ string a = args[i];
61
+ if (
62
+ a.IndexOf("runTests", StringComparison.OrdinalIgnoreCase) >= 0
63
+ || a.IndexOf("testResults", StringComparison.OrdinalIgnoreCase) >= 0
64
+ || a.IndexOf("testPlatform", StringComparison.OrdinalIgnoreCase) >= 0
65
+ )
66
+ {
67
+ return true;
68
+ }
69
+ }
70
+ return false;
71
+ }
72
+
73
+ private const float ThumbnailSize = 64f;
74
+
75
+ private Texture2D _selectedSpriteSheet;
76
+ private readonly List<Sprite> _availableSprites = new();
77
+
78
+ private readonly List<AnimationDefinition> _animationDefinitions = new();
79
+
80
+ private ObjectField _spriteSheetField;
81
+ private Button _refreshSpritesButton;
82
+ private Button _loadSpritesButton;
83
+ private ScrollView _spriteThumbnailsScrollView;
84
+ private VisualElement _spriteThumbnailsContainer;
85
+ private ListView _animationDefinitionsListView;
86
+ private Button _addAnimationDefinitionButton;
87
+ private Button _generateAnimationsButton;
88
+
89
+ private VisualElement _previewContainer;
90
+ private Image _previewImage;
91
+ private Label _previewFrameLabel;
92
+ private Button _playPreviewButton;
93
+ private Button _stopPreviewButton;
94
+ private Button _prevFrameButton;
95
+ private Button _nextFrameButton;
96
+ private Slider _previewScrubber;
97
+
98
+ private bool _isDraggingToSelectSprites;
99
+ private int _spriteSelectionDragStartIndex = -1;
100
+ private int _spriteSelectionDragCurrentIndex = -1;
101
+ private StyleColor _selectedThumbnailBackgroundColor = new(
102
+ new Color(0.2f, 0.5f, 0.8f, 0.4f)
103
+ );
104
+ private readonly StyleColor _defaultThumbnailBackgroundColor = new(StyleKeyword.Null);
105
+
106
+ private bool _isPreviewing;
107
+ private int _currentPreviewAnimDefIndex = -1;
108
+ private int _currentPreviewSpriteIndex;
109
+ private AnimationDefinition _currentPreviewDefinition;
110
+ private readonly EditorApplication.CallbackFunction _editorUpdateCallback;
111
+ private readonly Stopwatch _timer = Stopwatch.StartNew();
112
+
113
+ private TimeSpan? _lastTick;
114
+
115
+ [MenuItem("Tools/Wallstop Studios/Unity Helpers/Sprite Sheet Animation Creator")]
116
+ public static void ShowWindow()
117
+ {
118
+ SpriteSheetAnimationCreator window = GetWindow<SpriteSheetAnimationCreator>();
119
+ window.titleContent = new GUIContent("Sprite Animation Creator");
120
+ window.minSize = new Vector2(600, 700);
121
+ }
122
+
123
+ [Serializable]
124
+ [DataContract]
125
+ public sealed class AnimationDefinition
126
+ {
127
+ public string Name = "New Animation";
128
+ public bool loop;
129
+ public float cycleOffset;
130
+ public int StartSpriteIndex;
131
+ public int EndSpriteIndex;
132
+ public float DefaultFrameRate = 12f;
133
+ public AnimationCurve FrameRateCurve = AnimationCurve.Constant(0, 1, 12f);
134
+ public List<Sprite> SpritesToAnimate = new();
135
+
136
+ public TextField nameField;
137
+ public IntegerField startIndexField;
138
+ public IntegerField endIndexField;
139
+ public FloatField defaultFrameRateField;
140
+ public CurveField frameRateCurveField;
141
+ public Label spriteCountLabel;
142
+ public Button previewButton;
143
+ public Button removeButton;
144
+ public Toggle loopingField;
145
+ public FloatField cycleOffsetField;
146
+ }
147
+
148
+ public SpriteSheetAnimationCreator()
149
+ {
150
+ _editorUpdateCallback = OnEditorUpdate;
151
+ }
152
+
153
+ public void CreateGUI()
154
+ {
155
+ VisualElement root = rootVisualElement;
156
+ root.style.paddingLeft = 10;
157
+ root.style.paddingRight = 10;
158
+ root.style.paddingTop = 10;
159
+ root.style.paddingBottom = 10;
160
+
161
+ VisualElement topSection = new()
162
+ {
163
+ style = { flexDirection = FlexDirection.Row, marginBottom = 10 },
164
+ };
165
+ _spriteSheetField = new ObjectField("Sprite Sheet")
166
+ {
167
+ objectType = typeof(Texture2D),
168
+ allowSceneObjects = false,
169
+ style =
170
+ {
171
+ flexGrow = 1,
172
+ flexShrink = 0,
173
+ minHeight = 20,
174
+ },
175
+ };
176
+ _spriteSheetField.RegisterValueChangedCallback(OnSpriteSheetSelected);
177
+ topSection.Add(_spriteSheetField);
178
+
179
+ _loadSpritesButton = new Button(() =>
180
+ {
181
+ string filePath = string.Empty;
182
+ if (_spriteSheetField.value != null)
183
+ {
184
+ filePath = AssetDatabase.GetAssetPath(_spriteSheetField.value);
185
+ }
186
+
187
+ if (string.IsNullOrWhiteSpace(filePath))
188
+ {
189
+ filePath = Application.dataPath;
190
+ }
191
+
192
+ string selectedPath = Utils.EditorUi.OpenFilePanel(
193
+ "Select Sprite Sheet",
194
+ filePath,
195
+ "png,jpg,gif,bmp,psd"
196
+ );
197
+ if (string.IsNullOrWhiteSpace(selectedPath))
198
+ {
199
+ return;
200
+ }
201
+
202
+ string relativePath = DirectoryHelper.AbsoluteToUnityRelativePath(selectedPath);
203
+ if (!string.IsNullOrWhiteSpace(relativePath))
204
+ {
205
+ Texture2D loadedTexture = AssetDatabase.LoadAssetAtPath<Texture2D>(
206
+ relativePath
207
+ );
208
+ if (loadedTexture != null)
209
+ {
210
+ _spriteSheetField.value = loadedTexture;
211
+ }
212
+ }
213
+ })
214
+ {
215
+ text = "Load Sprites",
216
+ style = { marginLeft = 5, minHeight = 20 },
217
+ };
218
+ topSection.Add(_loadSpritesButton);
219
+
220
+ _refreshSpritesButton = new Button(LoadAndDisplaySprites)
221
+ {
222
+ text = "Refresh Sprites",
223
+ style = { marginLeft = 5, minHeight = 20 },
224
+ };
225
+ topSection.Add(_refreshSpritesButton);
226
+ root.Add(topSection);
227
+
228
+ Label thumbnailsLabel = new(
229
+ "Available Sprites (Drag to select range for new animation):"
230
+ )
231
+ {
232
+ style =
233
+ {
234
+ unityFontStyleAndWeight = FontStyle.Bold,
235
+ marginTop = 5,
236
+ marginBottom = 5,
237
+ },
238
+ };
239
+ root.Add(thumbnailsLabel);
240
+ _spriteThumbnailsScrollView = new ScrollView(ScrollViewMode.Horizontal)
241
+ {
242
+ style =
243
+ {
244
+ height = ThumbnailSize + 20 + 10,
245
+ minHeight = ThumbnailSize + 20 + 10,
246
+ borderTopWidth = 1,
247
+ borderBottomWidth = 1,
248
+ borderLeftWidth = 1,
249
+ borderRightWidth = 1,
250
+ borderBottomColor = Color.gray,
251
+ borderTopColor = Color.gray,
252
+ borderLeftColor = Color.gray,
253
+ borderRightColor = Color.gray,
254
+ paddingLeft = 5,
255
+ paddingRight = 5,
256
+ paddingTop = 5,
257
+ paddingBottom = 5,
258
+ marginBottom = 10,
259
+ },
260
+ };
261
+ _spriteThumbnailsContainer = new VisualElement
262
+ {
263
+ style = { flexDirection = FlexDirection.Row },
264
+ };
265
+
266
+ _spriteThumbnailsContainer.RegisterCallback<PointerMoveEvent>(evt =>
267
+ {
268
+ if (
269
+ _isDraggingToSelectSprites
270
+ && _spriteThumbnailsContainer.HasPointerCapture(evt.pointerId)
271
+ )
272
+ {
273
+ VisualElement currentElementOver = evt.target as VisualElement;
274
+
275
+ VisualElement thumbChild = currentElementOver;
276
+ while (thumbChild != null && thumbChild.parent != _spriteThumbnailsContainer)
277
+ {
278
+ thumbChild = thumbChild.parent;
279
+ }
280
+
281
+ if (
282
+ thumbChild is { userData: int hoveredIndex }
283
+ && _spriteSelectionDragCurrentIndex != hoveredIndex
284
+ )
285
+ {
286
+ _spriteSelectionDragCurrentIndex = hoveredIndex;
287
+ UpdateSpriteSelectionHighlight();
288
+ }
289
+ }
290
+ });
291
+
292
+ _spriteThumbnailsContainer.RegisterCallback<PointerUpEvent>(
293
+ evt =>
294
+ {
295
+ if (
296
+ evt.button == 0
297
+ && _isDraggingToSelectSprites
298
+ && _spriteThumbnailsContainer.HasPointerCapture(evt.pointerId)
299
+ )
300
+ {
301
+ _spriteThumbnailsContainer.ReleasePointer(evt.pointerId);
302
+ _isDraggingToSelectSprites = false;
303
+
304
+ if (
305
+ _spriteSelectionDragStartIndex != -1
306
+ && _spriteSelectionDragCurrentIndex != -1
307
+ )
308
+ {
309
+ int start = Mathf.Min(
310
+ _spriteSelectionDragStartIndex,
311
+ _spriteSelectionDragCurrentIndex
312
+ );
313
+ int end = Mathf.Max(
314
+ _spriteSelectionDragStartIndex,
315
+ _spriteSelectionDragCurrentIndex
316
+ );
317
+
318
+ if (start <= end)
319
+ {
320
+ CreateAnimationDefinitionFromSelection(start, end);
321
+ }
322
+ }
323
+ ClearSpriteSelectionHighlight();
324
+ _spriteSelectionDragStartIndex = -1;
325
+ _spriteSelectionDragCurrentIndex = -1;
326
+ }
327
+ },
328
+ TrickleDown.TrickleDown
329
+ );
330
+
331
+ _spriteThumbnailsScrollView.Add(_spriteThumbnailsContainer);
332
+ root.Add(_spriteThumbnailsScrollView);
333
+
334
+ Label animDefsLabel = new("Animation Definitions:")
335
+ {
336
+ style =
337
+ {
338
+ unityFontStyleAndWeight = FontStyle.Bold,
339
+ marginTop = 10,
340
+ marginBottom = 5,
341
+ },
342
+ };
343
+ root.Add(animDefsLabel);
344
+
345
+ _animationDefinitionsListView = new ListView(
346
+ _animationDefinitions,
347
+ 130,
348
+ MakeAnimationDefinitionItem,
349
+ BindAnimationDefinitionItem
350
+ )
351
+ {
352
+ selectionType = SelectionType.None,
353
+ style = { flexGrow = 1, minHeight = 200 },
354
+ };
355
+ root.Add(_animationDefinitionsListView);
356
+
357
+ _addAnimationDefinitionButton = new Button(AddAnimationDefinition)
358
+ {
359
+ text = "Add Animation Definition",
360
+ style = { marginTop = 5 },
361
+ };
362
+ root.Add(_addAnimationDefinitionButton);
363
+
364
+ Label previewSectionLabel = new("Animation Preview:")
365
+ {
366
+ style =
367
+ {
368
+ unityFontStyleAndWeight = FontStyle.Bold,
369
+ marginTop = 15,
370
+ marginBottom = 5,
371
+ },
372
+ };
373
+ root.Add(previewSectionLabel);
374
+
375
+ _previewContainer = new VisualElement
376
+ {
377
+ style =
378
+ {
379
+ flexDirection = FlexDirection.Column,
380
+ alignItems = Align.Center,
381
+ borderTopWidth = 1,
382
+ borderBottomWidth = 1,
383
+ borderLeftWidth = 1,
384
+ borderRightWidth = 1,
385
+ borderBottomColor = Color.gray,
386
+ borderTopColor = Color.gray,
387
+ borderLeftColor = Color.gray,
388
+ borderRightColor = Color.gray,
389
+ paddingBottom = 10,
390
+ paddingTop = 10,
391
+ minHeight = 150,
392
+ },
393
+ };
394
+ _previewImage = new Image
395
+ {
396
+ scaleMode = ScaleMode.ScaleToFit,
397
+ style =
398
+ {
399
+ width = 128,
400
+ height = 128,
401
+ marginBottom = 10,
402
+ backgroundColor = new StyleColor(new Color(0.2f, 0.2f, 0.2f)),
403
+ },
404
+ };
405
+ _previewContainer.Add(_previewImage);
406
+
407
+ _previewFrameLabel = new Label("Frame: -/- | FPS: -")
408
+ {
409
+ style = { alignSelf = Align.Center, marginBottom = 5 },
410
+ };
411
+ _previewContainer.Add(_previewFrameLabel);
412
+
413
+ _previewScrubber = new Slider(0, 1)
414
+ {
415
+ style =
416
+ {
417
+ minWidth = 200,
418
+ marginBottom = 5,
419
+ visibility = Visibility.Hidden,
420
+ },
421
+ };
422
+ _previewScrubber.RegisterValueChangedCallback(evt =>
423
+ {
424
+ if (
425
+ _currentPreviewDefinition != null
426
+ && 0 < _currentPreviewDefinition.SpritesToAnimate.Count
427
+ )
428
+ {
429
+ int frame = Mathf.FloorToInt(
430
+ evt.newValue * (_currentPreviewDefinition.SpritesToAnimate.Count - 1)
431
+ );
432
+ SetPreviewFrame(frame);
433
+ }
434
+ });
435
+ _previewContainer.Add(_previewScrubber);
436
+
437
+ VisualElement previewControls = new()
438
+ {
439
+ style = { flexDirection = FlexDirection.Row, justifyContent = Justify.Center },
440
+ };
441
+ _prevFrameButton = new Button(() => AdjustPreviewFrame(-1))
442
+ {
443
+ text = "◀",
444
+ style = { minWidth = 40 },
445
+ };
446
+ _playPreviewButton = new Button(PlayCurrentPreview)
447
+ {
448
+ text = "▶ Play",
449
+ style = { minWidth = 70 },
450
+ };
451
+ _stopPreviewButton = new Button(StopCurrentPreview)
452
+ {
453
+ text = "◼ Stop",
454
+ style = { minWidth = 70, display = DisplayStyle.None },
455
+ };
456
+ _nextFrameButton = new Button(() => AdjustPreviewFrame(1))
457
+ {
458
+ text = "▶",
459
+ style = { minWidth = 40 },
460
+ };
461
+ previewControls.Add(_prevFrameButton);
462
+ previewControls.Add(_playPreviewButton);
463
+ previewControls.Add(_stopPreviewButton);
464
+ previewControls.Add(_nextFrameButton);
465
+ _previewContainer.Add(previewControls);
466
+ root.Add(_previewContainer);
467
+
468
+ _generateAnimationsButton = new Button(GenerateAnimations)
469
+ {
470
+ text = "Generate Animation Files",
471
+ style = { marginTop = 15, height = 30 },
472
+ };
473
+ root.Add(_generateAnimationsButton);
474
+
475
+ if (_selectedSpriteSheet != null)
476
+ {
477
+ _spriteSheetField.SetValueWithoutNotify(_selectedSpriteSheet);
478
+ LoadAndDisplaySprites();
479
+ }
480
+ _animationDefinitionsListView.Rebuild();
481
+ }
482
+
483
+ private void OnEnable()
484
+ {
485
+ EditorApplication.update += _editorUpdateCallback;
486
+
487
+ string data = SessionState.GetString(GetType().FullName, "");
488
+ if (!string.IsNullOrEmpty(data))
489
+ {
490
+ JsonUtility.FromJsonOverwrite(data, this);
491
+ }
492
+ if (_selectedSpriteSheet != null)
493
+ {
494
+ EditorApplication.delayCall += () =>
495
+ {
496
+ if (_spriteSheetField != null)
497
+ {
498
+ _spriteSheetField.value = _selectedSpriteSheet;
499
+ }
500
+ LoadAndDisplaySprites();
501
+ _animationDefinitionsListView.Rebuild();
502
+ };
503
+ }
504
+ }
505
+
506
+ private void OnDisable()
507
+ {
508
+ EditorApplication.update -= _editorUpdateCallback;
509
+ StopCurrentPreview();
510
+
511
+ string data = JsonUtility.ToJson(this);
512
+ SessionState.SetString(GetType().FullName, data);
513
+ }
514
+
515
+ private void OnEditorUpdate()
516
+ {
517
+ if (
518
+ !_isPreviewing
519
+ || _currentPreviewDefinition is not { SpritesToAnimate: { Count: > 0 } }
520
+ )
521
+ {
522
+ return;
523
+ }
524
+
525
+ _lastTick ??= _timer.Elapsed;
526
+ float targetFps = 0;
527
+ if (1 < _currentPreviewDefinition.SpritesToAnimate.Count)
528
+ {
529
+ _currentPreviewDefinition.FrameRateCurve.Evaluate(
530
+ _currentPreviewSpriteIndex
531
+ / (_currentPreviewDefinition.SpritesToAnimate.Count - 1f)
532
+ );
533
+ }
534
+
535
+ if (targetFps <= 0)
536
+ {
537
+ targetFps = _currentPreviewDefinition.DefaultFrameRate;
538
+ }
539
+
540
+ if (targetFps <= 0)
541
+ {
542
+ targetFps = 1;
543
+ }
544
+
545
+ TimeSpan elapsed = _timer.Elapsed;
546
+ TimeSpan deltaTime = TimeSpan.FromMilliseconds(1000 / targetFps);
547
+ if (_lastTick + deltaTime > elapsed)
548
+ {
549
+ return;
550
+ }
551
+
552
+ _lastTick += deltaTime;
553
+ int nextFrame = _currentPreviewSpriteIndex.WrappedIncrement(
554
+ _currentPreviewDefinition.SpritesToAnimate.Count
555
+ );
556
+ SetPreviewFrame(nextFrame);
557
+ }
558
+
559
+ private void UpdateSpriteSelectionHighlight()
560
+ {
561
+ if (
562
+ !_isDraggingToSelectSprites
563
+ || _spriteSelectionDragStartIndex == -1
564
+ || _spriteSelectionDragCurrentIndex == -1
565
+ )
566
+ {
567
+ ClearSpriteSelectionHighlight();
568
+ return;
569
+ }
570
+
571
+ int minIdx = Mathf.Min(
572
+ _spriteSelectionDragStartIndex,
573
+ _spriteSelectionDragCurrentIndex
574
+ );
575
+ int maxIdx = Mathf.Max(
576
+ _spriteSelectionDragStartIndex,
577
+ _spriteSelectionDragCurrentIndex
578
+ );
579
+
580
+ for (int i = 0; i < _spriteThumbnailsContainer.childCount; i++)
581
+ {
582
+ VisualElement thumb = _spriteThumbnailsContainer.ElementAt(i);
583
+ if (thumb.userData is int thumbIndex)
584
+ {
585
+ if (thumbIndex >= minIdx && thumbIndex <= maxIdx)
586
+ {
587
+ thumb.style.backgroundColor = _selectedThumbnailBackgroundColor;
588
+ thumb.style.borderBottomColor =
589
+ _selectedThumbnailBackgroundColor.value * 1.5f;
590
+ thumb.style.borderTopColor = _selectedThumbnailBackgroundColor.value * 1.5f;
591
+ thumb.style.borderLeftColor =
592
+ _selectedThumbnailBackgroundColor.value * 1.5f;
593
+ thumb.style.borderRightColor =
594
+ _selectedThumbnailBackgroundColor.value * 1.5f;
595
+ }
596
+ else
597
+ {
598
+ thumb.style.backgroundColor = _defaultThumbnailBackgroundColor;
599
+ thumb.style.borderBottomColor = Color.clear;
600
+ thumb.style.borderTopColor = Color.clear;
601
+ thumb.style.borderLeftColor = Color.clear;
602
+ thumb.style.borderRightColor = Color.clear;
603
+ }
604
+ }
605
+ }
606
+ }
607
+
608
+ private void ClearSpriteSelectionHighlight()
609
+ {
610
+ for (int i = 0; i < _spriteThumbnailsContainer.childCount; i++)
611
+ {
612
+ VisualElement thumb = _spriteThumbnailsContainer.ElementAt(i);
613
+ thumb.style.backgroundColor = _defaultThumbnailBackgroundColor;
614
+ thumb.style.borderBottomColor = Color.clear;
615
+ thumb.style.borderTopColor = Color.clear;
616
+ thumb.style.borderLeftColor = Color.clear;
617
+ thumb.style.borderRightColor = Color.clear;
618
+ }
619
+ }
620
+
621
+ private void CreateAnimationDefinitionFromSelection(
622
+ int startSpriteIndex,
623
+ int endSpriteIndex
624
+ )
625
+ {
626
+ if (
627
+ startSpriteIndex < 0
628
+ || endSpriteIndex < 0
629
+ || startSpriteIndex >= _availableSprites.Count
630
+ || endSpriteIndex >= _availableSprites.Count
631
+ )
632
+ {
633
+ this.LogWarn(
634
+ $"Invalid sprite indices for new animation definition from selection."
635
+ );
636
+ return;
637
+ }
638
+
639
+ AnimationDefinition newDefinition = new()
640
+ {
641
+ Name =
642
+ _selectedSpriteSheet != null
643
+ ? $"{_selectedSpriteSheet.name}_Anim_{_animationDefinitions.Count}"
644
+ : $"New_Animation_{_animationDefinitions.Count}",
645
+ StartSpriteIndex = startSpriteIndex,
646
+ EndSpriteIndex = endSpriteIndex,
647
+ DefaultFrameRate = 12f,
648
+ };
649
+
650
+ newDefinition.FrameRateCurve = AnimationCurve.Constant(
651
+ 0,
652
+ 1,
653
+ newDefinition.DefaultFrameRate
654
+ );
655
+
656
+ _animationDefinitions.Add(newDefinition);
657
+ UpdateSpritesForDefinition(newDefinition);
658
+ _currentPreviewAnimDefIndex = _animationDefinitions.Count - 1;
659
+ StartOrUpdateCurrentPreview(newDefinition);
660
+ _animationDefinitionsListView.Rebuild();
661
+
662
+ if (_animationDefinitionsListView.itemsSource.Count > 0)
663
+ {
664
+ _animationDefinitionsListView.ScrollToItem(_animationDefinitions.Count - 1);
665
+ }
666
+ }
667
+
668
+ private void OnSpriteSheetSelected(ChangeEvent<Object> evt)
669
+ {
670
+ _selectedSpriteSheet = evt.newValue as Texture2D;
671
+ _animationDefinitions.Clear();
672
+ AddAnimationDefinition();
673
+ _animationDefinitionsListView.Rebuild();
674
+ LoadAndDisplaySprites();
675
+ StopCurrentPreview();
676
+ _previewImage.sprite = null;
677
+ _previewImage.style.backgroundImage = null;
678
+ _previewFrameLabel.text = "Frame: -/- | FPS: -";
679
+ }
680
+
681
+ private void LoadAndDisplaySprites()
682
+ {
683
+ if (_selectedSpriteSheet == null)
684
+ {
685
+ Utils.EditorUi.Info("Error", "No sprite sheet selected.");
686
+ _availableSprites.Clear();
687
+ UpdateSpriteThumbnails();
688
+ return;
689
+ }
690
+
691
+ string path = AssetDatabase.GetAssetPath(_selectedSpriteSheet);
692
+ if (string.IsNullOrEmpty(path))
693
+ {
694
+ Utils.EditorUi.Info("Error", "Selected texture is not an asset.");
695
+ return;
696
+ }
697
+
698
+ TextureImporter importer = AssetImporter.GetAtPath(path) as TextureImporter;
699
+ if (importer == null)
700
+ {
701
+ Utils.EditorUi.Info(
702
+ "Error",
703
+ "Could not get TextureImporter for the selected texture."
704
+ );
705
+ return;
706
+ }
707
+
708
+ bool importSettingsChanged = false;
709
+ if (importer.textureType != TextureImporterType.Sprite)
710
+ {
711
+ importer.textureType = TextureImporterType.Sprite;
712
+ importSettingsChanged = true;
713
+ }
714
+ if (importer.spriteImportMode != SpriteImportMode.Multiple)
715
+ {
716
+ bool fix = SuppressUserPrompts
717
+ ? false
718
+ : Utils.EditorUi.Confirm(
719
+ "Sprite Mode",
720
+ "The selected texture is not in 'Sprite Mode: Multiple'. This is required to extract individual sprites.\n\nAttempt to change it automatically?",
721
+ "Yes, Change It",
722
+ "No, I'll Do It",
723
+ defaultWhenSuppressed: true
724
+ );
725
+ if (fix)
726
+ {
727
+ importer.spriteImportMode = SpriteImportMode.Multiple;
728
+
729
+ importSettingsChanged = true;
730
+ }
731
+ else
732
+ {
733
+ _availableSprites.Clear();
734
+ UpdateSpriteThumbnails();
735
+ return;
736
+ }
737
+ }
738
+
739
+ if (importSettingsChanged)
740
+ {
741
+ EditorUtility.SetDirty(importer);
742
+ importer.SaveAndReimport();
743
+ AssetDatabase.Refresh();
744
+ }
745
+
746
+ _availableSprites.Clear();
747
+ Object[] assets = AssetDatabase.LoadAllAssetRepresentationsAtPath(path);
748
+ foreach (Object asset in assets)
749
+ {
750
+ if (asset is Sprite sprite && sprite != null)
751
+ {
752
+ _availableSprites.Add(sprite);
753
+ }
754
+ }
755
+
756
+ _availableSprites.SortByName();
757
+
758
+ if (_availableSprites.Count == 0)
759
+ {
760
+ Utils.EditorUi.Info(
761
+ "No Sprites",
762
+ "No sprites found in the selected Texture. Ensure it's sliced correctly in the Sprite Editor."
763
+ );
764
+ }
765
+
766
+ UpdateSpriteThumbnails();
767
+ UpdateAllAnimationDefinitionSprites();
768
+ _animationDefinitionsListView.Rebuild();
769
+ }
770
+
771
+ private void UpdateSpriteThumbnails()
772
+ {
773
+ _spriteThumbnailsContainer.Clear();
774
+ if (_availableSprites.Count == 0)
775
+ {
776
+ _spriteThumbnailsContainer.Add(new Label("No sprites loaded or sheet not sliced."));
777
+ return;
778
+ }
779
+
780
+ for (int i = 0; i < _availableSprites.Count; ++i)
781
+ {
782
+ Sprite sprite = _availableSprites[i];
783
+ VisualElement thumbContainer = new()
784
+ {
785
+ style =
786
+ {
787
+ alignItems = Align.Center,
788
+ marginRight = 5,
789
+ paddingBottom = 2,
790
+ borderBottomWidth = 1,
791
+ borderLeftWidth = 1,
792
+ borderRightWidth = 1,
793
+ borderTopWidth = 1,
794
+ borderBottomColor = Color.clear,
795
+ borderTopColor = Color.clear,
796
+ borderLeftColor = Color.clear,
797
+ borderRightColor = Color.clear,
798
+ },
799
+ };
800
+ Image img = new()
801
+ {
802
+ sprite = sprite,
803
+ scaleMode = ScaleMode.ScaleToFit,
804
+ style = { width = ThumbnailSize, height = ThumbnailSize },
805
+ };
806
+ thumbContainer.Add(img);
807
+ thumbContainer.Add(new Label($"{i}") { style = { fontSize = 9 } });
808
+
809
+ int currentIndex = i;
810
+ thumbContainer.userData = currentIndex;
811
+
812
+ thumbContainer.RegisterCallback<PointerDownEvent>(evt =>
813
+ {
814
+ if (evt.button == 0)
815
+ {
816
+ _isDraggingToSelectSprites = true;
817
+ _spriteSelectionDragStartIndex = currentIndex;
818
+ _spriteSelectionDragCurrentIndex = currentIndex;
819
+ UpdateSpriteSelectionHighlight();
820
+
821
+ _spriteThumbnailsContainer.CapturePointer(evt.pointerId);
822
+ evt.StopPropagation();
823
+ }
824
+ });
825
+
826
+ thumbContainer.RegisterCallback<PointerEnterEvent>(_ =>
827
+ {
828
+ if (
829
+ _isDraggingToSelectSprites
830
+ && _spriteThumbnailsContainer.HasPointerCapture(PointerId.mousePointerId)
831
+ && _spriteSelectionDragCurrentIndex != currentIndex
832
+ )
833
+ {
834
+ _spriteSelectionDragCurrentIndex = currentIndex;
835
+ UpdateSpriteSelectionHighlight();
836
+ }
837
+ });
838
+ _spriteThumbnailsContainer.Add(thumbContainer);
839
+ }
840
+ }
841
+
842
+ private void UpdateAllAnimationDefinitionSprites()
843
+ {
844
+ foreach (AnimationDefinition def in _animationDefinitions)
845
+ {
846
+ UpdateSpritesForDefinition(def);
847
+ }
848
+ }
849
+
850
+ private static VisualElement MakeAnimationDefinitionItem()
851
+ {
852
+ VisualElement container = new()
853
+ {
854
+ style =
855
+ {
856
+ flexDirection = FlexDirection.Column,
857
+ borderBottomWidth = 1,
858
+ borderBottomColor = Color.gray,
859
+ paddingBottom = 10,
860
+ paddingTop = 5,
861
+ },
862
+ };
863
+ VisualElement firstRow = new()
864
+ {
865
+ style =
866
+ {
867
+ flexDirection = FlexDirection.Row,
868
+ alignItems = Align.Center,
869
+ marginBottom = 3,
870
+ },
871
+ };
872
+ VisualElement secondRow = new()
873
+ {
874
+ style =
875
+ {
876
+ flexDirection = FlexDirection.Row,
877
+ alignItems = Align.Center,
878
+ marginBottom = 3,
879
+ },
880
+ };
881
+ VisualElement thirdRow = new()
882
+ {
883
+ style = { flexDirection = FlexDirection.Row, alignItems = Align.Center },
884
+ };
885
+ VisualElement fourthRow = new()
886
+ {
887
+ style = { flexDirection = FlexDirection.Row, alignItems = Align.Center },
888
+ };
889
+
890
+ TextField nameField = new("Name:")
891
+ {
892
+ style =
893
+ {
894
+ flexGrow = 1,
895
+ flexShrink = 1,
896
+ marginRight = 5,
897
+ },
898
+ };
899
+ Label spriteCountLabel = new("Sprites: 0")
900
+ {
901
+ style = { minWidth = 80, marginRight = 5 },
902
+ };
903
+ Button removeButton = new() { text = "Remove", style = { minWidth = 60 } };
904
+
905
+ firstRow.Add(nameField);
906
+ firstRow.Add(spriteCountLabel);
907
+ firstRow.Add(removeButton);
908
+
909
+ IntegerField startField = new("Start Idx:")
910
+ {
911
+ style =
912
+ {
913
+ flexGrow = 1,
914
+ flexShrink = 1,
915
+ marginRight = 5,
916
+ },
917
+ tooltip = "Index of the first sprite (from 'Available Sprites' above, 0-based).",
918
+ };
919
+ IntegerField endField = new("End Idx:")
920
+ {
921
+ style =
922
+ {
923
+ flexGrow = 1,
924
+ flexShrink = 1,
925
+ marginRight = 5,
926
+ },
927
+ tooltip = "Index of the last sprite (inclusive).",
928
+ };
929
+ Button previewButton = new() { text = "Preview This", style = { minWidth = 100 } };
930
+
931
+ secondRow.Add(startField);
932
+ secondRow.Add(endField);
933
+ secondRow.Add(previewButton);
934
+
935
+ FloatField fpsField = new("Default FPS:")
936
+ {
937
+ style =
938
+ {
939
+ flexGrow = 1,
940
+ flexShrink = 1,
941
+ marginRight = 5,
942
+ },
943
+ };
944
+ CurveField curveField = new("FPS Curve:") { style = { flexGrow = 1, flexShrink = 1 } };
945
+
946
+ thirdRow.Add(fpsField);
947
+ thirdRow.Add(curveField);
948
+
949
+ Toggle looping = new("Looping:")
950
+ {
951
+ style =
952
+ {
953
+ flexGrow = 1,
954
+ flexShrink = 1,
955
+ marginRight = 5,
956
+ },
957
+ };
958
+
959
+ FloatField cycleOffset = new("Cycle Offset:")
960
+ {
961
+ style =
962
+ {
963
+ flexGrow = 1,
964
+ flexShrink = 1,
965
+ marginRight = 5,
966
+ },
967
+ };
968
+
969
+ fourthRow.Add(looping);
970
+ fourthRow.Add(cycleOffset);
971
+
972
+ container.Add(firstRow);
973
+ container.Add(secondRow);
974
+ container.Add(thirdRow);
975
+ container.Add(fourthRow);
976
+
977
+ container.userData = new AnimationDefUITags
978
+ {
979
+ nameField = nameField,
980
+ startIndexField = startField,
981
+ endIndexField = endField,
982
+ defaultFrameRateField = fpsField,
983
+ frameRateCurveField = curveField,
984
+ spriteCountLabel = spriteCountLabel,
985
+ previewButton = previewButton,
986
+ removeButton = removeButton,
987
+ looping = looping,
988
+ cycleOffset = cycleOffset,
989
+ };
990
+ return container;
991
+ }
992
+
993
+ private class AnimationDefUITags
994
+ {
995
+ public TextField nameField;
996
+ public IntegerField startIndexField;
997
+ public IntegerField endIndexField;
998
+ public FloatField defaultFrameRateField;
999
+ public CurveField frameRateCurveField;
1000
+ public Label spriteCountLabel;
1001
+ public Button previewButton;
1002
+ public Button removeButton;
1003
+ public Toggle looping;
1004
+ public FloatField cycleOffset;
1005
+ }
1006
+
1007
+ private void BindAnimationDefinitionItem(VisualElement element, int index)
1008
+ {
1009
+ AnimationDefinition definition = _animationDefinitions[index];
1010
+ if (element.userData is not AnimationDefUITags tags)
1011
+ {
1012
+ this.LogError(
1013
+ $"Element UserData was not AnimationDefUITags, found: {element.userData?.GetType()}."
1014
+ );
1015
+ return;
1016
+ }
1017
+
1018
+ definition.nameField?.UnregisterValueChangedCallback(
1019
+ definition.nameField.userData as EventCallback<ChangeEvent<string>>
1020
+ );
1021
+
1022
+ definition.startIndexField?.UnregisterValueChangedCallback(
1023
+ definition.startIndexField.userData as EventCallback<ChangeEvent<int>>
1024
+ );
1025
+
1026
+ definition.endIndexField?.UnregisterValueChangedCallback(
1027
+ definition.endIndexField.userData as EventCallback<ChangeEvent<int>>
1028
+ );
1029
+
1030
+ definition.defaultFrameRateField?.UnregisterValueChangedCallback(
1031
+ definition.defaultFrameRateField.userData as EventCallback<ChangeEvent<float>>
1032
+ );
1033
+
1034
+ definition.frameRateCurveField?.UnregisterValueChangedCallback(
1035
+ definition.frameRateCurveField.userData
1036
+ as EventCallback<ChangeEvent<AnimationCurve>>
1037
+ );
1038
+
1039
+ if (definition.removeButton != null)
1040
+ {
1041
+ definition.removeButton.clicked -= (Action)definition.removeButton.userData;
1042
+ }
1043
+
1044
+ if (definition.previewButton != null)
1045
+ {
1046
+ definition.previewButton.clicked -= (Action)definition.previewButton.userData;
1047
+ }
1048
+
1049
+ definition.loopingField?.UnregisterValueChangedCallback(
1050
+ (EventCallback<ChangeEvent<bool>>)definition.loopingField.userData
1051
+ );
1052
+ definition.cycleOffsetField?.UnregisterValueChangedCallback(
1053
+ (EventCallback<ChangeEvent<float>>)definition.cycleOffsetField.userData
1054
+ );
1055
+
1056
+ definition.nameField = tags.nameField;
1057
+ definition.startIndexField = tags.startIndexField;
1058
+ definition.endIndexField = tags.endIndexField;
1059
+ definition.defaultFrameRateField = tags.defaultFrameRateField;
1060
+ definition.frameRateCurveField = tags.frameRateCurveField;
1061
+ definition.spriteCountLabel = tags.spriteCountLabel;
1062
+ definition.removeButton = tags.removeButton;
1063
+ definition.previewButton = tags.previewButton;
1064
+ definition.loopingField = tags.looping;
1065
+ definition.cycleOffsetField = tags.cycleOffset;
1066
+
1067
+ definition.nameField.SetValueWithoutNotify(definition.Name);
1068
+ EventCallback<ChangeEvent<string>> nameChangeCallback = evt =>
1069
+ {
1070
+ definition.Name = evt.newValue;
1071
+ };
1072
+ definition.nameField.RegisterValueChangedCallback(nameChangeCallback);
1073
+ definition.nameField.userData = nameChangeCallback;
1074
+
1075
+ definition.startIndexField.SetValueWithoutNotify(definition.StartSpriteIndex);
1076
+ EventCallback<ChangeEvent<int>> startChangeCallback = evt =>
1077
+ {
1078
+ definition.StartSpriteIndex = Mathf.Clamp(
1079
+ evt.newValue,
1080
+ 0,
1081
+ _availableSprites.Count > 0 ? _availableSprites.Count - 1 : 0
1082
+ );
1083
+ if (
1084
+ definition.StartSpriteIndex > definition.EndSpriteIndex
1085
+ && 0 < _availableSprites.Count
1086
+ )
1087
+ {
1088
+ definition.EndSpriteIndex = definition.StartSpriteIndex;
1089
+ }
1090
+
1091
+ definition.startIndexField.SetValueWithoutNotify(definition.StartSpriteIndex);
1092
+ UpdateSpritesForDefinition(definition);
1093
+ if (_currentPreviewAnimDefIndex == index)
1094
+ {
1095
+ StartOrUpdateCurrentPreview(definition);
1096
+ }
1097
+ };
1098
+ definition.startIndexField.RegisterValueChangedCallback(startChangeCallback);
1099
+ definition.startIndexField.userData = startChangeCallback;
1100
+
1101
+ definition.endIndexField.SetValueWithoutNotify(definition.EndSpriteIndex);
1102
+ EventCallback<ChangeEvent<int>> endChangeCallback = evt =>
1103
+ {
1104
+ definition.EndSpriteIndex = Mathf.Clamp(
1105
+ evt.newValue,
1106
+ 0,
1107
+ _availableSprites.Count > 0 ? _availableSprites.Count - 1 : 0
1108
+ );
1109
+ if (
1110
+ definition.EndSpriteIndex < definition.StartSpriteIndex
1111
+ && 0 < _availableSprites.Count
1112
+ )
1113
+ {
1114
+ definition.StartSpriteIndex = definition.EndSpriteIndex;
1115
+ }
1116
+
1117
+ definition.endIndexField.SetValueWithoutNotify(definition.EndSpriteIndex);
1118
+ UpdateSpritesForDefinition(definition);
1119
+ if (_currentPreviewAnimDefIndex == index)
1120
+ {
1121
+ StartOrUpdateCurrentPreview(definition);
1122
+ }
1123
+ };
1124
+ definition.endIndexField.RegisterValueChangedCallback(endChangeCallback);
1125
+ definition.endIndexField.userData = endChangeCallback;
1126
+
1127
+ definition.defaultFrameRateField.SetValueWithoutNotify(definition.DefaultFrameRate);
1128
+ EventCallback<ChangeEvent<float>> fpsChangeCallback = evt =>
1129
+ {
1130
+ definition.DefaultFrameRate = Mathf.Max(0.1f, evt.newValue);
1131
+ definition.defaultFrameRateField.SetValueWithoutNotify(definition.DefaultFrameRate);
1132
+
1133
+ if (IsCurveConstant(definition.FrameRateCurve))
1134
+ {
1135
+ definition.FrameRateCurve = AnimationCurve.Constant(
1136
+ 0,
1137
+ 1,
1138
+ definition.DefaultFrameRate
1139
+ );
1140
+ definition.frameRateCurveField.SetValueWithoutNotify(definition.FrameRateCurve);
1141
+ }
1142
+ if (_currentPreviewAnimDefIndex == index)
1143
+ {
1144
+ StartOrUpdateCurrentPreview(definition);
1145
+ }
1146
+ };
1147
+ definition.defaultFrameRateField.RegisterValueChangedCallback(fpsChangeCallback);
1148
+ definition.defaultFrameRateField.userData = fpsChangeCallback;
1149
+
1150
+ definition.frameRateCurveField.SetValueWithoutNotify(definition.FrameRateCurve);
1151
+ EventCallback<ChangeEvent<AnimationCurve>> curveChangeCallback = evt =>
1152
+ {
1153
+ definition.FrameRateCurve = evt.newValue;
1154
+ if (_currentPreviewAnimDefIndex == index)
1155
+ {
1156
+ StartOrUpdateCurrentPreview(definition);
1157
+ }
1158
+ };
1159
+ definition.frameRateCurveField.RegisterValueChangedCallback(curveChangeCallback);
1160
+ definition.frameRateCurveField.userData = curveChangeCallback;
1161
+
1162
+ Action removeAction = () => RemoveAnimationDefinition(index);
1163
+ definition.removeButton.clicked += removeAction;
1164
+ definition.removeButton.userData = removeAction;
1165
+
1166
+ Action previewAction = () =>
1167
+ {
1168
+ _currentPreviewAnimDefIndex = index;
1169
+ StartOrUpdateCurrentPreview(definition);
1170
+ };
1171
+ definition.previewButton.clicked += previewAction;
1172
+ definition.previewButton.userData = previewAction;
1173
+
1174
+ EventCallback<ChangeEvent<bool>> loopingChangeCallback = evt =>
1175
+ {
1176
+ definition.loop = evt.newValue;
1177
+ };
1178
+
1179
+ definition.loopingField.RegisterValueChangedCallback(loopingChangeCallback);
1180
+ definition.loopingField.userData = loopingChangeCallback;
1181
+
1182
+ EventCallback<ChangeEvent<float>> cycleOffsetChangeCallback = evt =>
1183
+ {
1184
+ definition.cycleOffset = evt.newValue;
1185
+ };
1186
+ definition.cycleOffsetField.RegisterValueChangedCallback(cycleOffsetChangeCallback);
1187
+ definition.cycleOffsetField.userData = cycleOffsetChangeCallback;
1188
+
1189
+ UpdateSpritesForDefinition(definition);
1190
+ }
1191
+
1192
+ private static bool IsCurveConstant(AnimationCurve curve)
1193
+ {
1194
+ if (curve == null || curve.keys.Length < 2)
1195
+ {
1196
+ return true;
1197
+ }
1198
+
1199
+ float firstValue = curve.keys[0].value;
1200
+ for (int i = 1; i < curve.keys.Length; ++i)
1201
+ {
1202
+ if (!Mathf.Approximately(curve.keys[i].value, firstValue))
1203
+ {
1204
+ return false;
1205
+ }
1206
+ }
1207
+ return true;
1208
+ }
1209
+
1210
+ private void UpdateSpritesForDefinition(AnimationDefinition def)
1211
+ {
1212
+ def.SpritesToAnimate.Clear();
1213
+ if (
1214
+ 0 < _availableSprites.Count
1215
+ && def.StartSpriteIndex <= def.EndSpriteIndex
1216
+ && def.StartSpriteIndex < _availableSprites.Count
1217
+ && def.EndSpriteIndex < _availableSprites.Count
1218
+ && def.StartSpriteIndex >= 0
1219
+ && def.EndSpriteIndex >= 0
1220
+ )
1221
+ {
1222
+ for (int i = def.StartSpriteIndex; i <= def.EndSpriteIndex; ++i)
1223
+ {
1224
+ def.SpritesToAnimate.Add(_availableSprites[i]);
1225
+ }
1226
+ }
1227
+ if (def.spriteCountLabel != null)
1228
+ {
1229
+ def.spriteCountLabel.text = $"Sprites: {def.SpritesToAnimate.Count}";
1230
+ }
1231
+ }
1232
+
1233
+ private void AddAnimationDefinition()
1234
+ {
1235
+ AnimationDefinition newDefinition = new();
1236
+ if (_selectedSpriteSheet != null)
1237
+ {
1238
+ newDefinition.Name =
1239
+ $"{_selectedSpriteSheet.name}_Anim_{_animationDefinitions.Count}";
1240
+ }
1241
+ if (0 < _availableSprites.Count)
1242
+ {
1243
+ if (0 < _animationDefinitions.Count)
1244
+ {
1245
+ int nextStartIndex = _animationDefinitions[^1].EndSpriteIndex + 1;
1246
+ if (_availableSprites.Count - 1 < nextStartIndex)
1247
+ {
1248
+ nextStartIndex = 0;
1249
+ }
1250
+ newDefinition.StartSpriteIndex = nextStartIndex;
1251
+ }
1252
+
1253
+ newDefinition.EndSpriteIndex = _availableSprites.Count - 1;
1254
+ }
1255
+ newDefinition.FrameRateCurve = AnimationCurve.Constant(
1256
+ 0,
1257
+ 1,
1258
+ newDefinition.DefaultFrameRate
1259
+ );
1260
+ _animationDefinitions.Add(newDefinition);
1261
+ _currentPreviewAnimDefIndex = _animationDefinitions.Count - 1;
1262
+ StartOrUpdateCurrentPreview(newDefinition);
1263
+ UpdateSpritesForDefinition(newDefinition);
1264
+ _animationDefinitionsListView.Rebuild();
1265
+ }
1266
+
1267
+ private void RemoveAnimationDefinition(int index)
1268
+ {
1269
+ if (index >= 0 && index < _animationDefinitions.Count)
1270
+ {
1271
+ if (_currentPreviewAnimDefIndex == index)
1272
+ {
1273
+ StopCurrentPreview();
1274
+ }
1275
+
1276
+ _animationDefinitions.RemoveAt(index);
1277
+ _animationDefinitionsListView.Rebuild();
1278
+ if (_currentPreviewAnimDefIndex > index)
1279
+ {
1280
+ _currentPreviewAnimDefIndex--;
1281
+ }
1282
+ }
1283
+ }
1284
+
1285
+ private void StartOrUpdateCurrentPreview(AnimationDefinition def)
1286
+ {
1287
+ _currentPreviewDefinition = def;
1288
+ if (def == null || def.SpritesToAnimate.Count == 0)
1289
+ {
1290
+ StopCurrentPreview();
1291
+ _previewImage.sprite = null;
1292
+ _previewImage.style.backgroundImage = null;
1293
+ _previewFrameLabel.text = "Frame: -/- | FPS: -";
1294
+ _previewScrubber.style.visibility = Visibility.Hidden;
1295
+ return;
1296
+ }
1297
+
1298
+ _previewScrubber.style.visibility = Visibility.Visible;
1299
+ _previewScrubber.highValue = def.SpritesToAnimate.Count > 1 ? 1f : 0f;
1300
+ _previewScrubber.SetValueWithoutNotify(0);
1301
+
1302
+ SetPreviewFrame(0);
1303
+ }
1304
+
1305
+ private void PlayCurrentPreview()
1306
+ {
1307
+ if (
1308
+ _currentPreviewDefinition == null
1309
+ || _currentPreviewDefinition.SpritesToAnimate.Count == 0
1310
+ )
1311
+ {
1312
+ Utils.EditorUi.Info(
1313
+ "Preview Error",
1314
+ "No animation definition selected or definition has no sprites. Click 'Preview This' on an animation definition first."
1315
+ );
1316
+ return;
1317
+ }
1318
+
1319
+ _isPreviewing = true;
1320
+ _playPreviewButton.style.display = DisplayStyle.None;
1321
+ _stopPreviewButton.style.display = DisplayStyle.Flex;
1322
+ }
1323
+
1324
+ private void StopCurrentPreview()
1325
+ {
1326
+ _isPreviewing = false;
1327
+ _lastTick = null;
1328
+ _playPreviewButton.style.display = DisplayStyle.Flex;
1329
+ _stopPreviewButton.style.display = DisplayStyle.None;
1330
+ }
1331
+
1332
+ private void SetPreviewFrame(int frameIndex)
1333
+ {
1334
+ if (_currentPreviewDefinition is not { SpritesToAnimate: { Count: > 0 } })
1335
+ {
1336
+ return;
1337
+ }
1338
+
1339
+ _currentPreviewSpriteIndex = Mathf.Clamp(
1340
+ frameIndex,
1341
+ 0,
1342
+ _currentPreviewDefinition.SpritesToAnimate.Count - 1
1343
+ );
1344
+
1345
+ Sprite spriteToShow = _currentPreviewDefinition.SpritesToAnimate[
1346
+ _currentPreviewSpriteIndex
1347
+ ];
1348
+ _previewImage.sprite = spriteToShow;
1349
+ _previewImage.MarkDirtyRepaint();
1350
+
1351
+ float currentCurveTime = 0f;
1352
+ if (_currentPreviewDefinition.SpritesToAnimate.Count > 1)
1353
+ {
1354
+ currentCurveTime =
1355
+ (float)_currentPreviewSpriteIndex
1356
+ / (_currentPreviewDefinition.SpritesToAnimate.Count - 1);
1357
+ }
1358
+
1359
+ float fpsAtCurrent = _currentPreviewDefinition.FrameRateCurve.Evaluate(
1360
+ currentCurveTime
1361
+ * _currentPreviewDefinition.FrameRateCurve.keys.LastOrDefault().time
1362
+ );
1363
+ if (fpsAtCurrent <= 0)
1364
+ {
1365
+ fpsAtCurrent = _currentPreviewDefinition.DefaultFrameRate;
1366
+ }
1367
+
1368
+ _previewFrameLabel.text =
1369
+ $"Frame: {_currentPreviewSpriteIndex + 1}/{_currentPreviewDefinition.SpritesToAnimate.Count} | FPS: {fpsAtCurrent:F1}";
1370
+
1371
+ if (_currentPreviewDefinition.SpritesToAnimate.Count > 1)
1372
+ {
1373
+ _previewScrubber.SetValueWithoutNotify(
1374
+ (float)_currentPreviewSpriteIndex
1375
+ / (_currentPreviewDefinition.SpritesToAnimate.Count - 1)
1376
+ );
1377
+ }
1378
+ else
1379
+ {
1380
+ _previewScrubber.SetValueWithoutNotify(0);
1381
+ }
1382
+ }
1383
+
1384
+ private void AdjustPreviewFrame(int direction)
1385
+ {
1386
+ if (_currentPreviewDefinition is not { SpritesToAnimate: { Count: > 0 } })
1387
+ {
1388
+ return;
1389
+ }
1390
+
1391
+ StopCurrentPreview();
1392
+
1393
+ int newFrame = _currentPreviewSpriteIndex + direction;
1394
+
1395
+ int count = _currentPreviewDefinition.SpritesToAnimate.Count;
1396
+ if (newFrame < 0)
1397
+ {
1398
+ newFrame = count - 1;
1399
+ }
1400
+
1401
+ if (newFrame >= count)
1402
+ {
1403
+ newFrame = 0;
1404
+ }
1405
+
1406
+ SetPreviewFrame(newFrame);
1407
+ }
1408
+
1409
+ private void GenerateAnimations()
1410
+ {
1411
+ if (_selectedSpriteSheet == null)
1412
+ {
1413
+ Utils.EditorUi.Info("Error", "No sprite sheet loaded.");
1414
+ return;
1415
+ }
1416
+ if (_animationDefinitions.Count == 0)
1417
+ {
1418
+ Utils.EditorUi.Info("Error", "No animation definitions created.");
1419
+ return;
1420
+ }
1421
+
1422
+ string sheetPath = AssetDatabase.GetAssetPath(_selectedSpriteSheet);
1423
+ string directory = Path.GetDirectoryName(sheetPath);
1424
+ string animationsFolder = SuppressUserPrompts
1425
+ ? string.Empty
1426
+ : Utils.EditorUi.OpenFolderPanel(
1427
+ "Select Output Directory",
1428
+ directory,
1429
+ string.Empty
1430
+ );
1431
+ if (string.IsNullOrWhiteSpace(animationsFolder))
1432
+ {
1433
+ return;
1434
+ }
1435
+
1436
+ if (!Directory.Exists(animationsFolder))
1437
+ {
1438
+ Directory.CreateDirectory(animationsFolder);
1439
+ }
1440
+
1441
+ if (!animationsFolder.StartsWith("Assets", StringComparison.OrdinalIgnoreCase))
1442
+ {
1443
+ animationsFolder = DirectoryHelper.AbsoluteToUnityRelativePath(animationsFolder);
1444
+ }
1445
+
1446
+ int createdCount = 0;
1447
+ foreach (AnimationDefinition definition in _animationDefinitions)
1448
+ {
1449
+ if (definition.SpritesToAnimate.Count == 0)
1450
+ {
1451
+ this.LogWarn($"Skipping animation '{definition.Name}' as it has no sprites.");
1452
+ continue;
1453
+ }
1454
+
1455
+ AnimationClip clip = new() { frameRate = 60 };
1456
+
1457
+ EditorCurveBinding spriteBinding = new()
1458
+ {
1459
+ type = typeof(SpriteRenderer),
1460
+ path = "",
1461
+ propertyName = "m_Sprite",
1462
+ };
1463
+
1464
+ ObjectReferenceKeyframe[] keyframes = new ObjectReferenceKeyframe[
1465
+ definition.SpritesToAnimate.Count
1466
+ ];
1467
+ float currentTime = 0f;
1468
+ AnimationCurve curve = definition.FrameRateCurve;
1469
+ if (curve == null || curve.keys.Length == 0)
1470
+ {
1471
+ this.LogWarn(
1472
+ $"Animation '{definition.Name}' has an invalid FrameRateCurve. Falling back to DefaultFrameRate."
1473
+ );
1474
+ curve = AnimationCurve.Constant(0, 1, definition.DefaultFrameRate);
1475
+ }
1476
+
1477
+ if (curve.keys.Length == 0)
1478
+ {
1479
+ curve.AddKey(0, definition.DefaultFrameRate);
1480
+ }
1481
+
1482
+ float curveDuration = curve.keys.LastOrDefault().time;
1483
+ if (curveDuration <= 0)
1484
+ {
1485
+ curveDuration = 1f;
1486
+ }
1487
+
1488
+ for (int i = 0; i < definition.SpritesToAnimate.Count; ++i)
1489
+ {
1490
+ keyframes[i] = new ObjectReferenceKeyframe
1491
+ {
1492
+ time = currentTime,
1493
+ value = definition.SpritesToAnimate[i],
1494
+ };
1495
+
1496
+ if (i < definition.SpritesToAnimate.Count - 1)
1497
+ {
1498
+ float normalizedTimeForCurve =
1499
+ definition.SpritesToAnimate.Count > 1
1500
+ ? (float)i / (definition.SpritesToAnimate.Count - 1)
1501
+ : 0;
1502
+ float timeForCurveEval = normalizedTimeForCurve * curveDuration;
1503
+
1504
+ float fps = curve.Evaluate(timeForCurveEval);
1505
+ if (fps <= 0)
1506
+ {
1507
+ fps = definition.DefaultFrameRate;
1508
+ }
1509
+
1510
+ if (fps <= 0)
1511
+ {
1512
+ fps = 1;
1513
+ }
1514
+
1515
+ currentTime += 1.0f / fps;
1516
+ }
1517
+ }
1518
+
1519
+ AnimationUtility.SetObjectReferenceCurve(clip, spriteBinding, keyframes);
1520
+
1521
+ AnimationClipSettings settings = AnimationUtility.GetAnimationClipSettings(clip);
1522
+ settings.loopTime = definition.loop;
1523
+ settings.cycleOffset = definition.cycleOffset;
1524
+ AnimationUtility.SetAnimationClipSettings(clip, settings);
1525
+
1526
+ string animName = string.IsNullOrEmpty(definition.Name)
1527
+ ? "UnnamedAnim"
1528
+ : definition.Name;
1529
+
1530
+ animName = Path.GetInvalidFileNameChars()
1531
+ .Aggregate(animName, (current, character) => current.Replace(character, '_'));
1532
+ string assetPath = Path.Combine(animationsFolder, $"{animName}.anim");
1533
+ assetPath = AssetDatabase.GenerateUniqueAssetPath(assetPath);
1534
+
1535
+ AssetDatabase.CreateAsset(clip, assetPath);
1536
+ createdCount++;
1537
+ }
1538
+
1539
+ if (createdCount > 0)
1540
+ {
1541
+ AssetDatabase.SaveAssets();
1542
+ AssetDatabase.Refresh();
1543
+ Utils.EditorUi.Info(
1544
+ "Success",
1545
+ $"{createdCount} animation(s) created in:\n{animationsFolder}"
1546
+ );
1547
+ }
1548
+ else
1549
+ {
1550
+ Utils.EditorUi.Info("Finished", "No valid animations were generated.");
1551
+ }
1552
+ }
1553
+
1554
+ private static void OnRootDragUpdated(DragUpdatedEvent evt)
1555
+ {
1556
+ if (DragAndDrop.objectReferences.Any(obj => obj is Texture2D))
1557
+ {
1558
+ DragAndDrop.visualMode = DragAndDropVisualMode.Copy;
1559
+ }
1560
+ }
1561
+
1562
+ private void OnRootDragPerform(DragPerformEvent evt)
1563
+ {
1564
+ Texture2D draggedTexture =
1565
+ DragAndDrop.objectReferences.FirstOrDefault(obj => obj is Texture2D) as Texture2D;
1566
+ if (draggedTexture != null)
1567
+ {
1568
+ _spriteSheetField.value = draggedTexture;
1569
+ DragAndDrop.AcceptDrag();
1570
+ }
1571
+ }
1572
+
1573
+ public void OnBecameVisible()
1574
+ {
1575
+ rootVisualElement.RegisterCallback<DragUpdatedEvent>(OnRootDragUpdated);
1576
+ rootVisualElement.RegisterCallback<DragPerformEvent>(OnRootDragPerform);
1577
+ }
1578
+
1579
+ public void OnBecameInvisible()
1580
+ {
1581
+ rootVisualElement.UnregisterCallback<DragUpdatedEvent>(OnRootDragUpdated);
1582
+ rootVisualElement.UnregisterCallback<DragPerformEvent>(OnRootDragPerform);
1583
+ }
1584
+ }
1585
+ #endif
1586
+ }