@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,907 @@
1
+ # Interstitial 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
+ Interstitial ads are full-screen video or static ads shown at natural transition points in your app. They provide good revenue while maintaining acceptable user experience when placed thoughtfully.
16
+
17
+ ## Key Characteristics
18
+
19
+ - **Full-screen**: Takes over the entire screen
20
+ - **Skippable**: User can close after viewing
21
+ - **Best for**: Level transitions, game over, menu navigation, session breaks
22
+
23
+ ## Implementation Pattern
24
+
25
+ ### Basic Interstitial Implementation
26
+
27
+ ```csharp
28
+ using UnityEngine;
29
+ using Unity.Services.LevelPlay;
30
+
31
+ public class InterstitialAdManager : MonoBehaviour
32
+ {
33
+ private LevelPlayInterstitialAd interstitialAd;
34
+ private string adUnitId = "YOUR_INTERSTITIAL_AD_UNIT_ID";
35
+
36
+ void Start()
37
+ {
38
+ // Create the interstitial ad object using constructor
39
+ interstitialAd = new LevelPlayInterstitialAd(adUnitId);
40
+
41
+ // ILRD (SDK 9.5.0+): if impression-revenue tracking is enabled, also subscribe here —
42
+ // interstitialAd.OnAdImpressionDataReady += OnImpressionDataReady; // see references/ilrd-api.md
43
+
44
+ // Register event listeners
45
+ interstitialAd.OnAdLoaded += OnAdLoaded;
46
+ interstitialAd.OnAdLoadFailed += OnAdLoadFailed;
47
+ interstitialAd.OnAdDisplayed += OnAdDisplayed;
48
+ interstitialAd.OnAdDisplayFailed += OnAdDisplayFailed;
49
+ interstitialAd.OnAdClicked += OnAdClicked;
50
+ interstitialAd.OnAdClosed += OnAdClosed;
51
+ interstitialAd.OnAdInfoChanged += OnAdInfoChanged; // Fires when the loaded ad updates after a new auction result
52
+
53
+ // Load the ad
54
+ LoadAd();
55
+ }
56
+
57
+ void OnDestroy()
58
+ {
59
+ // Unregister event listeners
60
+ if (interstitialAd != null)
61
+ {
62
+ interstitialAd.OnAdLoaded -= OnAdLoaded;
63
+ interstitialAd.OnAdLoadFailed -= OnAdLoadFailed;
64
+ interstitialAd.OnAdDisplayed -= OnAdDisplayed;
65
+ interstitialAd.OnAdDisplayFailed -= OnAdDisplayFailed;
66
+ interstitialAd.OnAdClicked -= OnAdClicked;
67
+ interstitialAd.OnAdClosed -= OnAdClosed;
68
+ interstitialAd.OnAdInfoChanged -= OnAdInfoChanged;
69
+ // ILRD (9.5.0+): interstitialAd.OnAdImpressionDataReady -= OnImpressionDataReady;
70
+
71
+ // Free the native ad and its resources when this manager is destroyed
72
+ interstitialAd.DestroyAd();
73
+ }
74
+ }
75
+
76
+ public void LoadAd()
77
+ {
78
+ Debug.Log("Loading interstitial ad...");
79
+ interstitialAd.LoadAd();
80
+ }
81
+
82
+ public void ShowAd()
83
+ {
84
+ if (interstitialAd.IsAdReady())
85
+ {
86
+ Debug.Log("Showing interstitial ad");
87
+ interstitialAd.ShowAd();
88
+ }
89
+ else
90
+ {
91
+ Debug.LogWarning("Interstitial ad is not ready yet");
92
+ }
93
+ }
94
+
95
+ // True once an interstitial ad has finished loading and can be shown.
96
+ // Use this to decide whether to show opportunistically before calling ShowAd().
97
+ public bool IsAdReady() => interstitialAd != null && interstitialAd.IsAdReady();
98
+
99
+ // Event Callbacks
100
+ private void OnAdLoaded(LevelPlayAdInfo adInfo)
101
+ {
102
+ Debug.Log("Interstitial ad loaded successfully");
103
+ }
104
+
105
+ private void OnAdLoadFailed(LevelPlayAdError error)
106
+ {
107
+ Debug.LogWarning($"Interstitial ad failed to load: {error.ErrorMessage}");
108
+ // Retry loading after a delay
109
+ Invoke(nameof(LoadAd), 30f);
110
+ }
111
+
112
+ private void OnAdDisplayed(LevelPlayAdInfo adInfo)
113
+ {
114
+ Debug.Log("Interstitial ad displayed");
115
+ }
116
+
117
+ private void OnAdDisplayFailed(LevelPlayAdInfo adInfo, LevelPlayAdError error)
118
+ {
119
+ Debug.LogError($"Interstitial ad failed to display: {error.ErrorMessage}");
120
+ // Load a new ad
121
+ LoadAd();
122
+ }
123
+
124
+ private void OnAdClicked(LevelPlayAdInfo adInfo)
125
+ {
126
+ Debug.Log("Interstitial ad clicked");
127
+ }
128
+
129
+ private void OnAdClosed(LevelPlayAdInfo adInfo)
130
+ {
131
+ Debug.Log("Interstitial ad closed");
132
+ // Load the next ad
133
+ LoadAd();
134
+ }
135
+
136
+ private void OnAdInfoChanged(LevelPlayAdInfo adInfo)
137
+ {
138
+ // Optional: log or update analytics with the latest revenue estimate
139
+ Debug.Log($"Interstitial ad info changed - network: {adInfo.AdNetwork}, revenue: ${adInfo.Revenue}");
140
+ }
141
+ }
142
+ ```
143
+
144
+ ### Advanced: Frequency Capping
145
+
146
+ Implement time-based frequency capping to avoid showing ads too frequently:
147
+
148
+ ```csharp
149
+ using UnityEngine;
150
+ using Unity.Services.LevelPlay;
151
+
152
+ public class FrequencyCappedInterstitialManager : MonoBehaviour
153
+ {
154
+ private LevelPlayInterstitialAd interstitialAd;
155
+ private string adUnitId = "YOUR_INTERSTITIAL_AD_UNIT_ID";
156
+
157
+ // Frequency capping settings
158
+ private float minTimeBetweenAds = 300f; // 5 minutes in seconds
159
+ private float lastAdShownTime = -999f; // Time when last ad was shown
160
+
161
+ void Start()
162
+ {
163
+ // Create interstitial ad object
164
+ interstitialAd = new LevelPlayInterstitialAd(adUnitId);
165
+
166
+ // Register callbacks
167
+ interstitialAd.OnAdLoaded += OnAdLoaded;
168
+ interstitialAd.OnAdLoadFailed += OnAdLoadFailed;
169
+ interstitialAd.OnAdDisplayed += OnAdDisplayed;
170
+ interstitialAd.OnAdClosed += OnAdClosed;
171
+ interstitialAd.OnAdDisplayFailed += OnAdDisplayFailed;
172
+
173
+ // Load first ad
174
+ interstitialAd.LoadAd();
175
+ }
176
+
177
+ void OnDestroy()
178
+ {
179
+ if (interstitialAd != null)
180
+ {
181
+ interstitialAd.OnAdLoaded -= OnAdLoaded;
182
+ interstitialAd.OnAdLoadFailed -= OnAdLoadFailed;
183
+ interstitialAd.OnAdDisplayed -= OnAdDisplayed;
184
+ interstitialAd.OnAdClosed -= OnAdClosed;
185
+ interstitialAd.OnAdDisplayFailed -= OnAdDisplayFailed;
186
+
187
+ // Destroy the ad to free its native resources
188
+ interstitialAd.DestroyAd();
189
+ }
190
+ }
191
+
192
+ public void TryShowInterstitial()
193
+ {
194
+ // Check if enough time has passed since last ad
195
+ float timeSinceLastAd = Time.time - lastAdShownTime;
196
+
197
+ if (timeSinceLastAd < minTimeBetweenAds)
198
+ {
199
+ Debug.Log($"Frequency cap: {minTimeBetweenAds - timeSinceLastAd:F0}s until next ad");
200
+ return;
201
+ }
202
+
203
+ // Check if ad is ready
204
+ if (interstitialAd.IsAdReady())
205
+ {
206
+ interstitialAd.ShowAd();
207
+ }
208
+ else
209
+ {
210
+ Debug.LogWarning("Interstitial not ready, loading...");
211
+ interstitialAd.LoadAd();
212
+ }
213
+ }
214
+
215
+ private void OnAdLoaded(LevelPlayAdInfo adInfo)
216
+ {
217
+ Debug.Log("Interstitial loaded");
218
+ }
219
+
220
+ private void OnAdLoadFailed(LevelPlayAdError error)
221
+ {
222
+ Debug.LogWarning($"Interstitial load failed: {error.ErrorMessage}");
223
+ Invoke(nameof(LoadAd), 30f);
224
+ }
225
+
226
+ private void OnAdDisplayed(LevelPlayAdInfo adInfo)
227
+ {
228
+ Debug.Log("Interstitial displayed");
229
+ lastAdShownTime = Time.time; // Record when ad was shown
230
+ }
231
+
232
+ private void OnAdClosed(LevelPlayAdInfo adInfo)
233
+ {
234
+ Debug.Log("Interstitial closed");
235
+ // Load next ad
236
+ interstitialAd.LoadAd();
237
+ }
238
+
239
+ private void OnAdDisplayFailed(LevelPlayAdInfo adInfo, LevelPlayAdError error)
240
+ {
241
+ Debug.LogError($"Interstitial display failed: {error.ErrorMessage}");
242
+ interstitialAd.LoadAd();
243
+ }
244
+
245
+ private void LoadAd()
246
+ {
247
+ if (interstitialAd != null)
248
+ {
249
+ interstitialAd.LoadAd();
250
+ }
251
+ }
252
+ }
253
+ ```
254
+
255
+ ### Advanced: Multiple Placements
256
+
257
+ Track different interstitial placements for analytics:
258
+
259
+ ```csharp
260
+ using UnityEngine;
261
+ using Unity.Services.LevelPlay;
262
+
263
+ public class MultiPlacementInterstitialManager : MonoBehaviour
264
+ {
265
+ private LevelPlayInterstitialAd interstitialAd;
266
+ private string adUnitId = "YOUR_INTERSTITIAL_AD_UNIT_ID";
267
+
268
+ // Placement names
269
+ private const string PLACEMENT_LEVEL_COMPLETE = "level_complete";
270
+ private const string PLACEMENT_GAME_OVER = "game_over";
271
+ private const string PLACEMENT_MAIN_MENU = "main_menu";
272
+
273
+ // Frequency capping per placement
274
+ private float minTimeBetweenAds = 300f;
275
+ private float lastAdTime = -999f;
276
+
277
+ void Start()
278
+ {
279
+ interstitialAd = new LevelPlayInterstitialAd(adUnitId);
280
+
281
+ interstitialAd.OnAdLoaded += OnAdLoaded;
282
+ interstitialAd.OnAdLoadFailed += OnAdLoadFailed;
283
+ interstitialAd.OnAdDisplayed += OnAdDisplayed;
284
+ interstitialAd.OnAdClosed += OnAdClosed;
285
+ interstitialAd.OnAdDisplayFailed += OnAdDisplayFailed;
286
+
287
+ interstitialAd.LoadAd();
288
+ }
289
+
290
+ void OnDestroy()
291
+ {
292
+ if (interstitialAd != null)
293
+ {
294
+ interstitialAd.OnAdLoaded -= OnAdLoaded;
295
+ interstitialAd.OnAdLoadFailed -= OnAdLoadFailed;
296
+ interstitialAd.OnAdDisplayed -= OnAdDisplayed;
297
+ interstitialAd.OnAdClosed -= OnAdClosed;
298
+ interstitialAd.OnAdDisplayFailed -= OnAdDisplayFailed;
299
+
300
+ // Destroy the ad to free its native resources
301
+ interstitialAd.DestroyAd();
302
+ }
303
+ }
304
+
305
+ // Public methods for different placements
306
+ public void ShowOnLevelComplete()
307
+ {
308
+ TryShowWithPlacement(PLACEMENT_LEVEL_COMPLETE);
309
+ }
310
+
311
+ public void ShowOnGameOver()
312
+ {
313
+ TryShowWithPlacement(PLACEMENT_GAME_OVER);
314
+ }
315
+
316
+ public void ShowOnMainMenu()
317
+ {
318
+ TryShowWithPlacement(PLACEMENT_MAIN_MENU);
319
+ }
320
+
321
+ private void TryShowWithPlacement(string placementName)
322
+ {
323
+ // Check frequency cap
324
+ if (Time.time - lastAdTime < minTimeBetweenAds)
325
+ {
326
+ Debug.Log($"Frequency cap active for {placementName}");
327
+ return;
328
+ }
329
+
330
+ // Check placement capping
331
+ if (LevelPlayInterstitialAd.IsPlacementCapped(placementName))
332
+ {
333
+ Debug.Log($"Placement {placementName} is capped");
334
+ return;
335
+ }
336
+
337
+ // Check if ad ready
338
+ if (interstitialAd.IsAdReady())
339
+ {
340
+ Debug.Log($"Showing interstitial with placement: {placementName}");
341
+ interstitialAd.ShowAd(placementName: placementName);
342
+ }
343
+ else
344
+ {
345
+ Debug.LogWarning("Interstitial not ready");
346
+ }
347
+ }
348
+
349
+ private void OnAdLoaded(LevelPlayAdInfo adInfo)
350
+ {
351
+ Debug.Log("Interstitial loaded");
352
+ }
353
+
354
+ private void OnAdLoadFailed(LevelPlayAdError error)
355
+ {
356
+ Debug.LogWarning($"Interstitial load failed: {error.ErrorMessage}");
357
+ Invoke(nameof(LoadAd), 30f);
358
+ }
359
+
360
+ private void OnAdDisplayed(LevelPlayAdInfo adInfo)
361
+ {
362
+ Debug.Log("Interstitial displayed");
363
+ lastAdTime = Time.time;
364
+ }
365
+
366
+ private void OnAdClosed(LevelPlayAdInfo adInfo)
367
+ {
368
+ Debug.Log("Interstitial closed");
369
+ interstitialAd.LoadAd();
370
+ }
371
+
372
+ private void OnAdDisplayFailed(LevelPlayAdInfo adInfo, LevelPlayAdError error)
373
+ {
374
+ Debug.LogError($"Interstitial display failed: {error.ErrorMessage}");
375
+ interstitialAd.LoadAd();
376
+ }
377
+
378
+ private void LoadAd()
379
+ {
380
+ if (interstitialAd != null)
381
+ {
382
+ interstitialAd.LoadAd();
383
+ }
384
+ }
385
+ }
386
+ ```
387
+
388
+ ## API Reference
389
+
390
+ ### Constructor
391
+
392
+ #### `new LevelPlayInterstitialAd(string adUnitId)`
393
+ Create an interstitial ad object.
394
+
395
+ **Parameters:**
396
+ - `adUnitId`: The ad unit identifier from your LevelPlay dashboard
397
+
398
+ **Returns:** `LevelPlayInterstitialAd` object
399
+
400
+ **Usage:**
401
+ ```csharp
402
+ LevelPlayInterstitialAd interstitialAd = new LevelPlayInterstitialAd("your_ad_unit_id");
403
+ ```
404
+
405
+ **Important:** Call this only after `LevelPlay.Init()` has completed successfully (in the `OnInitSuccess` callback).
406
+
407
+ #### `new LevelPlayInterstitialAd(string adUnitId, Config config)`
408
+ Create an interstitial ad object with custom configuration.
409
+
410
+ **Parameters:**
411
+ - `adUnitId`: The ad unit identifier
412
+ - `config`: Optional configuration object
413
+
414
+ **Usage:**
415
+ ```csharp
416
+ var configBuilder = new LevelPlayInterstitialAd.Config.Builder();
417
+ configBuilder.SetBidFloor(1.0); // Minimum bid price in USD
418
+ var config = configBuilder.Build();
419
+ LevelPlayInterstitialAd interstitialAd = new LevelPlayInterstitialAd("your_ad_unit_id", config);
420
+ ```
421
+
422
+ ### Configuration Builder
423
+
424
+ #### `LevelPlayInterstitialAd.Config.Builder()`
425
+ Create a configuration builder for interstitial ads.
426
+
427
+ **Returns:** `LevelPlayInterstitialAd.Config.Builder` object
428
+
429
+ **Usage:**
430
+ ```csharp
431
+ var configBuilder = new LevelPlayInterstitialAd.Config.Builder();
432
+ ```
433
+
434
+ **Set minimum bid price:**
435
+ ```csharp
436
+ configBuilder.SetBidFloor(1.0); // Minimum bid price in USD ($1.00 CPM)
437
+ ```
438
+
439
+ **When to use:** Set a minimum bid price in USD for ad requests.
440
+
441
+ #### `Build()`
442
+ Build the configuration object.
443
+
444
+ **Returns:** `LevelPlayInterstitialAd.Config` object
445
+
446
+ **Usage:**
447
+ ```csharp
448
+ var config = configBuilder.Build();
449
+ ```
450
+
451
+ ### Core Methods
452
+
453
+ #### `LoadAd()`
454
+ Load an interstitial ad.
455
+
456
+ **Usage:**
457
+ ```csharp
458
+ interstitialAd.LoadAd();
459
+ ```
460
+
461
+ **When to call:**
462
+ - After SDK initialization completes
463
+ - After showing an ad (to load the next one)
464
+ - After a load or display failure
465
+
466
+ #### `ShowAd()`
467
+ Show the interstitial ad without a placement name.
468
+
469
+ **Usage:**
470
+ ```csharp
471
+ if (interstitialAd.IsAdReady())
472
+ {
473
+ interstitialAd.ShowAd();
474
+ }
475
+ ```
476
+
477
+ **Important:** Always check `IsAdReady()` before calling `ShowAd()`.
478
+
479
+ #### `ShowAd(placementName: string)`
480
+ Show the interstitial ad with a named placement for analytics tracking.
481
+
482
+ **Parameters:**
483
+ - `placementName`: Placement name configured in LevelPlay dashboard
484
+
485
+ **Usage:**
486
+ ```csharp
487
+ interstitialAd.ShowAd(placementName: "level_complete");
488
+ ```
489
+
490
+ **When to use:** When tracking multiple placements within the same ad unit for analytics.
491
+
492
+ #### `IsAdReady()`
493
+ Check if an interstitial ad is loaded and ready to show.
494
+
495
+ **Returns:** `bool` - true if ready, false otherwise
496
+
497
+ **Usage:**
498
+ ```csharp
499
+ if (interstitialAd.IsAdReady())
500
+ {
501
+ // Ad is ready to show
502
+ interstitialAd.ShowAd();
503
+ }
504
+ else
505
+ {
506
+ // Ad not ready, load it
507
+ interstitialAd.LoadAd();
508
+ }
509
+ ```
510
+
511
+ #### `LevelPlayInterstitialAd.IsPlacementCapped(string placementName)` (Static)
512
+ Check if a placement has reached its capping limit.
513
+
514
+ **Parameters:**
515
+ - `placementName`: The placement name to check
516
+
517
+ **Returns:** `bool` - true if capped, false otherwise
518
+
519
+ **Usage:**
520
+ ```csharp
521
+ if (LevelPlayInterstitialAd.IsPlacementCapped("level_complete"))
522
+ {
523
+ Debug.Log("Level complete placement is capped");
524
+ }
525
+ ```
526
+
527
+ **When to use:** Before showing an ad to check if the placement frequency cap is reached.
528
+
529
+ ### Events
530
+
531
+ All events are properties of the `LevelPlayInterstitialAd` object.
532
+
533
+ **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.
534
+
535
+ #### `OnAdLoaded`
536
+ Fired when an interstitial ad is successfully loaded.
537
+
538
+ **Signature:** `event Action<LevelPlayAdInfo>`
539
+
540
+ **Usage:**
541
+ ```csharp
542
+ interstitialAd.OnAdLoaded += (adInfo) =>
543
+ {
544
+ Debug.Log("Interstitial ad loaded");
545
+ };
546
+ ```
547
+
548
+ #### `OnAdLoadFailed`
549
+ Fired when an interstitial ad fails to load.
550
+
551
+ **Signature:** `event Action<LevelPlayAdError>`
552
+
553
+ **Usage:**
554
+ ```csharp
555
+ interstitialAd.OnAdLoadFailed += (error) =>
556
+ {
557
+ Debug.LogWarning($"Load failed: {error.ErrorMessage}");
558
+ };
559
+ ```
560
+
561
+ **Best practice:** Implement retry logic with exponential backoff.
562
+
563
+ #### `OnAdDisplayed`
564
+ Fired when an interstitial ad is displayed on screen.
565
+
566
+ **Signature:** `event Action<LevelPlayAdInfo>`
567
+
568
+ **Usage:**
569
+ ```csharp
570
+ interstitialAd.OnAdDisplayed += (adInfo) =>
571
+ {
572
+ Debug.Log("Interstitial ad displayed");
573
+ // Optional: Track analytics
574
+ };
575
+ ```
576
+
577
+ #### `OnAdDisplayFailed`
578
+ Fired when an interstitial ad fails to display.
579
+
580
+ **Signature:** `event Action<LevelPlayAdInfo, LevelPlayAdError>`
581
+
582
+ **Usage:**
583
+ ```csharp
584
+ interstitialAd.OnAdDisplayFailed += (adInfo, error) =>
585
+ {
586
+ Debug.LogError($"Display failed: {error.ErrorMessage}");
587
+ // Load a new ad
588
+ interstitialAd.LoadAd();
589
+ };
590
+ ```
591
+
592
+ #### `OnAdClicked`
593
+ Fired when the user clicks on the interstitial ad.
594
+
595
+ **Signature:** `event Action<LevelPlayAdInfo>`
596
+
597
+ **Usage:**
598
+ ```csharp
599
+ interstitialAd.OnAdClicked += (adInfo) =>
600
+ {
601
+ Debug.Log("Interstitial ad clicked");
602
+ // Optional analytics tracking
603
+ };
604
+ ```
605
+
606
+ #### `OnAdClosed`
607
+ Fired when the interstitial ad is closed.
608
+
609
+ **Signature:** `event Action<LevelPlayAdInfo>`
610
+
611
+ **Usage:**
612
+ ```csharp
613
+ interstitialAd.OnAdClosed += (adInfo) =>
614
+ {
615
+ Debug.Log("Interstitial ad closed");
616
+ // Resume game, load next ad
617
+ interstitialAd.LoadAd();
618
+ };
619
+ ```
620
+
621
+ **Best practice:** Load the next ad immediately in this callback.
622
+
623
+ #### `OnAdInfoChanged`
624
+ Fired when ad information changes, such as when a new winning ad becomes available after auction.
625
+
626
+ **Signature:** `event Action<LevelPlayAdInfo>`
627
+
628
+ **Usage:**
629
+ ```csharp
630
+ interstitialAd.OnAdInfoChanged += (adInfo) =>
631
+ {
632
+ Debug.Log($"Ad info changed - New ad from: {adInfo.AdNetwork}");
633
+ Debug.Log($"Estimated revenue: ${adInfo.Revenue}");
634
+ };
635
+ ```
636
+
637
+ **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.
638
+
639
+ **When it fires:**
640
+ - After a new ad loads with different properties than the previous one
641
+ - When the waterfall selects a different ad network
642
+ - When ad auction results change
643
+
644
+ **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.
645
+
646
+ **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.
647
+
648
+ ## Data Types
649
+
650
+ ### LevelPlayAdInfo
651
+
652
+ Contains information about the ad.
653
+
654
+ **Properties:**
655
+ - `AdId` (string): Unique identifier for this specific ad instance
656
+ - `AdUnitId` (string): The ad unit identifier
657
+ - `AdUnitName` (string): The ad unit name
658
+ - `AdSize` (LevelPlayAdSize): The ad size (may be null; banner-relevant)
659
+ - `AdFormat` (string): The ad format (e.g., "INTERSTITIAL")
660
+ - `PlacementName` (string): Placement name where ad was shown
661
+ - `AuctionId` (string): Unique auction identifier
662
+ - `CreativeId` (string): Creative identifier
663
+ - `Country` (string): User's country code (ISO 3166-1)
664
+ - `Ab` (string): A/B test segment identifier
665
+ - `SegmentName` (string): User segment name
666
+ - `AdNetwork` (string): Ad network that served the ad
667
+ - `InstanceName` (string): Ad network instance name
668
+ - `InstanceId` (string): Ad network instance identifier
669
+ - `Revenue` (double?): Estimated revenue in USD (nullable - check for null)
670
+ - `Precision` (string): Revenue precision level
671
+ - `EncryptedCPM` (string): Encrypted CPM value
672
+
673
+ ### LevelPlayAdError
674
+
675
+ Contains error information when ad operations fail.
676
+
677
+ **Properties:**
678
+ - `ErrorCode` (int): Numeric error code
679
+ - `ErrorMessage` (string): Human-readable error description
680
+ - `AdUnitId` (string): The ad unit identifier where the error occurred
681
+ - `AdId` (string): Unique identifier for the specific ad instance
682
+
683
+ ## Best Practices
684
+
685
+ ### Loading Strategy
686
+
687
+ **Keep an interstitial ready for opportunistic moments:**
688
+ ```csharp
689
+ // Load after init
690
+ void OnInitSuccess(LevelPlayConfiguration config)
691
+ {
692
+ interstitialAd = new LevelPlayInterstitialAd(adUnitId);
693
+ interstitialAd.OnAdLoaded += OnAdLoaded;
694
+ interstitialAd.OnAdClosed += OnAdClosed;
695
+ interstitialAd.LoadAd();
696
+ }
697
+
698
+ // Reload after showing
699
+ void OnAdClosed(LevelPlayAdInfo adInfo)
700
+ {
701
+ interstitialAd.LoadAd();
702
+ }
703
+ ```
704
+
705
+ ### Placement Strategy
706
+
707
+ **Show at natural transition points:**
708
+ - ✅ Level complete screen
709
+ - ✅ Game over screen
710
+ - ✅ Returning to main menu
711
+ - ✅ Between sessions
712
+ - ❌ During active gameplay
713
+ - ❌ Mid-level or mid-action
714
+
715
+ ### Frequency Capping
716
+
717
+ **Implement time-based capping to avoid annoying users:**
718
+ ```csharp
719
+ private float minTimeBetweenAds = 300f; // 5 minutes
720
+ private float lastAdTime = -999f;
721
+
722
+ public void TryShowInterstitial()
723
+ {
724
+ if (Time.time - lastAdTime < minTimeBetweenAds)
725
+ {
726
+ Debug.Log("Too soon to show another ad");
727
+ return;
728
+ }
729
+
730
+ if (interstitialAd.IsAdReady())
731
+ {
732
+ interstitialAd.ShowAd();
733
+ }
734
+ }
735
+
736
+ private void OnAdDisplayed(LevelPlayAdInfo adInfo)
737
+ {
738
+ lastAdTime = Time.time;
739
+ }
740
+ ```
741
+
742
+ **Recommended frequencies:**
743
+ - **Revenue-focused**: 3-5 minutes
744
+ - **Balanced**: 5-7 minutes
745
+ - **UX-focused**: 7-10 minutes or never
746
+
747
+ ### User Flow
748
+
749
+ **Never block user progress waiting for ads:**
750
+ ```csharp
751
+ // ✅ CORRECT - Don't block flow
752
+ public void OnLevelComplete()
753
+ {
754
+ // Continue to next level regardless of ad
755
+ LoadNextLevel();
756
+
757
+ // Try to show ad, but don't wait for it
758
+ TryShowInterstitial();
759
+ }
760
+
761
+ // ❌ WRONG - Blocking user
762
+ public void OnLevelComplete()
763
+ {
764
+ if (interstitialAd.IsAdReady())
765
+ {
766
+ interstitialAd.ShowAd();
767
+ // Don't wait here to load next level!
768
+ }
769
+ }
770
+ ```
771
+
772
+ ### Error Handling
773
+
774
+ **Handle ad load failures:**
775
+ ```csharp
776
+ private void OnAdLoadFailed(LevelPlayAdError error)
777
+ {
778
+ Debug.LogWarning($"Ad load failed: {error.ErrorMessage}");
779
+
780
+ // Retry loading after a delay
781
+ Invoke(nameof(RetryLoad), 30f);
782
+ }
783
+
784
+ private void RetryLoad()
785
+ {
786
+ interstitialAd.LoadAd();
787
+ }
788
+ ```
789
+
790
+ ### Memory Management
791
+
792
+ **Always unsubscribe from events:**
793
+ ```csharp
794
+ void OnDestroy()
795
+ {
796
+ if (interstitialAd != null)
797
+ {
798
+ interstitialAd.OnAdLoaded -= OnAdLoaded;
799
+ interstitialAd.OnAdLoadFailed -= OnAdLoadFailed;
800
+ interstitialAd.OnAdDisplayed -= OnAdDisplayed;
801
+ interstitialAd.OnAdDisplayFailed -= OnAdDisplayFailed;
802
+ interstitialAd.OnAdClicked -= OnAdClicked;
803
+ interstitialAd.OnAdClosed -= OnAdClosed;
804
+ interstitialAd.OnAdInfoChanged -= OnAdInfoChanged;
805
+
806
+ // Destroy the ad to free its native resources
807
+ interstitialAd.DestroyAd();
808
+ }
809
+ }
810
+ ```
811
+
812
+ ## Common Issues
813
+
814
+ ### Issue: Error 1037 (Load during load)
815
+
816
+ **Cause:** Calling `LoadAd()` repeatedly in `Update()` or other high-frequency loops before the previous load completes.
817
+
818
+ **Common mistake:**
819
+ ```csharp
820
+ void Update()
821
+ {
822
+ // WRONG - This will cause error 1037!
823
+ if (!interstitialAd.IsAdReady())
824
+ {
825
+ interstitialAd.LoadAd();
826
+ }
827
+ }
828
+ ```
829
+
830
+ **Why this fails:** If the ad is still loading, calling `LoadAd()` again triggers error 1037: "Cannot load an interstitial while another interstitial is loading."
831
+
832
+ **Solution:** Track load state manually and only call `LoadAd()` once:
833
+ ```csharp
834
+ private bool isLoadingAd = false;
835
+
836
+ void Start()
837
+ {
838
+ LoadInterstitialAd();
839
+ }
840
+
841
+ void LoadInterstitialAd()
842
+ {
843
+ if (isLoadingAd) return; // Prevent duplicate loads
844
+
845
+ isLoadingAd = true;
846
+ interstitialAd.LoadAd();
847
+ }
848
+
849
+ void OnAdLoaded(LevelPlayAdInfo adInfo)
850
+ {
851
+ isLoadingAd = false;
852
+ }
853
+
854
+ void OnAdLoadFailed(LevelPlayAdError error)
855
+ {
856
+ isLoadingAd = false;
857
+ // Optionally retry after delay
858
+ }
859
+ ```
860
+
861
+ ### Issue: Interstitial showing too frequently
862
+
863
+ **Solution:** Implement frequency capping based on time or session count. Track when the last ad was shown and enforce a minimum interval.
864
+
865
+ ### Issue: User flow blocked by ad loading
866
+
867
+ **Solution:** Never wait for ads to load or show before progressing the user. Load ads proactively and show them opportunistically.
868
+
869
+ ### Issue: Ad not loading
870
+
871
+ **Possible causes:**
872
+ - SDK not initialized before creating ad object
873
+ - No internet connection
874
+ - Ad inventory not available
875
+ - Incorrect ad unit ID
876
+
877
+ **Solutions:**
878
+ - Create ad object only after `OnInitSuccess` callback
879
+ - Check network connectivity
880
+ - Verify ad unit ID in LevelPlay dashboard
881
+ - Test on real device with good connection
882
+
883
+ ### Issue: Ad loading but not showing
884
+
885
+ **Possible causes:**
886
+ - Not checking `IsAdReady()` before calling `ShowAd()`
887
+ - Ad expired (loaded too long ago)
888
+
889
+ **Solutions:**
890
+ - Always check `IsAdReady()` before showing
891
+ - Load ads close to when they'll be shown (within a few minutes)
892
+
893
+ ## Testing Checklist
894
+
895
+ - [ ] Ad loads successfully after SDK initialization
896
+ - [ ] `IsAdReady()` returns true when ad is loaded
897
+ - [ ] Ad displays correctly when `ShowAd()` is called
898
+ - [ ] Ad shows at appropriate transition points only
899
+ - [ ] Frequency capping works as expected
900
+ - [ ] User can progress regardless of ad status
901
+ - [ ] Ad reloads automatically after being shown
902
+ - [ ] Retry logic works when ad fails to load
903
+ - [ ] Multiple placements track correctly (if using)
904
+ - [ ] Placement capping works (if configured)
905
+ - [ ] Memory leaks prevented (events unsubscribed)
906
+ - [ ] Tested on multiple devices and network conditions
907
+ - [ ] Ad doesn't interrupt active gameplay