@aqian0/dsh-unity 0.0.0-stage → 0.1.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 (360) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/LICENSE-UNITY-COMPANION.md +122 -0
  3. package/LICENSE.md +31 -0
  4. package/NOTICE.md +90 -0
  5. package/README.md +273 -2
  6. package/cordis.patch.yml +22 -0
  7. package/docs/design.md +297 -0
  8. package/icon.svg +16 -0
  9. package/lib/frontmatter.js +392 -0
  10. package/lib/gating.js +105 -0
  11. package/lib/harness.js +16 -0
  12. package/lib/index.js +171 -0
  13. package/lib/project.js +210 -0
  14. package/lib/registry.js +268 -0
  15. package/lib/requirements.js +214 -0
  16. package/lib/skills.js +191 -0
  17. package/lib/types/frontmatter.d.ts +84 -0
  18. package/lib/types/gating.d.ts +80 -0
  19. package/lib/types/harness.d.ts +152 -0
  20. package/lib/types/index.d.ts +75 -0
  21. package/lib/types/project.d.ts +93 -0
  22. package/lib/types/registry.d.ts +96 -0
  23. package/lib/types/requirements.d.ts +67 -0
  24. package/lib/types/skills.d.ts +54 -0
  25. package/lib/types/watch.d.ts +34 -0
  26. package/lib/watch.js +84 -0
  27. package/locale/en.json +6 -0
  28. package/locale/zh.json +6 -0
  29. package/package.json +70 -4
  30. package/skills/2d-pixel-perfect/SKILL.md +208 -0
  31. package/skills/2d-pixel-perfect/references/api-reference.md +81 -0
  32. package/skills/2d-pixel-perfect/references/camera-setup-builtin.cs +40 -0
  33. package/skills/2d-pixel-perfect/references/camera-setup-urp.cs +49 -0
  34. package/skills/2d-pixel-perfect/references/pipeline-detection.cs +50 -0
  35. package/skills/2d-pixel-perfect/references/sprite-settings.cs +37 -0
  36. package/skills/asset-transformer-toolkit/SECURITY.md +15 -0
  37. package/skills/asset-transformer-toolkit/SKILL.md +39 -0
  38. package/skills/asset-transformer-toolkit/references/create-importer.md +121 -0
  39. package/skills/asset-transformer-toolkit/references/lods.md +61 -0
  40. package/skills/asset-transformer-toolkit/references/rule-api.md +154 -0
  41. package/skills/asset-transformer-toolkit/references/ruleblock-api.md +37 -0
  42. package/skills/asset-transformer-toolkit/references/ruleset-api.md +138 -0
  43. package/skills/asset-transformer-toolkit/references/rulesets-and-actions.md +227 -0
  44. package/skills/audio-setup-mixers/SECURITY.md +16 -0
  45. package/skills/audio-setup-mixers/SKILL.md +127 -0
  46. package/skills/audio-setup-mixers/references/api.md +162 -0
  47. package/skills/build-gtk/SECURITY.md +16 -0
  48. package/skills/build-gtk/SKILL.md +200 -0
  49. package/skills/build-gtk/references/api-reference.md +33 -0
  50. package/skills/build-gtk/references/graph-api-gaps.md +96 -0
  51. package/skills/build-gtk/references/runtime-and-visualization.md +191 -0
  52. package/skills/build-gtk/references/state-machine-api.md +270 -0
  53. package/skills/build-gtk/references/where-the-docs-stop.md +49 -0
  54. package/skills/build-live-game/SKILL.md +159 -0
  55. package/skills/build-live-game/references/achievements.md +757 -0
  56. package/skills/build-live-game/references/apis.md +271 -0
  57. package/skills/build-live-game/references/authentication.md +431 -0
  58. package/skills/build-live-game/references/battlepass.md +904 -0
  59. package/skills/build-live-game/references/blueprints-and-samples.md +75 -0
  60. package/skills/build-live-game/references/cloud-code-cloudbehaviours.md +1111 -0
  61. package/skills/build-live-game/references/cloud-code-modules.md +1276 -0
  62. package/skills/build-live-game/references/cloud-code.md +58 -0
  63. package/skills/build-live-game/references/cloud-save.md +464 -0
  64. package/skills/build-live-game/references/deployment.md +231 -0
  65. package/skills/build-live-game/references/orientation.md +30 -0
  66. package/skills/build-live-game/references/player-account.md +821 -0
  67. package/skills/build-live-game/references/remote-config.md +96 -0
  68. package/skills/build-live-game/references/services-overview.md +76 -0
  69. package/skills/build-live-game/references/tooling.md +375 -0
  70. package/skills/build-live-game/references/ugs-cli.md +86 -0
  71. package/skills/craft-game-floors/SECURITY.md +23 -0
  72. package/skills/craft-game-floors/SKILL.md +134 -0
  73. package/skills/craft-game-floors/references/art-direction.md +85 -0
  74. package/skills/craft-game-floors/references/camera-rigs.md +51 -0
  75. package/skills/craft-game-floors/references/character-motion.md +35 -0
  76. package/skills/craft-game-floors/references/game-audio.md +47 -0
  77. package/skills/craft-game-floors/references/game-feel.md +68 -0
  78. package/skills/craft-game-floors/references/game-shell.md +45 -0
  79. package/skills/craft-game-floors/references/live-floor.md +35 -0
  80. package/skills/craft-game-floors/references/placeholder-assets.md +35 -0
  81. package/skills/craft-game-floors/references/scene-lighting.md +52 -0
  82. package/skills/craft-game-floors/references/toon-shading.md +34 -0
  83. package/skills/craft-game-floors/references/vfx.md +40 -0
  84. package/skills/craft-game-floors/references/visual-scorecard.md +43 -0
  85. package/skills/create-2d-physics/SECURITY.md +16 -0
  86. package/skills/create-2d-physics/SKILL.md +128 -0
  87. package/skills/create-2d-physics/references/2d-physics-core.md +155 -0
  88. package/skills/create-2d-physics/references/legacy-2d-physics.md +45 -0
  89. package/skills/create-tile-palette-or-rule-tiles/SKILL.md +95 -0
  90. package/skills/create-tile-palette-or-rule-tiles/references/hexagonalruletile.md +71 -0
  91. package/skills/create-tile-palette-or-rule-tiles/references/palette-create.md +38 -0
  92. package/skills/create-tile-palette-or-rule-tiles/references/ruletile-createempty.md +37 -0
  93. package/skills/create-tile-palette-or-rule-tiles/references/ruletile-createfromsegment.md +219 -0
  94. package/skills/create-tile-palette-or-rule-tiles/references/ruletile.md +95 -0
  95. package/skills/create-tile-palette-or-rule-tiles/scripts/CreatePaletteTemplate.cs +148 -0
  96. package/skills/create-tile-palette-or-rule-tiles/scripts/ManualWorkflowExample.cs +63 -0
  97. package/skills/create-tile-palette-or-rule-tiles/scripts/RuleTileGenerator.cs +61 -0
  98. package/skills/create-tile-palette-or-rule-tiles/scripts/TilemapRuleTileCreateFromSegment.cs +225 -0
  99. package/skills/fix-3d-physics-collisions/SECURITY.md +17 -0
  100. package/skills/fix-3d-physics-collisions/SKILL.md +139 -0
  101. package/skills/fix-3d-physics-collisions/references/collision-checklist.md +80 -0
  102. package/skills/fix-3d-physics-collisions/references/collision-debugger.md +18 -0
  103. package/skills/fix-3d-physics-collisions/references/console-errors-table.md +9 -0
  104. package/skills/fix-3d-physics-collisions/references/kinematic-trigger-facts.md +18 -0
  105. package/skills/fix-3d-physics-collisions/references/other-symptoms.md +29 -0
  106. package/skills/fix-3d-physics-collisions/references/raycast-checklist.md +8 -0
  107. package/skills/fix-3d-physics-collisions/references/topic-map.md +42 -0
  108. package/skills/fix-3d-physics-collisions/references/trigger-checklist.md +9 -0
  109. package/skills/fix-3d-physics-collisions/scripts/CollisionDebugger.cs +561 -0
  110. package/skills/generate-editor-search-query/SECURITY.md +17 -0
  111. package/skills/generate-editor-search-query/SKILL.md +117 -0
  112. package/skills/generate-editor-search-query/references/open-search-window.md +70 -0
  113. package/skills/generate-editor-search-query/references/query-patterns.md +124 -0
  114. package/skills/implement-in-app-purchases/SKILL.md +82 -0
  115. package/skills/implement-in-app-purchases/references/api-details.md +41 -0
  116. package/skills/implement-in-app-purchases/references/api-notes.md +105 -0
  117. package/skills/implement-in-app-purchases/references/codeless-catalog.md +197 -0
  118. package/skills/implement-in-app-purchases/references/convert-adapty.md +270 -0
  119. package/skills/implement-in-app-purchases/references/convert-essentialkit.md +239 -0
  120. package/skills/implement-in-app-purchases/references/convert-revenuecat.md +277 -0
  121. package/skills/implement-in-app-purchases/references/convert-unipay.md +145 -0
  122. package/skills/implement-in-app-purchases/references/migration-v4-to-v5.md +46 -0
  123. package/skills/implement-in-app-purchases/references/path-add-iap-to-new-project.md +197 -0
  124. package/skills/implement-in-app-purchases/references/path-convert-native-google-billing.md +302 -0
  125. package/skills/implement-in-app-purchases/references/path-convert-native-storekit.md +357 -0
  126. package/skills/implement-in-app-purchases/references/path-implement-iap-d2c.md +253 -0
  127. package/skills/implement-in-app-purchases/references/platform-notes.md +55 -0
  128. package/skills/implement-in-app-purchases/references/pre-check.md +207 -0
  129. package/skills/implement-in-app-purchases/references/topic-map.md +46 -0
  130. package/skills/initialize-ai-navigation/SKILL.md +109 -0
  131. package/skills/initialize-ai-navigation/references/navigation-system.md +793 -0
  132. package/skills/initialize-ai-navigation/references/topic-map.md +66 -0
  133. package/skills/levelplay-unity-integration/SKILL.md +122 -0
  134. package/skills/levelplay-unity-integration/references/adding-more-ad-formats.md +15 -0
  135. package/skills/levelplay-unity-integration/references/banner-api.md +927 -0
  136. package/skills/levelplay-unity-integration/references/best-practices.md +604 -0
  137. package/skills/levelplay-unity-integration/references/dependency-resolution.md +94 -0
  138. package/skills/levelplay-unity-integration/references/examples.md +10 -0
  139. package/skills/levelplay-unity-integration/references/ilrd-api.md +337 -0
  140. package/skills/levelplay-unity-integration/references/initialization-api.md +851 -0
  141. package/skills/levelplay-unity-integration/references/interstitial-api.md +907 -0
  142. package/skills/levelplay-unity-integration/references/ios-setup.md +463 -0
  143. package/skills/levelplay-unity-integration/references/migration-sdk-9.md +666 -0
  144. package/skills/levelplay-unity-integration/references/privacy-settings.md +593 -0
  145. package/skills/levelplay-unity-integration/references/production-release-checklist.md +22 -0
  146. package/skills/levelplay-unity-integration/references/rewarded-api.md +918 -0
  147. package/skills/levelplay-unity-integration/references/step-0-new-or-migration.md +8 -0
  148. package/skills/levelplay-unity-integration/references/step-1-verify-environment.md +4 -0
  149. package/skills/levelplay-unity-integration/references/step-10-testing.md +15 -0
  150. package/skills/levelplay-unity-integration/references/step-2-business-goals.md +12 -0
  151. package/skills/levelplay-unity-integration/references/step-3-install-sdk.md +55 -0
  152. package/skills/levelplay-unity-integration/references/step-4-native-dependencies.md +22 -0
  153. package/skills/levelplay-unity-integration/references/step-5-app-key-and-ad-units.md +18 -0
  154. package/skills/levelplay-unity-integration/references/step-6-5-privacy-and-regulation.md +51 -0
  155. package/skills/levelplay-unity-integration/references/step-6-admob-keys.md +16 -0
  156. package/skills/levelplay-unity-integration/references/step-7-initialize.md +50 -0
  157. package/skills/levelplay-unity-integration/references/step-8-ad-unit-strategy.md +16 -0
  158. package/skills/levelplay-unity-integration/references/step-9-implement-ad-units.md +66 -0
  159. package/skills/levelplay-unity-integration/references/testing-and-validation.md +222 -0
  160. package/skills/levelplay-unity-integration/references/troubleshooting.md +99 -0
  161. package/skills/localize-unity-project/SKILL.md +159 -0
  162. package/skills/localize-unity-project/references/api-notes.md +15 -0
  163. package/skills/localize-unity-project/references/cjk-fonts.md +83 -0
  164. package/skills/localize-unity-project/references/docs-map.md +42 -0
  165. package/skills/localize-unity-project/references/documentation-lookup.md +33 -0
  166. package/skills/localize-unity-project/references/locale-switching.md +17 -0
  167. package/skills/localize-unity-project/references/table-completeness-check.md +47 -0
  168. package/skills/localize-unity-project/references/translating-existing-project.md +47 -0
  169. package/skills/localize-unity-project/references/translation-strategy.md +41 -0
  170. package/skills/localize-unity-project/references/troubleshooting.md +12 -0
  171. package/skills/localize-unity-project/scripts/L10nBatchProcessor.cs +191 -0
  172. package/skills/localize-unity-project/scripts/LocalizedFontAsset.cs +18 -0
  173. package/skills/manage-sprite-atlas/SKILL.md +202 -0
  174. package/skills/manage-sprite-atlas/references/addressables-delivery.md +58 -0
  175. package/skills/manage-sprite-atlas/references/advanced-manual-authoring.md +19 -0
  176. package/skills/manage-sprite-atlas/references/api.md +382 -0
  177. package/skills/manage-sprite-atlas/references/best-practices.md +183 -0
  178. package/skills/manage-sprite-atlas/references/common-errors.md +123 -0
  179. package/skills/manage-sprite-atlas/references/complete-workflow.md +61 -0
  180. package/skills/manage-sprite-atlas/references/custom-packing.md +147 -0
  181. package/skills/manage-sprite-atlas/references/delivery-mechanism.md +30 -0
  182. package/skills/manage-sprite-atlas/references/key-requirements.md +21 -0
  183. package/skills/manage-sprite-atlas/references/manual-authoring.md +39 -0
  184. package/skills/manage-sprite-atlas/references/namespaces.md +15 -0
  185. package/skills/manage-sprite-atlas/references/v2-architecture.md +21 -0
  186. package/skills/manage-sprite-atlas/resources/authoringvsruntime.cs +176 -0
  187. package/skills/manage-sprite-atlas/resources/buildaddressablespostprocess.cs +59 -0
  188. package/skills/manage-sprite-atlas/resources/cacheloadedatlases.cs +145 -0
  189. package/skills/manage-sprite-atlas/resources/cleanupbatchoperations.cs +119 -0
  190. package/skills/manage-sprite-atlas/resources/createandconfiguremasteratlas.cs +57 -0
  191. package/skills/manage-sprite-atlas/resources/custompackersetup.cs +88 -0
  192. package/skills/manage-sprite-atlas/resources/deprecatedmethods.cs +142 -0
  193. package/skills/manage-sprite-atlas/resources/dontmodifywithoutsaving.cs +120 -0
  194. package/skills/manage-sprite-atlas/resources/dontpackinruntimebuilds.cs +190 -0
  195. package/skills/manage-sprite-atlas/resources/dontscriptspriteatlasineditor.cs +114 -0
  196. package/skills/manage-sprite-atlas/resources/editorconfiguration.cs +95 -0
  197. package/skills/manage-sprite-atlas/resources/enablespritepacking.cs +172 -0
  198. package/skills/manage-sprite-atlas/resources/gridspritepacker.cs +50 -0
  199. package/skills/manage-sprite-atlas/resources/handlelatebinding.cs +147 -0
  200. package/skills/manage-sprite-atlas/resources/handlenullcases.cs +141 -0
  201. package/skills/manage-sprite-atlas/resources/migratev1tov2.cs +335 -0
  202. package/skills/manage-sprite-atlas/resources/multipagepacker.cs +80 -0
  203. package/skills/manage-sprite-atlas/resources/optimizetexturesettings.cs +191 -0
  204. package/skills/manage-sprite-atlas/resources/packerdebugging.cs +158 -0
  205. package/skills/manage-sprite-atlas/resources/packtransform.cs +51 -0
  206. package/skills/manage-sprite-atlas/resources/platformnames.cs +127 -0
  207. package/skills/manage-sprite-atlas/resources/queryspritesefficiently.cs +222 -0
  208. package/skills/manage-sprite-atlas/resources/registercallbacks.cs +152 -0
  209. package/skills/manage-sprite-atlas/resources/runtimeatlasloader.cs +15 -0
  210. package/skills/manage-sprite-atlas/resources/runtimespriteaccess.cs +19 -0
  211. package/skills/manage-sprite-atlas/resources/savespriteatlasasset.cs +107 -0
  212. package/skills/manage-sprite-atlas/resources/scriptablepacker.cs +81 -0
  213. package/skills/manage-sprite-atlas/resources/setincludeinbuild.cs +164 -0
  214. package/skills/manage-sprite-atlas/resources/sizeoptimizedpacker.cs +88 -0
  215. package/skills/manage-sprite-atlas/resources/spriteatlaslatebinding.cs +123 -0
  216. package/skills/manage-sprite-atlas/resources/spriteatlasprebuildgenerator.cs +219 -0
  217. package/skills/manage-sprite-atlas/resources/spritedata.cs +35 -0
  218. package/skills/manage-sprite-atlas/resources/spritepack.cs +39 -0
  219. package/skills/manage-sprite-atlas/resources/texturedata.cs +15 -0
  220. package/skills/manage-sprite-atlas/resources/updatebuildscripts.cs +357 -0
  221. package/skills/manage-sprite-atlas/resources/updatesettingsconfiguration.cs +135 -0
  222. package/skills/manage-sprite-atlas/resources/usevariantswisely.cs +179 -0
  223. package/skills/manage-sprite-atlas/resources/variantatlas.cs +39 -0
  224. package/skills/migrate-birp-to-urp/SECURITY.md +16 -0
  225. package/skills/migrate-birp-to-urp/SKILL.md +167 -0
  226. package/skills/migrate-birp-to-urp/references/capturing-the-editor.md +66 -0
  227. package/skills/migrate-birp-to-urp/references/complex-shader-situations.md +272 -0
  228. package/skills/migrate-birp-to-urp/references/conversion-and-rendering-triage.md +113 -0
  229. package/skills/migrate-birp-to-urp/references/custom-shader-triage.md +123 -0
  230. package/skills/migrate-birp-to-urp/references/implementation-patterns.md +529 -0
  231. package/skills/migrate-birp-to-urp/references/migration-workflow.md +265 -0
  232. package/skills/migrate-birp-to-urp/references/parity-validation-and-troubleshooting.md +114 -0
  233. package/skills/migrate-birp-to-urp/references/preflight-and-urp-setup.md +195 -0
  234. package/skills/migrate-birp-to-urp/references/quality-settings-map.md +69 -0
  235. package/skills/new-unity-project/SECURITY.md +26 -0
  236. package/skills/new-unity-project/SKILL.md +171 -0
  237. package/skills/new-unity-project/references/checklist.md +18 -0
  238. package/skills/new-unity-project/references/common-mistakes.md +15 -0
  239. package/skills/new-unity-project/references/skill-setup.md +66 -0
  240. package/skills/new-unity-project/references/step-1-concept.md +13 -0
  241. package/skills/new-unity-project/references/step-2-platforms-and-create.md +31 -0
  242. package/skills/new-unity-project/references/step-3-join-and-reconcile.md +16 -0
  243. package/skills/new-unity-project/references/step-4-source-control.md +9 -0
  244. package/skills/new-unity-project/references/step-5-packages.md +18 -0
  245. package/skills/new-unity-project/references/step-6-identity-and-floors.md +20 -0
  246. package/skills/new-unity-project/references/step-7-visual-baseline.md +75 -0
  247. package/skills/new-unity-project/references/step-8-first-commit.md +21 -0
  248. package/skills/new-unity-project/references/step-9-handoff.md +23 -0
  249. package/skills/optimize-audio/SECURITY.md +16 -0
  250. package/skills/optimize-audio/SKILL.md +120 -0
  251. package/skills/optimize-audio/references/diagnostics.md +42 -0
  252. package/skills/optimize-audio/references/troubleshooting.md +41 -0
  253. package/skills/optimize-audio/resources/audio-import-api.md +149 -0
  254. package/skills/optimize-audio/resources/platform-settings.md +48 -0
  255. package/skills/optimize-text-mesh-pro/SKILL.md +181 -0
  256. package/skills/optimize-text-mesh-pro/references/dynamic-atlas-and-profiling.md +28 -0
  257. package/skills/optimize-text-mesh-pro/references/topic-map.md +36 -0
  258. package/skills/optimize-web/SECURITY.md +16 -0
  259. package/skills/optimize-web/SKILL.md +157 -0
  260. package/skills/optimize-web/references/editor-csharp.md +120 -0
  261. package/skills/optimize-web/references/topic-map.md +49 -0
  262. package/skills/optimize-web/references/troubleshooting.md +45 -0
  263. package/skills/optimize-web/references/understand-request.md +19 -0
  264. package/skills/optimize-web/references/web-assets-quality.md +59 -0
  265. package/skills/optimize-web/references/web-player-settings.md +39 -0
  266. package/skills/optimize-web/references/web-profiling-memory.md +71 -0
  267. package/skills/optimize-web/scripts/WebOptimizer.cs +46 -0
  268. package/skills/optimize-web/scripts/toktx-examples.sh +11 -0
  269. package/skills/setup-multiplayer-services/SKILL.md +36 -0
  270. package/skills/setup-multiplayer-services/references/dgs-entrypoint.md +79 -0
  271. package/skills/setup-multiplayer-services/references/entrypoints.md +213 -0
  272. package/skills/setup-multiplayer-services/references/examples.md +33 -0
  273. package/skills/setup-multiplayer-services/references/implementation-fit.md +30 -0
  274. package/skills/setup-multiplayer-services/references/underlying-services.md +11 -0
  275. package/skills/setup-multiplayer-services/references/workflows-prerequisites.md +17 -0
  276. package/skills/setup-vivox-voice-chat/SECURITY.md +16 -0
  277. package/skills/setup-vivox-voice-chat/SKILL.md +166 -0
  278. package/skills/setup-vivox-voice-chat/references/api-reference-lookup.md +28 -0
  279. package/skills/setup-vivox-voice-chat/references/docs-topic-map.md +13 -0
  280. package/skills/setup-vivox-voice-chat/references/events-and-participants.md +79 -0
  281. package/skills/setup-vivox-voice-chat/references/init-and-login.md +92 -0
  282. package/skills/setup-vivox-voice-chat/references/text-chat.md +93 -0
  283. package/skills/setup-vivox-voice-chat/references/troubleshooting.md +47 -0
  284. package/skills/setup-vivox-voice-chat/references/voice-channels.md +92 -0
  285. package/skills/shader-graph-create-custom-node/SKILL.md +25 -0
  286. package/skills/shader-graph-create-custom-node/resources/all_hints.hlsl +182 -0
  287. package/skills/sprite-editor/SECURITY.md +16 -0
  288. package/skills/sprite-editor/SKILL.md +66 -0
  289. package/skills/sprite-editor/references/api_reference.md +151 -0
  290. package/skills/sprite-editor/references/background.md +112 -0
  291. package/skills/sprite-editor/references/templates.md +72 -0
  292. package/skills/sprite-editor/scripts/AutomaticSliceTexture.cs +40 -0
  293. package/skills/sprite-editor/scripts/GenerateNewSpriteRects.cs +200 -0
  294. package/skills/sprite-editor/scripts/GetTextureSourceImageSize.cs +32 -0
  295. package/skills/sprite-editor/scripts/GetTextureToSlice.cs +55 -0
  296. package/skills/sprite-editor/scripts/GridSliceTexture.cs +40 -0
  297. package/skills/sprite-editor/scripts/IsometricSliceTexture.cs +141 -0
  298. package/skills/sprite-editor/scripts/README.md +134 -0
  299. package/skills/sprite-editor/scripts/SetPivotExample.cs +58 -0
  300. package/skills/sprite-editor/scripts/SpriteToPng.cs +88 -0
  301. package/skills/sprite-segment-3x3grid/SKILL.md +177 -0
  302. package/skills/sprite-segment-3x3grid/references/topic-map.md +37 -0
  303. package/skills/sprite-segment-3x3grid/scripts/SpriteGridAnalysis.cs +119 -0
  304. package/skills/ui/SKILL.md +142 -0
  305. package/skills/ui-imgui/SKILL.md +180 -0
  306. package/skills/ui-imgui/references/gui-elements.md +156 -0
  307. package/skills/ui-imgui/references/templates.md +141 -0
  308. package/skills/ui-ugui/SKILL.md +217 -0
  309. package/skills/ui-ugui/references/layout-and-anchors.md +61 -0
  310. package/skills/ui-ugui/references/scrollview-setup.md +29 -0
  311. package/skills/ui-uitk/SKILL.md +229 -0
  312. package/skills/ui-uitk/references/common-issues.md +74 -0
  313. package/skills/ui-uitk/references/custom-elements.md +241 -0
  314. package/skills/ui-uitk/references/painter2d.md +282 -0
  315. package/skills/ui-uitk/references/pointermanipulator-guide.md +94 -0
  316. package/skills/ui-uitk/references/svg-icons.md +136 -0
  317. package/skills/ui-uitk/references/ui-runtime-binding.md +234 -0
  318. package/skills/ui-uitk/references/uss-guide.md +138 -0
  319. package/skills/unity-cli/CHANGELOG.md +524 -0
  320. package/skills/unity-cli/SECURITY.md +68 -0
  321. package/skills/unity-cli/SKILL.md +160 -0
  322. package/skills/unity-cli/references/auth-license-cloud.md +318 -0
  323. package/skills/unity-cli/references/bootstrap-project.md +177 -0
  324. package/skills/unity-cli/references/build-run-test.md +555 -0
  325. package/skills/unity-cli/references/catalog-plugins.md +86 -0
  326. package/skills/unity-cli/references/ci-recipes.md +76 -0
  327. package/skills/unity-cli/references/cloud-automation.md +819 -0
  328. package/skills/unity-cli/references/cloud-workflows.md +19 -0
  329. package/skills/unity-cli/references/collaboration.md +533 -0
  330. package/skills/unity-cli/references/config-hub.md +239 -0
  331. package/skills/unity-cli/references/diagnostics-maintenance.md +718 -0
  332. package/skills/unity-cli/references/docs-workflow.md +179 -0
  333. package/skills/unity-cli/references/editor-targeting.md +29 -0
  334. package/skills/unity-cli/references/editors-install.md +490 -0
  335. package/skills/unity-cli/references/environment-variables.md +42 -0
  336. package/skills/unity-cli/references/exit-codes.md +47 -0
  337. package/skills/unity-cli/references/global-flags.md +32 -0
  338. package/skills/unity-cli/references/integration-advanced.md +1130 -0
  339. package/skills/unity-cli/references/notes.md +20 -0
  340. package/skills/unity-cli/references/notifications.md +39 -0
  341. package/skills/unity-cli/references/playmode-verification-loop.md +279 -0
  342. package/skills/unity-cli/references/projects-templates.md +997 -0
  343. package/skills/unity-cli/references/scene-editing-preflight.md +25 -0
  344. package/skills/unity-cli/references/setup-and-help.md +54 -0
  345. package/skills/unity-cli/references/version-control.md +612 -0
  346. package/skills/unity-package-management/SKILL.md +169 -0
  347. package/skills/unity-package-management/references/discovering-packages.md +66 -0
  348. package/skills/unity-package-management/references/headless-run.md +31 -0
  349. package/skills/unity-package-management/references/installer-script.md +92 -0
  350. package/skills/unity-package-management/references/select-packages.md +126 -0
  351. package/skills/unity-pipeline/SECURITY.md +17 -0
  352. package/skills/unity-pipeline/SKILL.md +205 -0
  353. package/skills/unity-pipeline/references/csharp-eval.md +23 -0
  354. package/skills/unity-pipeline/references/multiplayer-play-mode.md +103 -0
  355. package/skills/urp-postprocessing/SECURITY.md +16 -0
  356. package/skills/urp-postprocessing/SKILL.md +188 -0
  357. package/skills/urp-postprocessing/references/code-templates.md +150 -0
  358. package/skills/urp-postprocessing/references/effect-reference.md +86 -0
  359. package/skills/validate-urp-render-graph-renderer-feature/SKILL.md +92 -0
  360. package/skills/validate-urp-render-graph-renderer-feature/references/validation-checklist.md +179 -0
@@ -0,0 +1,200 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using UnityEditor;
4
+ using UnityEditor.U2D.Sprites;
5
+ using UnityEngine;
6
+
7
+ namespace Editor
8
+ {
9
+ static public partial class SpriteEditorUtility
10
+ {
11
+ public enum AddNewSpriteMethod
12
+ {
13
+ DeleteAll, // Remove all existing sprites and create new ones
14
+ Smart, // Update overlapping sprites, add non-overlapping ones
15
+ Safe // Only add sprites that don't overlap with existing ones
16
+ }
17
+
18
+ /// <summary>
19
+ /// Generates new sprite rectangles from a collection of rects, handling existing sprites based on the specified method.
20
+ /// Automatically assigns unique names using the provided name generator function.
21
+ /// </summary>
22
+ /// <param name="spriteDataProvider">The sprite data provider containing existing sprites.</param>
23
+ /// <param name="rects">Collection of rectangles to create sprites from.</param>
24
+ /// <param name="addNewSpriteMethod">Strategy for handling existing sprites.</param>
25
+ /// <param name="nameGenerator">Function that takes an index and returns a sprite name.</param>
26
+ /// <param name="kOverlapTolerance">Minimum overlap area ratio to consider sprites overlapping.</param>
27
+ /// <param name="kBestFitTolerance">Maximum overlap ratio difference for best-fit matching.</param>
28
+ /// <param name="bestFit">If true, finds the best matching existing sprite; if false, uses first match.</param>
29
+ /// <returns>List of sprite rectangles ready to be set on the data provider.</returns>
30
+ public static List<SpriteRect> GenerateNewSpriteRects(ISpriteEditorDataProvider spriteDataProvider, IEnumerable<Rect> rects, AddNewSpriteMethod addNewSpriteMethod, Func<int, string> nameGenerator,
31
+ float kOverlapTolerance= 0.00001f, float kBestFitTolerance = 0.5f, bool bestFit = false)
32
+ {
33
+ const int k_NameFindBreakLimit = 1000000;
34
+ var existingSpriteRects = spriteDataProvider.GetSpriteRects();
35
+ List<SpriteRect> newRects = new List<SpriteRect>();
36
+ HashSet<string> existingNames = new HashSet<string>();
37
+
38
+ Func<Rect, SpriteRect> newRectLambda = (frame) =>
39
+ {
40
+ int nameIndex = existingNames.Count;
41
+ var spriteName = "";
42
+ while (nameIndex < k_NameFindBreakLimit)
43
+ {
44
+ spriteName = nameGenerator(nameIndex++);
45
+ if (!existingNames.Contains(spriteName))
46
+ break;
47
+ }
48
+
49
+ if(nameIndex >= k_NameFindBreakLimit)
50
+ {
51
+ Debug.LogError("Failed to generate unique sprite name for automatic slicing. Please check the name generator function.");
52
+ return null;
53
+ }
54
+
55
+ existingNames.Add(spriteName);
56
+ return new SpriteRect()
57
+ {
58
+ name = spriteName,
59
+ alignment = SpriteAlignment.Center,
60
+ rect = frame,
61
+ };
62
+ };
63
+
64
+ Action<Rect> deleteAllSliceMethodLambda = (frame) =>
65
+ {
66
+ var newRect = newRectLambda(frame);
67
+ if (newRect != null)
68
+ {
69
+ newRects.Add(newRect);
70
+ }
71
+ };
72
+
73
+ Action<Rect> smartSliceMethodLambda = (frame) =>
74
+ {
75
+ var outSprite = GetExistingOverlappingSprite(spriteDataProvider, frame, kOverlapTolerance, kBestFitTolerance, bestFit);
76
+ if (outSprite != -1)
77
+ {
78
+ var existingRect = existingSpriteRects[outSprite];
79
+ existingRect.rect = frame;
80
+ if (existingNames.Contains(existingRect.name))
81
+ {
82
+ // Handle name conflict by renaming the previous sprite
83
+ var conflictRect = newRects.FindIndex(x => x.name == existingRect.name);
84
+ if (conflictRect != -1)
85
+ {
86
+ int nameIndex = existingNames.Count;
87
+ var spriteName = "";
88
+ while (nameIndex < k_NameFindBreakLimit)
89
+ {
90
+ spriteName = nameGenerator(nameIndex++);
91
+ if (!existingNames.Contains(spriteName))
92
+ break;
93
+ }
94
+ if(nameIndex >= k_NameFindBreakLimit)
95
+ {
96
+ Debug.LogError("Failed to generate unique sprite name for automatic slicing. Removing conflicting sprite.");
97
+ newRects.RemoveAt(conflictRect);
98
+ }
99
+ else
100
+ newRects[conflictRect].name = spriteName;
101
+ }
102
+ }
103
+ else
104
+ existingNames.Add(existingRect.name);
105
+ newRects.Add(existingRect);
106
+ }
107
+ else
108
+ {
109
+ var newRect = newRectLambda(frame);
110
+ if (newRect != null)
111
+ {
112
+ newRects.Add(newRect);
113
+ }
114
+ }
115
+ };
116
+
117
+ Action<Rect> safeSliceMethodLambda = (frame) =>
118
+ {
119
+ var outSprite = GetExistingOverlappingSprite(spriteDataProvider, frame, kOverlapTolerance, kBestFitTolerance, bestFit);
120
+ if (outSprite == -1)
121
+ {
122
+ var newRect = newRectLambda(frame);
123
+ if (newRect != null)
124
+ {
125
+ newRects.Add(newRect);
126
+ }
127
+ }
128
+ };
129
+
130
+ Action<Rect> sliceMethodLambda = safeSliceMethodLambda;
131
+ switch (addNewSpriteMethod)
132
+ {
133
+ case AddNewSpriteMethod.DeleteAll:
134
+ sliceMethodLambda = deleteAllSliceMethodLambda;
135
+ break;
136
+ case AddNewSpriteMethod.Smart:
137
+ sliceMethodLambda = smartSliceMethodLambda;
138
+ break;
139
+ case AddNewSpriteMethod.Safe:
140
+ // Preserve all existing sprites
141
+ foreach(var existingRect in existingSpriteRects)
142
+ {
143
+ existingNames.Add(existingRect.name);
144
+ }
145
+ newRects.AddRange(existingSpriteRects);
146
+ break;
147
+ }
148
+
149
+ foreach (var frame in rects)
150
+ {
151
+ sliceMethodLambda(frame);
152
+ }
153
+
154
+ return newRects;
155
+ }
156
+
157
+ private static int GetExistingOverlappingSprite(ISpriteEditorDataProvider dataProvider, Rect rect, float kOverlapTolerance= 0.00001f, float kBestFitTolerance = 0.5f, bool bestFit = false)
158
+ {
159
+ var spriteRects = dataProvider.GetSpriteRects();
160
+ var count = spriteRects.Length;
161
+ var bestRect = -1;
162
+ var rectArea = rect.width * rect.height;
163
+ if (rectArea < kOverlapTolerance)
164
+ return bestRect;
165
+
166
+ var bestRatio = float.MaxValue;
167
+ var bestArea = float.MaxValue;
168
+ for (int i = 0; i < count; i++)
169
+ {
170
+ Rect existingRect = spriteRects[i].rect;
171
+ if (existingRect.Overlaps(rect))
172
+ {
173
+ if (bestFit)
174
+ {
175
+ var dx = Math.Min(rect.xMax, existingRect.xMax) - Math.Max(rect.xMin, existingRect.xMin);
176
+ var dy = Math.Min(rect.yMax, existingRect.yMax) - Math.Max(rect.yMin, existingRect.yMin);
177
+ var overlapArea = dx * dy;
178
+ var overlapRatio = Math.Abs((overlapArea / rectArea) - 1.0f);
179
+ var existingArea = existingRect.width * existingRect.height;
180
+ if (overlapRatio < bestRatio || (overlapRatio < kOverlapTolerance && existingArea < bestArea))
181
+ {
182
+ bestRatio = overlapRatio;
183
+ if (overlapRatio < kOverlapTolerance)
184
+ bestArea = existingArea;
185
+ bestRect = i;
186
+ }
187
+ }
188
+ else
189
+ {
190
+ bestRect = i;
191
+ break;
192
+ }
193
+ }
194
+ }
195
+ if (bestFit && bestRatio > kBestFitTolerance)
196
+ return -1;
197
+ return bestRect;
198
+ }
199
+ }
200
+ }
@@ -0,0 +1,32 @@
1
+ using UnityEditor;
2
+ using UnityEditor.U2D.Sprites;
3
+ using UnityEngine;
4
+
5
+ namespace Editor
6
+ {
7
+ static public partial class SpriteEditorUtility
8
+ {
9
+ /// <summary>
10
+ /// Get the original source image size of a texture, which is different from the texture size when the texture is imported with "Max Size" smaller than the original image size.
11
+ /// This method will try to get the original source image size from TextureImporter, if it fails, it will return the texture size as fallback.
12
+ /// </summary>
13
+ /// <param name="texture"></param>
14
+ /// <param name="width"></param>
15
+ /// <param name="height"></param>
16
+ static public void GetTextureSourceImageSize(Texture2D texture, out int width, out int height)
17
+ {
18
+ SpriteDataProviderFactories factories = new SpriteDataProviderFactories();
19
+ factories.Init();
20
+ var dataProvider = factories.GetSpriteEditorDataProviderFromObject(texture);
21
+ var textureDataProvider = dataProvider?.GetDataProvider<ITextureDataProvider>();
22
+ if(textureDataProvider != null)
23
+ {
24
+ textureDataProvider.GetTextureActualWidthAndHeight(out width, out height);
25
+ return;
26
+ }
27
+
28
+ width = texture.width;
29
+ height = texture.height;
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,55 @@
1
+ using UnityEditor;
2
+ using UnityEditor.U2D.Sprites;
3
+ using UnityEngine;
4
+ using UnityEngine.Experimental.Rendering;
5
+
6
+ namespace Editor
7
+ {
8
+ static public partial class SpriteEditorUtility
9
+ {
10
+ /// <summary>
11
+ /// Gets a readable texture for slicing operations, upscaling if necessary to match original dimensions.
12
+ /// This ensures slicing is performed on the original image size, not the imported texture size.
13
+ /// </summary>
14
+ /// <param name="textureDataProvider">The texture data provider.</param>
15
+ /// <returns>A readable Texture2D at original dimensions, or null if texture is not readable.</returns>
16
+ static public Texture2D GetTextureToSlice(ITextureDataProvider textureDataProvider)
17
+ {
18
+ textureDataProvider.GetTextureActualWidthAndHeight(out var width, out var height);
19
+ var readableTexture = textureDataProvider.GetReadableTexture2D();
20
+ if (readableTexture == null || (readableTexture.width == width && readableTexture.height == height))
21
+ return readableTexture;
22
+
23
+ // Upscale the imported texture to match original dimensions for accurate slicing
24
+ var texture = CreateTemporaryDuplicate(readableTexture, width, height);
25
+ texture.hideFlags = HideFlags.HideAndDontSave;
26
+
27
+ return texture;
28
+ }
29
+
30
+ /// <summary>
31
+ /// Creates a temporary duplicate of a texture at a specified size using RenderTexture.
32
+ /// Used internally to upscale textures for slicing operations.
33
+ /// </summary>
34
+ public static Texture2D CreateTemporaryDuplicate(Texture2D original, int width, int height)
35
+ {
36
+ if (!ShaderUtil.hardwareSupportsRectRenderTexture || !(bool) (Object) original)
37
+ return null;
38
+
39
+ RenderTexture active = RenderTexture.active;
40
+ RenderTexture temporary = RenderTexture.GetTemporary(width, height, 0, SystemInfo.GetGraphicsFormat(DefaultFormat.LDR));
41
+ Graphics.Blit(original, temporary);
42
+ RenderTexture.active = temporary;
43
+
44
+ bool flag = width >= SystemInfo.maxTextureSize || height >= SystemInfo.maxTextureSize;
45
+ Texture2D temporaryDuplicate = new Texture2D(width, height, TextureFormat.RGBA32, original.mipmapCount > 1 | flag);
46
+ temporaryDuplicate.ReadPixels(new Rect(0.0f, 0.0f, width, height), 0, 0);
47
+ temporaryDuplicate.Apply();
48
+
49
+ RenderTexture.ReleaseTemporary(temporary);
50
+ temporaryDuplicate.alphaIsTransparency = original.alphaIsTransparency;
51
+
52
+ return temporaryDuplicate;
53
+ }
54
+ }
55
+ }
@@ -0,0 +1,40 @@
1
+ using System;
2
+ using UnityEngine;
3
+ using UnityEditor.U2D.Sprites;
4
+
5
+ namespace Editor
6
+ {
7
+ static public partial class SpriteEditorUtility
8
+ {
9
+ /// <summary>
10
+ /// Slices a texture into a regular grid of sprite rectangles based on specified cell size, offset, and padding.
11
+ /// Optionally keeps or discards empty rectangles based on pixel alpha values.
12
+ /// </summary>
13
+ /// <param name="spriteDataProvider">The sprite data provider for the texture.</param>
14
+ /// <param name="textureProvider">The texture data provider.</param>
15
+ /// <param name="offset">The offset from the top-left corner to start the grid.</param>
16
+ /// <param name="size">The size of each grid cell (width x height).</param>
17
+ /// <param name="padding">The padding between grid cells.</param>
18
+ /// <param name="addNewSpriteMethod">Method for handling existing sprites (DeleteAll, Smart, Safe).</param>
19
+ /// <param name="nameGenerator">Function to generate sprite names based on index.</param>
20
+ /// <param name="keepEmptyRects">Whether to keep sprites with no visible pixels.</param>
21
+ /// <param name="kOverlapTolerance">Tolerance for detecting overlapping sprites.</param>
22
+ /// <param name="kBestFitTolerance">Tolerance for best-fit matching.</param>
23
+ /// <param name="bestFit">Whether to use best-fit algorithm for overlap detection.</param>
24
+ /// <returns>True if slicing succeeded, false if texture is not readable.</returns>
25
+ static public bool GridSliceTexture(ISpriteEditorDataProvider spriteDataProvider, ITextureDataProvider textureProvider, Vector2 offset, Vector2 size, Vector2 padding,
26
+ AddNewSpriteMethod addNewSpriteMethod, Func<int, string> nameGenerator,
27
+ bool keepEmptyRects =false, float kOverlapTolerance= 0.00001f, float kBestFitTolerance = 0.5f, bool bestFit = false)
28
+ {
29
+ var textureToUse = GetTextureToSlice(textureProvider);
30
+ if (textureToUse == null)
31
+ {
32
+ return false;
33
+ }
34
+ var rects = UnityEditorInternal.InternalSpriteUtility.GenerateGridSpriteRectangles(textureToUse, offset, size, padding, keepEmptyRects);
35
+ var newRects = GenerateNewSpriteRects(spriteDataProvider, rects, addNewSpriteMethod, nameGenerator, kOverlapTolerance, kBestFitTolerance, bestFit);
36
+ spriteDataProvider.SetSpriteRects(newRects.ToArray());
37
+ return true;
38
+ }
39
+ }
40
+ }
@@ -0,0 +1,141 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using UnityEditor.U2D.Sprites;
4
+ using UnityEngine;
5
+
6
+ namespace Editor
7
+ {
8
+ static public class IsometricSliceUtility
9
+ {
10
+ /// <summary>
11
+ /// Slices a texture into isometric tiles based on specified size and offset.
12
+ /// Creates sprite rectangles in an isometric diamond pattern and optionally sets diamond-shaped outlines.
13
+ /// </summary>
14
+ /// <param name="spriteDataProvider">The sprite data provider for the texture.</param>
15
+ /// <param name="textureProvider">The texture data provider.</param>
16
+ /// <param name="size">The size of each isometric tile (width x height).</param>
17
+ /// <param name="offset">The offset from the top-left corner to start slicing.</param>
18
+ /// <param name="alignment">The alignment value for sprites.</param>
19
+ /// <param name="pivot">The pivot point for sprites.</param>
20
+ /// <param name="slicingMethod">Method for handling existing sprites (DeleteAll, Smart, Safe).</param>
21
+ /// <param name="nameGenerator">Function to generate sprite names based on index.</param>
22
+ /// <param name="kOverlapTolerance">Tolerance for detecting overlapping sprites.</param>
23
+ /// <param name="kBestFitTolerance">Tolerance for best-fit matching.</param>
24
+ /// <param name="bestFit">Whether to use best-fit algorithm for overlap detection.</param>
25
+ /// <param name="keepEmptyRects">Whether to keep sprites with no visible pixels.</param>
26
+ /// <param name="isAlternate">Whether to start with alternating row offset.</param>
27
+ /// <returns>True if slicing succeeded, false if texture is not readable.</returns>
28
+ static public bool IsometricSliceTexture(ISpriteEditorDataProvider spriteDataProvider, ITextureDataProvider textureProvider,
29
+ Vector2 size, Vector2 offset, int alignment, Vector2 pivot, SpriteEditorUtility.AddNewSpriteMethod slicingMethod, Func<int, string> nameGenerator,
30
+ float kOverlapTolerance = 0.00001f, float kBestFitTolerance = 0.5f, bool bestFit = false, bool keepEmptyRects = false, bool isAlternate = false)
31
+ {
32
+ var texture = SpriteEditorUtility.GetTextureToSlice(textureProvider);
33
+ if (texture == null)
34
+ {
35
+ return false;
36
+ }
37
+ var rects = GetIsometricRects(texture, size, offset, isAlternate, keepEmptyRects);
38
+ var newRects = SpriteEditorUtility.GenerateNewSpriteRects(spriteDataProvider, rects, slicingMethod, nameGenerator, kOverlapTolerance, kBestFitTolerance, bestFit);
39
+ spriteDataProvider.SetSpriteRects(newRects.ToArray());
40
+
41
+ // Set diamond-shaped outlines for isometric sprites
42
+ var outlineDataProvider = spriteDataProvider.GetDataProvider<ISpriteOutlineDataProvider>();
43
+ if (outlineDataProvider != null)
44
+ {
45
+ List<Vector2[]> outlines = new List<Vector2[]>(4);
46
+ outlines.Add(new[] {
47
+ new Vector2(0.0f, -size.y / 2),
48
+ new Vector2(size.x / 2, 0.0f),
49
+ new Vector2(0.0f, size.y / 2),
50
+ new Vector2(-size.x / 2, 0.0f)
51
+ });
52
+ foreach (var rect in newRects)
53
+ {
54
+ outlineDataProvider.SetOutlines(rect.spriteID, outlines);
55
+ }
56
+ }
57
+
58
+ return true;
59
+ }
60
+
61
+ private static bool PixelHasAlpha(int x, int y, int width, bool[] alphaPixelCache)
62
+ {
63
+ var index = y * width + x;
64
+ return alphaPixelCache[index];
65
+ }
66
+
67
+ /// <summary>
68
+ /// Generates rectangles for isometric tile slicing by walking the texture in an isometric pattern.
69
+ /// Optionally filters out empty rectangles based on alpha pixel density.
70
+ /// </summary>
71
+ public static IEnumerable<Rect> GetIsometricRects(Texture2D textureToUse, Vector2 size, Vector2 offset, bool isAlternate, bool keepEmptyRects)
72
+ {
73
+ var alphaPixelCache = new bool[textureToUse.width * textureToUse.height];
74
+ Color32[] pixels = textureToUse.GetPixels32();
75
+ for (int i = 0; i < pixels.Length; i++)
76
+ alphaPixelCache[i] = pixels[i].a != 0;
77
+
78
+ var gradient = (size.x / 2) / (size.y / 2);
79
+ bool isAlt = isAlternate;
80
+ float x = offset.x;
81
+ if (isAlt)
82
+ x += size.x / 2;
83
+ float y = textureToUse.height - offset.y;
84
+
85
+ while (y - size.y >= 0)
86
+ {
87
+ while (x + size.x <= textureToUse.width)
88
+ {
89
+ var rect = new Rect(x, y - size.y, size.x, size.y);
90
+ if (!keepEmptyRects)
91
+ {
92
+ // Check if the isometric diamond area has sufficient alpha pixels
93
+ int sx = (int)rect.x;
94
+ int sy = (int)rect.y;
95
+ int width = (int)size.x;
96
+ int odd = ((int)size.y) % 2;
97
+ int topY = ((int)size.y / 2) - 1;
98
+ int bottomY = topY + odd;
99
+ int totalPixels = 0;
100
+ int alphaPixels = 0;
101
+
102
+ // Sample pixels in diamond shape
103
+ for (int ry = 0; ry <= topY; ry++)
104
+ {
105
+ var pixelOffset = Mathf.CeilToInt(gradient * ry);
106
+ for (int rx = pixelOffset; rx < width - pixelOffset; ++rx)
107
+ {
108
+ if (PixelHasAlpha(sx + rx, sy + topY - ry, textureToUse.width, alphaPixelCache))
109
+ alphaPixels++;
110
+ if (PixelHasAlpha(sx + rx, sy + bottomY + ry, textureToUse.width, alphaPixelCache))
111
+ alphaPixels++;
112
+ totalPixels += 2;
113
+ }
114
+ }
115
+
116
+ if (odd > 0)
117
+ {
118
+ int ry = topY + 1;
119
+ for (int rx = 0; rx < size.x; ++rx)
120
+ {
121
+ if (PixelHasAlpha(sx + rx, sy + ry, textureToUse.width, alphaPixelCache))
122
+ alphaPixels++;
123
+ totalPixels++;
124
+ }
125
+ }
126
+ if (totalPixels > 0 && ((float)alphaPixels) / totalPixels > 0.01f)
127
+ yield return rect;
128
+ }
129
+ else
130
+ yield return rect;
131
+ x += size.x;
132
+ }
133
+ isAlt = !isAlt;
134
+ x = offset.x;
135
+ if (isAlt)
136
+ x += size.x / 2;
137
+ y -= size.y / 2;
138
+ }
139
+ }
140
+ }
141
+ }
@@ -0,0 +1,134 @@
1
+ # Sprite Editor Utility Examples
2
+
3
+ Reference implementations demonstrating sprite editing operations. Each file contains a single method for token efficiency.
4
+
5
+ ## Basic Operations
6
+
7
+ ### GetTextureSourceImageSize.cs
8
+ Gets the original source image dimensions (before import).
9
+
10
+ **Use when:** You need to know the true image dimensions, not the imported texture size.
11
+
12
+ **Key APIs:** ITextureDataProvider.GetTextureActualWidthAndHeight()
13
+
14
+ ### SpriteToPng.cs
15
+ Exports a sprite to PNG byte array by rendering its mesh geometry.
16
+
17
+ **Use when:** Extracting individual sprites from sprite sheets.
18
+
19
+ **Key concepts:** Renders sprite vertices, UVs, and triangles. Handles tight packing and custom meshes.
20
+
21
+ ### SetPivotExample.cs
22
+ Demonstrates setting sprite pivots using both predefined alignments and custom pivot positions.
23
+
24
+ **Use when:** Changing sprite pivot points.
25
+
26
+ **Key methods:**
27
+ - `SpriteEditorUtility.SetCustomPivot()` - Sets custom pivot position. Must set `alignment = SpriteAlignment.Custom` and `pivot = Vector2`
28
+ - `SpriteEditorUtility.SetPivot()` - Sets predefined alignment (Center, BottomLeft, TopRight, etc.)
29
+
30
+ **Important:** Always set `alignment` field when changing pivots. Custom pivots require `SpriteAlignment.Custom`.
31
+
32
+ ## Slicing Operations
33
+
34
+ ### GetTextureToSlice.cs
35
+ Prepares a readable texture for slicing, upscaling to original dimensions if needed.
36
+
37
+ **Use when:** Before any slicing operation to ensure correct coordinates.
38
+
39
+ **Key concept:** See [../references/background.md](../references/background.md#critical-for-slicing-operations) for why this is necessary.
40
+
41
+ ### AutomaticSliceTexture.cs
42
+ Automatically detects sprite regions using Unity's built-in detection algorithm.
43
+
44
+ **Use when:** Slicing sprite sheets where sprites have transparent borders.
45
+
46
+ **Key APIs:**
47
+ - UnityEditorInternal.InternalSpriteUtility.GenerateAutomaticSpriteRectangles()
48
+ - GenerateNewSpriteRects() for sprite management
49
+
50
+ ### GridSliceTexture.cs
51
+ Slices textures into regular grid patterns.
52
+
53
+ **Use when:** Sprite sheet has evenly-spaced sprites (e.g., animation frames, tile sets).
54
+
55
+ **Parameters:** offset, size, padding, keepEmptyRects
56
+
57
+ **Key APIs:** UnityEditorInternal.InternalSpriteUtility.GenerateGridSpriteRectangles()
58
+
59
+ ### IsometricSliceTexture.cs
60
+ Slices textures into isometric diamond-pattern tiles.
61
+
62
+ **Use when:** Working with isometric tile sets (e.g., isometric RPG tiles).
63
+
64
+ **Key features:**
65
+ - Diamond-shaped outline generation
66
+ - Empty tile detection based on alpha pixels
67
+ - Alternating row offset support
68
+
69
+ **Key APIs:** ISpriteOutlineDataProvider for diamond outlines
70
+
71
+ ### GenerateNewSpriteRects.cs
72
+ Core utility for managing sprite rectangles during slicing operations.
73
+
74
+ **Three modes:**
75
+ - **DeleteAll**: Replace all existing sprites with new ones
76
+ - **Smart**: Update overlapping sprites, add non-overlapping ones
77
+ - **Safe**: Only add sprites that don't overlap with existing sprites
78
+
79
+ **Key features:**
80
+ - Automatic sprite naming with conflict resolution
81
+ - Overlap detection (with tolerance and best-fit options)
82
+ - Preserves existing sprites in Safe/Smart modes
83
+
84
+ **Use when:** Implementing custom slicing logic or managing sprite updates.
85
+
86
+ ## Usage Pattern
87
+
88
+ All slicing utilities follow this pattern:
89
+
90
+ ```csharp
91
+ // 1. Get texture at original size
92
+ var texture = GetTextureToSlice(textureProvider);
93
+
94
+ // 2. Generate rectangles
95
+ var rects = [algorithm to generate Rect collection];
96
+
97
+ // 3. Convert to SpriteRects with management logic
98
+ var newRects = GenerateNewSpriteRects(
99
+ spriteDataProvider,
100
+ rects,
101
+ addNewSpriteMethod,
102
+ nameGenerator
103
+ );
104
+
105
+ // 4. Apply to data provider
106
+ spriteDataProvider.SetSpriteRects(newRects.ToArray());
107
+ ```
108
+
109
+ ## Name Generator Examples
110
+
111
+ The `nameGenerator` parameter is a function that takes an integer index and returns a sprite name string.
112
+
113
+ ### Using Asset Filename from Data Provider
114
+ ```csharp
115
+ string assetPath = AssetDatabase.GetAssetPath(spriteDataProvider.targetObject);
116
+ string filename = !string.IsNullOrEmpty(assetPath)
117
+ ? System.IO.Path.GetFileNameWithoutExtension(assetPath)
118
+ : "sprite";
119
+ Func<int, string> nameGenerator = (index) => $"{filename}_{index}";
120
+ // Produces: character_sheet_0, character_sheet_1, etc. (or sprite_0, sprite_1 if no path)
121
+ ```
122
+
123
+ ### Simple Numbered Names
124
+ ```csharp
125
+ Func<int, string> nameGenerator = (index) => $"sprite_{index}";
126
+ // Produces: sprite_0, sprite_1, sprite_2, etc.
127
+ ```
128
+
129
+ ## Important Notes
130
+
131
+ - All coordinates are in **original image space** (see [../references/background.md](../references/background.md#original-vs-imported-image-sizes))
132
+ - Use GetTextureToSlice before any slicing operation
133
+ - GenerateNewSpriteRects handles name conflicts and overlap detection
134
+ - For Unity 2021.2+ requirements, see [../references/background.md](../references/background.md#version-specific-requirements)
@@ -0,0 +1,58 @@
1
+ using UnityEditor;
2
+ using UnityEditor.U2D.Sprites;
3
+ using UnityEngine;
4
+
5
+ namespace Editor
6
+ {
7
+ static public partial class SpriteEditorUtility
8
+ {
9
+ /// <summary>
10
+ /// Sets a custom pivot point for a specific sprite within a sprite editor data provider.
11
+ /// The pivot is specified as a normalized Vector2 where (0,0) is bottom-left and (1,1) is top-right.
12
+ /// </summary>
13
+ /// <param name="dataProvider">The sprite editor data provider containing the sprite data.</param>
14
+ /// <param name="sprite">The GUID of the sprite to modify.</param>
15
+ /// <param name="pivot">The normalized pivot position (0-1 range for both x and y).</param>
16
+ /// <returns>True if the sprite was found and the pivot was set successfully; otherwise, false.</returns>
17
+ public static bool SetCustomPivot(ISpriteEditorDataProvider dataProvider, GUID sprite, Vector2 pivot)
18
+ {
19
+ var rects = dataProvider.GetSpriteRects();
20
+ for (int i = 0; i < rects.Length; ++i)
21
+ {
22
+ if (rects[i].spriteID == sprite)
23
+ {
24
+ rects[i].pivot = pivot;
25
+ rects[i].alignment = SpriteAlignment.Custom;
26
+ dataProvider.SetSpriteRects(rects);
27
+ return true;
28
+ }
29
+ }
30
+
31
+ return false;
32
+ }
33
+
34
+ /// <summary>
35
+ /// Sets a predefined pivot alignment for a specific sprite within a sprite editor data provider.
36
+ /// Uses Unity's built-in alignment options (e.g., Center, TopLeft, BottomRight).
37
+ /// </summary>
38
+ /// <param name="dataProvider">The sprite editor data provider containing the sprite data.</param>
39
+ /// <param name="sprite">The GUID of the sprite to modify.</param>
40
+ /// <param name="alignment">The predefined sprite alignment to apply.</param>
41
+ /// <returns>True if the sprite was found and the alignment was set successfully; otherwise, false.</returns>
42
+ public static bool SetPivot(ISpriteEditorDataProvider dataProvider, GUID sprite, SpriteAlignment alignment)
43
+ {
44
+ var rects = dataProvider.GetSpriteRects();
45
+ for (int i = 0; i < rects.Length; ++i)
46
+ {
47
+ if (rects[i].spriteID == sprite)
48
+ {
49
+ rects[i].alignment = alignment;
50
+ dataProvider.SetSpriteRects(rects);
51
+ return true;
52
+ }
53
+ }
54
+
55
+ return false;
56
+ }
57
+ }
58
+ }