@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,918 @@
1
+ # Rewarded Ads API Reference
2
+
3
+ ## Contents
4
+ - [Overview](#overview)
5
+ - [Key Characteristics](#key-characteristics)
6
+ - [Implementation Pattern](#implementation-pattern)
7
+ - [API Reference](#api-reference)
8
+ - [Data Types](#data-types)
9
+ - [Best Practices](#best-practices)
10
+ - [Common Issues](#common-issues)
11
+ - [Testing Checklist](#testing-checklist)
12
+
13
+ ## Overview
14
+
15
+ Rewarded ads are video ads that users choose to watch in exchange for in-app rewards. They're the highest-earning ad format and provide excellent user experience when implemented correctly.
16
+
17
+ ## Key Characteristics
18
+
19
+ - **User-initiated**: Users explicitly choose to watch
20
+ - **Win-win**: Users get valuable rewards, developers get revenue
21
+ - **Best for**: Extra lives, hints, currency, power-ups, skipping wait times
22
+
23
+ ## Implementation Pattern
24
+
25
+ ### Basic Rewarded Ad Implementation
26
+
27
+ ```csharp
28
+ using UnityEngine;
29
+ using Unity.Services.LevelPlay;
30
+
31
+ public class RewardedAdManager : MonoBehaviour
32
+ {
33
+ private LevelPlayRewardedAd rewardedAd;
34
+ private string adUnitId = "YOUR_REWARDED_AD_UNIT_ID";
35
+
36
+ // Optional: assign a handler to be notified when the user earns the reward.
37
+ // Callers (e.g. a HintSystem) set this before calling ShowAd().
38
+ public System.Action OnRewardGranted;
39
+
40
+ void Start()
41
+ {
42
+ // Create the rewarded ad object and register event listeners.
43
+ // Do not call LoadAd() here — load is triggered explicitly by a publisher-controlled
44
+ // action (e.g. a button press, scene entry, or a point in gameplay where the ad
45
+ // should be available). See LoadAd() below.
46
+ rewardedAd = new LevelPlayRewardedAd(adUnitId);
47
+
48
+ // ILRD (SDK 9.5.0+): if impression-revenue tracking is enabled, also subscribe here —
49
+ // rewardedAd.OnAdImpressionDataReady += OnImpressionDataReady; // see references/ilrd-api.md
50
+
51
+ // Register event listeners
52
+ rewardedAd.OnAdLoaded += OnAdLoaded;
53
+ rewardedAd.OnAdLoadFailed += OnAdLoadFailed;
54
+ rewardedAd.OnAdDisplayed += OnAdDisplayed;
55
+ rewardedAd.OnAdDisplayFailed += OnAdDisplayFailed;
56
+ rewardedAd.OnAdRewarded += OnAdRewarded;
57
+ rewardedAd.OnAdClosed += OnAdClosed;
58
+ rewardedAd.OnAdClicked += OnAdClicked;
59
+ rewardedAd.OnAdInfoChanged += OnAdInfoChanged; // Fires when the loaded ad updates after a new auction result
60
+ }
61
+
62
+ void OnDestroy()
63
+ {
64
+ // Unregister event listeners
65
+ if (rewardedAd != null)
66
+ {
67
+ rewardedAd.OnAdLoaded -= OnAdLoaded;
68
+ rewardedAd.OnAdLoadFailed -= OnAdLoadFailed;
69
+ rewardedAd.OnAdDisplayed -= OnAdDisplayed;
70
+ rewardedAd.OnAdDisplayFailed -= OnAdDisplayFailed;
71
+ rewardedAd.OnAdRewarded -= OnAdRewarded;
72
+ rewardedAd.OnAdClosed -= OnAdClosed;
73
+ rewardedAd.OnAdClicked -= OnAdClicked;
74
+ rewardedAd.OnAdInfoChanged -= OnAdInfoChanged;
75
+ // ILRD (9.5.0+): rewardedAd.OnAdImpressionDataReady -= OnImpressionDataReady;
76
+ }
77
+ }
78
+
79
+ // Call this from the trigger point in your game where you want the ad to be available —
80
+ // for example, from a UI button handler, on entering a scene, or at a natural moment
81
+ // in gameplay. Unlike the legacy IronSource rewarded video, the SDK does not load
82
+ // automatically; LoadAd() must always be called explicitly.
83
+ public void LoadAd()
84
+ {
85
+ Debug.Log("Loading rewarded ad...");
86
+ rewardedAd.LoadAd();
87
+ }
88
+
89
+ public void ShowAd()
90
+ {
91
+ if (rewardedAd.IsAdReady())
92
+ {
93
+ Debug.Log("Showing rewarded ad");
94
+ rewardedAd.ShowAd();
95
+ }
96
+ else
97
+ {
98
+ Debug.LogWarning("Rewarded ad is not ready yet");
99
+ }
100
+ }
101
+
102
+ // True once a rewarded ad has finished loading and can be shown.
103
+ // Use this to decide whether to offer the ad before calling ShowAd().
104
+ public bool IsAdReady() => rewardedAd != null && rewardedAd.IsAdReady();
105
+
106
+ // Event Callbacks
107
+ private void OnAdLoaded(LevelPlayAdInfo adInfo)
108
+ {
109
+ Debug.Log("Rewarded ad loaded successfully");
110
+ }
111
+
112
+ private void OnAdLoadFailed(LevelPlayAdError error)
113
+ {
114
+ Debug.LogWarning($"Rewarded ad failed to load: {error.ErrorMessage}");
115
+ // Retry loading after a delay
116
+ Invoke(nameof(LoadAd), 30f);
117
+ }
118
+
119
+ private void OnAdDisplayed(LevelPlayAdInfo adInfo)
120
+ {
121
+ Debug.Log("Rewarded ad displayed");
122
+ }
123
+
124
+ private void OnAdDisplayFailed(LevelPlayAdInfo adInfo, LevelPlayAdError error)
125
+ {
126
+ Debug.LogError($"Rewarded ad failed to display: {error.ErrorMessage}");
127
+ // Load a new ad
128
+ LoadAd();
129
+ }
130
+
131
+ private void OnAdRewarded(LevelPlayAdInfo adInfo, LevelPlayReward reward)
132
+ {
133
+ Debug.Log($"User earned reward: {reward.Amount} {reward.Name}");
134
+ // Grant the reward to the user
135
+ GrantReward(reward);
136
+ // Notify any external listener (e.g. HintSystem) that the reward was earned
137
+ OnRewardGranted?.Invoke();
138
+ }
139
+
140
+ private void OnAdClosed(LevelPlayAdInfo adInfo)
141
+ {
142
+ Debug.Log("Rewarded ad closed");
143
+ // LoadAd() is not called here automatically. If your game preloads rewarded ads
144
+ // eagerly (so one is always ready), call LoadAd() here. If load is triggered by
145
+ // a player action, wait for that action instead.
146
+ }
147
+
148
+ private void OnAdClicked(LevelPlayAdInfo adInfo)
149
+ {
150
+ Debug.Log("Rewarded ad clicked");
151
+ }
152
+
153
+ private void OnAdInfoChanged(LevelPlayAdInfo adInfo)
154
+ {
155
+ // Optional: log or update analytics with the latest revenue estimate
156
+ Debug.Log($"Rewarded ad info changed - network: {adInfo.AdNetwork}, revenue: ${adInfo.Revenue}");
157
+ }
158
+
159
+ private void GrantReward(LevelPlayReward reward)
160
+ {
161
+ // Implement your reward logic here
162
+ Debug.Log($"Granting {reward.Amount} {reward.Name} to the user");
163
+ }
164
+ }
165
+ ```
166
+
167
+ ### Advanced: Multiple Rewarded Ad Placements
168
+
169
+ ```csharp
170
+ using UnityEngine;
171
+ using Unity.Services.LevelPlay;
172
+ using System.Collections.Generic;
173
+
174
+ public class MultiPlacementRewardedAdManager : MonoBehaviour
175
+ {
176
+ // Single ad unit ID, multiple placements
177
+ private string adUnitId = "YOUR_REWARDED_AD_UNIT_ID";
178
+ private LevelPlayRewardedAd rewardedAd;
179
+
180
+ // Track which placement is currently being shown
181
+ private string currentPlacement;
182
+
183
+ void Start()
184
+ {
185
+ // Create single rewarded ad object
186
+ rewardedAd = new LevelPlayRewardedAd(adUnitId);
187
+
188
+ // Register callbacks
189
+ rewardedAd.OnAdLoaded += OnAdLoaded;
190
+ rewardedAd.OnAdLoadFailed += OnAdLoadFailed;
191
+ rewardedAd.OnAdRewarded += OnAdRewarded;
192
+ rewardedAd.OnAdClosed += OnAdClosed;
193
+ rewardedAd.OnAdDisplayFailed += OnAdDisplayFailed;
194
+
195
+ // Load ad
196
+ rewardedAd.LoadAd();
197
+ }
198
+
199
+ void OnDestroy()
200
+ {
201
+ if (rewardedAd != null)
202
+ {
203
+ rewardedAd.OnAdLoaded -= OnAdLoaded;
204
+ rewardedAd.OnAdLoadFailed -= OnAdLoadFailed;
205
+ rewardedAd.OnAdRewarded -= OnAdRewarded;
206
+ rewardedAd.OnAdClosed -= OnAdClosed;
207
+ rewardedAd.OnAdDisplayFailed -= OnAdDisplayFailed;
208
+ }
209
+ }
210
+
211
+ // Public methods for different placements
212
+ public void ShowAdForHints()
213
+ {
214
+ ShowAdWithPlacement("hints");
215
+ }
216
+
217
+ public void ShowAdForExtraLives()
218
+ {
219
+ ShowAdWithPlacement("extra_lives");
220
+ }
221
+
222
+ public void ShowAdForCoins()
223
+ {
224
+ ShowAdWithPlacement("bonus_coins");
225
+ }
226
+
227
+ private void ShowAdWithPlacement(string placementName)
228
+ {
229
+ if (rewardedAd.IsAdReady())
230
+ {
231
+ // Check if placement is capped
232
+ if (LevelPlayRewardedAd.IsPlacementCapped(placementName))
233
+ {
234
+ Debug.LogWarning($"Placement '{placementName}' is capped");
235
+ return;
236
+ }
237
+
238
+ currentPlacement = placementName;
239
+ Debug.Log($"Showing rewarded ad with placement: {placementName}");
240
+ rewardedAd.ShowAd(placementName: placementName);
241
+ }
242
+ else
243
+ {
244
+ Debug.LogWarning("Rewarded ad is not ready");
245
+ }
246
+ }
247
+
248
+ private void OnAdLoaded(LevelPlayAdInfo adInfo)
249
+ {
250
+ Debug.Log("Rewarded ad loaded");
251
+ }
252
+
253
+ private void OnAdLoadFailed(LevelPlayAdError error)
254
+ {
255
+ Debug.LogWarning($"Rewarded ad load failed: {error.ErrorMessage}");
256
+ Invoke(nameof(LoadAd), 30f);
257
+ }
258
+
259
+ private void OnAdRewarded(LevelPlayAdInfo adInfo, LevelPlayReward reward)
260
+ {
261
+ Debug.Log($"User rewarded: {reward.Amount} {reward.Name} for placement: {currentPlacement}");
262
+
263
+ // Grant placement-specific rewards
264
+ switch (currentPlacement)
265
+ {
266
+ case "hints":
267
+ GrantHints(reward);
268
+ break;
269
+ case "extra_lives":
270
+ GrantExtraLives(reward);
271
+ break;
272
+ case "bonus_coins":
273
+ GrantCoins(reward);
274
+ break;
275
+ }
276
+ }
277
+
278
+ private void OnAdClosed(LevelPlayAdInfo adInfo)
279
+ {
280
+ Debug.Log("Rewarded ad closed");
281
+ currentPlacement = null;
282
+ LoadAd();
283
+ }
284
+
285
+ private void OnAdDisplayFailed(LevelPlayAdInfo adInfo, LevelPlayAdError error)
286
+ {
287
+ Debug.LogError($"Rewarded ad display failed: {error.ErrorMessage}");
288
+ currentPlacement = null;
289
+ LoadAd();
290
+ }
291
+
292
+ private void LoadAd()
293
+ {
294
+ if (rewardedAd != null)
295
+ {
296
+ rewardedAd.LoadAd();
297
+ }
298
+ }
299
+
300
+ // Reward granting methods
301
+ private void GrantHints(LevelPlayReward reward)
302
+ {
303
+ Debug.Log("Granting hints to player");
304
+ // Your hint logic here
305
+ }
306
+
307
+ private void GrantExtraLives(LevelPlayReward reward)
308
+ {
309
+ Debug.Log("Granting extra lives to player");
310
+ // Your lives logic here
311
+ }
312
+
313
+ private void GrantCoins(LevelPlayReward reward)
314
+ {
315
+ Debug.Log("Granting bonus coins to player");
316
+ // Your coins logic here
317
+ }
318
+ }
319
+ ```
320
+
321
+ ## API Reference
322
+
323
+ ### Constructor
324
+
325
+ #### `new LevelPlayRewardedAd(string adUnitId)`
326
+ Create a rewarded ad object.
327
+
328
+ **Parameters:**
329
+ - `adUnitId`: The ad unit identifier from your LevelPlay dashboard
330
+
331
+ **Returns:** `LevelPlayRewardedAd` object
332
+
333
+ **Usage:**
334
+ ```csharp
335
+ LevelPlayRewardedAd rewardedAd = new LevelPlayRewardedAd("your_ad_unit_id");
336
+ ```
337
+
338
+ **Important:** Call this only after `LevelPlay.Init()` has completed successfully (in the `OnInitSuccess` callback).
339
+
340
+ #### `new LevelPlayRewardedAd(string adUnitId, Config config)`
341
+ Create a rewarded ad object with custom configuration.
342
+
343
+ **Parameters:**
344
+ - `adUnitId`: The ad unit identifier
345
+ - `config`: Optional configuration object
346
+
347
+ **Usage:**
348
+ ```csharp
349
+ var configBuilder = new LevelPlayRewardedAd.Config.Builder();
350
+ configBuilder.SetBidFloor(1.0); // Minimum bid price in USD
351
+ var config = configBuilder.Build();
352
+ LevelPlayRewardedAd rewardedAd = new LevelPlayRewardedAd("your_ad_unit_id", config);
353
+ ```
354
+
355
+ ### Configuration Builder
356
+
357
+ #### `LevelPlayRewardedAd.Config.Builder()`
358
+ Create a configuration builder for rewarded ads.
359
+
360
+ **Returns:** `LevelPlayRewardedAd.Config.Builder` object
361
+
362
+ **Usage:**
363
+ ```csharp
364
+ var configBuilder = new LevelPlayRewardedAd.Config.Builder();
365
+ ```
366
+
367
+ **Set minimum bid price:**
368
+ ```csharp
369
+ configBuilder.SetBidFloor(1.0); // Minimum bid price in USD ($1.00 CPM)
370
+ ```
371
+
372
+ **When to use:** Set a minimum bid price in USD for ad requests.
373
+
374
+ #### `Build()`
375
+ Build the configuration object.
376
+
377
+ **Returns:** `LevelPlayRewardedAd.Config` object
378
+
379
+ **Usage:**
380
+ ```csharp
381
+ var config = configBuilder.Build();
382
+ ```
383
+
384
+ ### Core Methods
385
+
386
+ #### `LoadAd()`
387
+ Load a rewarded ad.
388
+
389
+ **Usage:**
390
+ ```csharp
391
+ rewardedAd.LoadAd();
392
+ ```
393
+
394
+ **When to call:**
395
+ - After SDK initialization completes
396
+ - After showing an ad (to load the next one)
397
+ - After a load or display failure
398
+
399
+ #### `ShowAd()`
400
+ Show the rewarded ad without a placement name.
401
+
402
+ **Usage:**
403
+ ```csharp
404
+ if (rewardedAd.IsAdReady())
405
+ {
406
+ rewardedAd.ShowAd();
407
+ }
408
+ ```
409
+
410
+ **Important:** Always check `IsAdReady()` before calling `ShowAd()`.
411
+
412
+ #### `ShowAd(placementName: string)`
413
+ Show the rewarded ad with a named placement for analytics tracking.
414
+
415
+ **Parameters:**
416
+ - `placementName`: Placement name configured in LevelPlay dashboard
417
+
418
+ **Usage:**
419
+ ```csharp
420
+ rewardedAd.ShowAd(placementName: "extra_lives");
421
+ ```
422
+
423
+ **When to use:** When tracking multiple placements within the same ad unit for analytics.
424
+
425
+ #### `GetReward(string placementName = null)`
426
+ Get the reward configuration for a placement.
427
+
428
+ **Parameters:**
429
+ - `placementName` (optional): The placement name to query. If null, returns default reward.
430
+
431
+ **Returns:** `LevelPlayReward` object with Name and Amount
432
+
433
+ **Usage:**
434
+ ```csharp
435
+ // Get default reward
436
+ LevelPlayReward defaultReward = rewardedAd.GetReward();
437
+ Debug.Log($"Default reward: {defaultReward.Amount} {defaultReward.Name}");
438
+
439
+ // Get placement-specific reward
440
+ LevelPlayReward placementReward = rewardedAd.GetReward("extra_lives");
441
+ Debug.Log($"Extra lives reward: {placementReward.Amount} {placementReward.Name}");
442
+ ```
443
+
444
+ **When to use:** To display reward information to users before they watch the ad (e.g., "Watch ad to earn 5 coins").
445
+
446
+ #### `IsAdReady()`
447
+ Check if a rewarded ad is loaded and ready to show.
448
+
449
+ **Returns:** `bool` - true if ready, false otherwise
450
+
451
+ **Usage:**
452
+ ```csharp
453
+ if (rewardedAd.IsAdReady())
454
+ {
455
+ // Ad is ready to show
456
+ rewardedAd.ShowAd();
457
+ }
458
+ else
459
+ {
460
+ // Ad not ready, maybe disable the button
461
+ }
462
+ ```
463
+
464
+ **Best practice:** Check this before showing ad UI buttons to users.
465
+
466
+ #### `LevelPlayRewardedAd.IsPlacementCapped(string placementName)` (Static)
467
+ Check if a placement has reached its capping limit.
468
+
469
+ **Parameters:**
470
+ - `placementName`: The placement name to check
471
+
472
+ **Returns:** `bool` - true if capped, false otherwise
473
+
474
+ **Usage:**
475
+ ```csharp
476
+ if (LevelPlayRewardedAd.IsPlacementCapped("extra_lives"))
477
+ {
478
+ Debug.Log("Extra lives placement is capped");
479
+ }
480
+ ```
481
+
482
+ **When to use:** Before showing an ad to check if the placement frequency cap is reached.
483
+
484
+ ### Events
485
+
486
+ All events are properties of the `LevelPlayRewardedAd` object.
487
+
488
+ **Threading:** All ad callbacks run on the Unity main thread, so you can safely call Unity APIs (update UI, access GameObjects, etc.) directly in these callbacks. This is different from `LevelPlay.OnImpressionDataReady` which runs on a background thread.
489
+
490
+ #### `OnAdLoaded`
491
+ Fired when a rewarded ad is successfully loaded.
492
+
493
+ **Signature:** `event Action<LevelPlayAdInfo>`
494
+
495
+ **Usage:**
496
+ ```csharp
497
+ rewardedAd.OnAdLoaded += (adInfo) =>
498
+ {
499
+ Debug.Log("Rewarded ad loaded");
500
+ // Enable UI button, etc.
501
+ };
502
+ ```
503
+
504
+ #### `OnAdLoadFailed`
505
+ Fired when a rewarded ad fails to load.
506
+
507
+ **Signature:** `event Action<LevelPlayAdError>`
508
+
509
+ **Usage:**
510
+ ```csharp
511
+ rewardedAd.OnAdLoadFailed += (error) =>
512
+ {
513
+ Debug.LogWarning($"Load failed: {error.ErrorMessage}");
514
+ // Retry loading
515
+ };
516
+ ```
517
+
518
+ **Best practice:** Implement retry logic with exponential backoff.
519
+
520
+ #### `OnAdDisplayed`
521
+ Fired when a rewarded ad is displayed on screen.
522
+
523
+ **Signature:** `event Action<LevelPlayAdInfo>`
524
+
525
+ **Usage:**
526
+ ```csharp
527
+ rewardedAd.OnAdDisplayed += (adInfo) =>
528
+ {
529
+ Debug.Log("Rewarded ad displayed");
530
+ // Optional: Pause game
531
+ };
532
+ ```
533
+
534
+ #### `OnAdDisplayFailed`
535
+ Fired when a rewarded ad fails to display.
536
+
537
+ **Signature:** `event Action<LevelPlayAdInfo, LevelPlayAdError>`
538
+
539
+ **Usage:**
540
+ ```csharp
541
+ rewardedAd.OnAdDisplayFailed += (adInfo, error) =>
542
+ {
543
+ Debug.LogError($"Display failed: {error.ErrorMessage}");
544
+ // Load a new ad
545
+ rewardedAd.LoadAd();
546
+ };
547
+ ```
548
+
549
+ #### `OnAdRewarded`
550
+ Fired when the user has earned the reward.
551
+
552
+ **Signature:** `event Action<LevelPlayAdInfo, LevelPlayReward>`
553
+
554
+ **Parameters:**
555
+ - `adInfo`: Information about the ad
556
+ - `reward`: The reward object containing `Name` and `Amount`
557
+
558
+ **Usage:**
559
+ ```csharp
560
+ rewardedAd.OnAdRewarded += (adInfo, reward) =>
561
+ {
562
+ Debug.Log($"User earned: {reward.Amount} {reward.Name}");
563
+ // Grant the reward to the user
564
+ GrantReward(reward);
565
+ };
566
+ ```
567
+
568
+ **Critical:** This is where you grant rewards to the user. Don't wait for `OnAdClosed` - users may close before the ad finishes.
569
+
570
+ #### `OnAdClosed`
571
+ Fired when the rewarded ad is closed.
572
+
573
+ **Signature:** `event Action<LevelPlayAdInfo>`
574
+
575
+ **Usage:**
576
+ ```csharp
577
+ rewardedAd.OnAdClosed += (adInfo) =>
578
+ {
579
+ Debug.Log("Rewarded ad closed");
580
+ // Resume game. Whether to call LoadAd() here depends on your load strategy:
581
+ // call it if you preload eagerly; otherwise wait for the player's next load trigger.
582
+ };
583
+ ```
584
+
585
+ #### `OnAdClicked`
586
+ Fired when the user clicks on the rewarded ad.
587
+
588
+ **Signature:** `event Action<LevelPlayAdInfo>`
589
+
590
+ **Usage:**
591
+ ```csharp
592
+ rewardedAd.OnAdClicked += (adInfo) =>
593
+ {
594
+ Debug.Log("Rewarded ad clicked");
595
+ // Optional analytics tracking
596
+ };
597
+ ```
598
+
599
+ #### `OnAdInfoChanged`
600
+ Fired when ad information changes, such as when a new winning ad becomes available after auction.
601
+
602
+ **Signature:** `event Action<LevelPlayAdInfo>`
603
+
604
+ **Usage:**
605
+ ```csharp
606
+ rewardedAd.OnAdInfoChanged += (adInfo) =>
607
+ {
608
+ Debug.Log($"Ad info changed - New ad from: {adInfo.AdNetwork}");
609
+ Debug.Log($"Estimated revenue: ${adInfo.Revenue}");
610
+ };
611
+ ```
612
+
613
+ **Important:** This event indicates that a new ad with potentially different revenue has become available. The SDK automatically selects the winning ad from the auction when you call `ShowAd()`, but this event lets you know when the ad info has been updated. This is particularly important for revenue optimization as it signals when a new auction winner has loaded.
614
+
615
+ **When it fires:**
616
+ - After a new ad loads with different properties than the previous one
617
+ - When the waterfall selects a different ad network
618
+ - When ad auction results change
619
+
620
+ **Why it matters:** The updated `LevelPlayAdInfo` contains the latest revenue estimates and network information, which directly impacts your monetization. Always use the most recent `adInfo` when logging or analyzing ad performance.
621
+
622
+ **If you're using ILRD** (`references/ilrd-api.md`): the `LevelPlayImpressionData` you receive in `OnImpressionDataReady` already contains the final revenue value, so `OnAdInfoChanged` is mostly useful for in-Editor debugging of the waterfall. Most publishers can leave it as a logging hook.
623
+
624
+ ## Data Types
625
+
626
+ ### LevelPlayReward
627
+
628
+ Represents the reward earned by the user.
629
+
630
+ **Properties:**
631
+ - `Name` (string): The reward name (e.g., "coins", "life")
632
+ - `Amount` (int): The reward amount (e.g., 10, 1)
633
+
634
+ **Usage:**
635
+ ```csharp
636
+ private void OnAdRewarded(LevelPlayAdInfo adInfo, LevelPlayReward reward)
637
+ {
638
+ Debug.Log($"Reward: {reward.Amount} {reward.Name}");
639
+
640
+ if (reward.Name == "coins")
641
+ {
642
+ playerCoins += reward.Amount;
643
+ }
644
+ }
645
+ ```
646
+
647
+ ### LevelPlayAdInfo
648
+
649
+ Contains information about the ad.
650
+
651
+ **Properties:**
652
+ - `AdId` (string): Unique identifier for this specific ad instance
653
+ - `AdUnitId` (string): The ad unit identifier
654
+ - `AdUnitName` (string): The ad unit name
655
+ - `AdSize` (LevelPlayAdSize): The ad size (may be null; banner-relevant)
656
+ - `AdFormat` (string): The ad format (e.g., "REWARDED")
657
+ - `PlacementName` (string): Placement name where ad was shown
658
+ - `AuctionId` (string): Unique auction identifier
659
+ - `CreativeId` (string): Creative identifier
660
+ - `Country` (string): User's country code (ISO 3166-1)
661
+ - `Ab` (string): A/B test segment identifier
662
+ - `SegmentName` (string): User segment name
663
+ - `AdNetwork` (string): Ad network that served the ad
664
+ - `InstanceName` (string): Ad network instance name
665
+ - `InstanceId` (string): Ad network instance identifier
666
+ - `Revenue` (double?): Estimated revenue in USD (nullable - check for null)
667
+ - `Precision` (string): Revenue precision level
668
+ - `EncryptedCPM` (string): Encrypted CPM value
669
+
670
+ ### LevelPlayAdError
671
+
672
+ Contains error information when ad operations fail.
673
+
674
+ **Properties:**
675
+ - `ErrorCode` (int): Numeric error code
676
+ - `ErrorMessage` (string): Human-readable error description
677
+ - `AdUnitId` (string): The ad unit identifier where the error occurred
678
+ - `AdId` (string): Unique identifier for the specific ad instance
679
+
680
+ ## Best Practices
681
+
682
+ ### Loading Strategy
683
+
684
+ Unlike the legacy IronSource rewarded video (where the SDK managed loading automatically), the MADU rewarded API requires `LoadAd()` to be called explicitly. The ad object is created in `OnInitSuccess`, but loading is a separate step triggered by the publisher.
685
+
686
+ **Explicit load pattern (matches official sample):**
687
+ ```csharp
688
+ // In OnInitSuccess: create the object and subscribe events only — do not load yet.
689
+ void OnInitSuccess(LevelPlayConfiguration config)
690
+ {
691
+ rewardedAd = new LevelPlayRewardedAd(adUnitId);
692
+ rewardedAd.OnAdLoaded += OnAdLoaded;
693
+ rewardedAd.OnAdClosed += OnAdClosed;
694
+ // LoadAd() is called later, from a publisher-controlled trigger.
695
+ }
696
+
697
+ // Example trigger: called from a UI button or a scene entry point.
698
+ public void OnPlayerReachesRewardedAdOpportunity()
699
+ {
700
+ rewardedAd.LoadAd();
701
+ }
702
+ ```
703
+
704
+ **Eager preload pattern (optional):** If the game always needs a rewarded ad ready the moment the player reaches certain screens, call `LoadAd()` immediately in `OnInitSuccess` after creating the object, and optionally again in `OnAdClosed`. This is a valid choice but makes the manual load requirement less visible — use it consciously, not as a default.
705
+
706
+ ```csharp
707
+ void OnInitSuccess(LevelPlayConfiguration config)
708
+ {
709
+ rewardedAd = new LevelPlayRewardedAd(adUnitId);
710
+ rewardedAd.OnAdLoaded += OnAdLoaded;
711
+ rewardedAd.OnAdClosed += OnAdClosed;
712
+ rewardedAd.LoadAd(); // Eager preload — conscious choice, not automatic legacy behavior.
713
+ }
714
+
715
+ void OnAdClosed(LevelPlayAdInfo adInfo)
716
+ {
717
+ rewardedAd.LoadAd(); // Reload immediately so one is ready for the next opportunity.
718
+ }
719
+ ```
720
+
721
+ ### UI Integration
722
+
723
+ **Show/hide buttons based on ad availability:**
724
+ ```csharp
725
+ public Button watchAdButton;
726
+
727
+ void Update()
728
+ {
729
+ // Enable button only if ad is ready
730
+ watchAdButton.interactable = rewardedAd != null && rewardedAd.IsAdReady();
731
+ }
732
+
733
+ void OnAdLoaded(LevelPlayAdInfo adInfo)
734
+ {
735
+ watchAdButton.interactable = true;
736
+ }
737
+
738
+ void OnAdLoadFailed(LevelPlayAdError error)
739
+ {
740
+ watchAdButton.interactable = false;
741
+ }
742
+ ```
743
+
744
+ ### Reward Granting
745
+
746
+ **Grant rewards in `OnAdRewarded`, not `OnAdClosed`:**
747
+ ```csharp
748
+ // ✅ CORRECT
749
+ private void OnAdRewarded(LevelPlayAdInfo adInfo, LevelPlayReward reward)
750
+ {
751
+ GrantReward(reward); // Grant immediately
752
+ }
753
+
754
+ // ❌ WRONG - user may close ad early
755
+ private void OnAdClosed(LevelPlayAdInfo adInfo)
756
+ {
757
+ // Don't grant reward here!
758
+ }
759
+ ```
760
+
761
+ **Note:** `OnAdRewarded` and `OnAdClosed` are asynchronous — `OnAdRewarded` may fire after `OnAdClosed`. Do not write logic in `OnAdClosed` that assumes the reward has already been granted.
762
+
763
+ ### Error Handling
764
+
765
+ **Handle ad load failures:**
766
+ ```csharp
767
+ private void OnAdLoadFailed(LevelPlayAdError error)
768
+ {
769
+ Debug.LogWarning($"Ad load failed: {error.ErrorMessage}");
770
+
771
+ // Retry loading after a delay
772
+ Invoke(nameof(RetryLoad), 30f);
773
+ }
774
+
775
+ private void RetryLoad()
776
+ {
777
+ rewardedAd.LoadAd();
778
+ }
779
+ ```
780
+
781
+ ### Multiple Placements
782
+
783
+ **Use placements to track different reward contexts:**
784
+ - Create placements in LevelPlay dashboard (e.g., "hints", "extra_lives")
785
+ - Use `ShowAd(placementName: "name")` to track separately
786
+ - Check `IsPlacementCapped()` before showing
787
+ - Handle rewards differently based on placement in `OnAdRewarded`
788
+
789
+ ### Memory Management
790
+
791
+ **Always unsubscribe from events:**
792
+ ```csharp
793
+ void OnDestroy()
794
+ {
795
+ if (rewardedAd != null)
796
+ {
797
+ rewardedAd.OnAdLoaded -= OnAdLoaded;
798
+ rewardedAd.OnAdLoadFailed -= OnAdLoadFailed;
799
+ rewardedAd.OnAdDisplayed -= OnAdDisplayed;
800
+ rewardedAd.OnAdDisplayFailed -= OnAdDisplayFailed;
801
+ rewardedAd.OnAdRewarded -= OnAdRewarded;
802
+ rewardedAd.OnAdClosed -= OnAdClosed;
803
+ rewardedAd.OnAdClicked -= OnAdClicked;
804
+ rewardedAd.OnAdInfoChanged -= OnAdInfoChanged;
805
+ }
806
+ }
807
+ ```
808
+
809
+ ## Common Issues
810
+
811
+ ### Issue: Error 1037 (Load during load)
812
+
813
+ **Cause:** Calling `LoadAd()` repeatedly in `Update()` or other high-frequency loops before the previous load completes.
814
+
815
+ **Common mistake:**
816
+ ```csharp
817
+ void Update()
818
+ {
819
+ // WRONG - This will cause error 1037!
820
+ if (!rewardedAd.IsAdReady())
821
+ {
822
+ rewardedAd.LoadAd();
823
+ }
824
+ }
825
+ ```
826
+
827
+ **Why this fails:** If the ad is still loading, calling `LoadAd()` again triggers error 1037: "Cannot load while another load is in progress."
828
+
829
+ **Solution:** Track load state manually and only call `LoadAd()` once:
830
+ ```csharp
831
+ private bool isLoadingAd = false;
832
+
833
+ void Start()
834
+ {
835
+ LoadRewardedAd();
836
+ }
837
+
838
+ void LoadRewardedAd()
839
+ {
840
+ if (isLoadingAd) return; // Prevent duplicate loads
841
+
842
+ isLoadingAd = true;
843
+ rewardedAd.LoadAd();
844
+ }
845
+
846
+ void OnAdLoaded(LevelPlayAdInfo adInfo)
847
+ {
848
+ isLoadingAd = false;
849
+ }
850
+
851
+ void OnAdLoadFailed(LevelPlayAdError error)
852
+ {
853
+ isLoadingAd = false;
854
+ // Optionally retry after delay
855
+ }
856
+ ```
857
+
858
+ ### Issue: Reward not granted to user
859
+
860
+ **Possible causes:**
861
+ - Granting reward in `OnAdClosed` instead of `OnAdRewarded`
862
+ - User closes ad before completion
863
+ - Reward logic has bugs
864
+
865
+ **Solution:**
866
+ Always grant rewards in `OnAdRewarded`, which fires when the user has earned the reward (typically after watching enough of the ad).
867
+
868
+ ### Issue: Ad not loading
869
+
870
+ **Possible causes:**
871
+ - SDK not initialized before creating ad object
872
+ - No internet connection
873
+ - Ad inventory not available in test region
874
+ - Incorrect ad unit ID
875
+
876
+ **Solutions:**
877
+ - Create ad object only after `OnInitSuccess` callback
878
+ - Check network connectivity
879
+ - Verify ad unit ID in LevelPlay dashboard
880
+ - Test on real device with good connection
881
+
882
+ ### Issue: Button always disabled
883
+
884
+ **Possible causes:**
885
+ - Not checking `IsAdReady()` correctly
886
+ - Ad failed to load and no retry logic
887
+ - Event subscriptions not working
888
+
889
+ **Solutions:**
890
+ - Implement `OnAdLoaded` callback to enable button
891
+ - Add retry logic in `OnAdLoadFailed`
892
+ - Debug log all callbacks to verify they fire
893
+
894
+ ### Issue: Multiple reward grants
895
+
896
+ **Possible causes:**
897
+ - `OnAdRewarded` callback subscribed multiple times
898
+ - Not tracking if reward already granted
899
+
900
+ **Solutions:**
901
+ - Unsubscribe in `OnDestroy()`
902
+ - Only subscribe once in initialization
903
+ - Use flag to track if reward granted for this ad
904
+
905
+ ## Testing Checklist
906
+
907
+ - [ ] Ad loads successfully after SDK initialization
908
+ - [ ] `IsAdReady()` returns true when ad is loaded
909
+ - [ ] Ad displays correctly when `ShowAd()` is called
910
+ - [ ] `OnAdRewarded` fires and reward is granted
911
+ - [ ] UI button enables when ad is ready
912
+ - [ ] UI button disables when ad is not ready
913
+ - [ ] Ad reloads automatically after being shown
914
+ - [ ] Retry logic works when ad fails to load
915
+ - [ ] Multiple placements track correctly (if using)
916
+ - [ ] Placement capping works (if configured)
917
+ - [ ] Memory leaks prevented (events unsubscribed)
918
+ - [ ] Tested on multiple devices and network conditions