@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.
- package/CHANGELOG.md +53 -0
- package/LICENSE-UNITY-COMPANION.md +122 -0
- package/LICENSE.md +31 -0
- package/NOTICE.md +90 -0
- package/README.md +273 -2
- package/cordis.patch.yml +22 -0
- package/docs/design.md +297 -0
- package/icon.svg +16 -0
- package/lib/frontmatter.js +392 -0
- package/lib/gating.js +105 -0
- package/lib/harness.js +16 -0
- package/lib/index.js +171 -0
- package/lib/project.js +210 -0
- package/lib/registry.js +268 -0
- package/lib/requirements.js +214 -0
- package/lib/skills.js +191 -0
- package/lib/types/frontmatter.d.ts +84 -0
- package/lib/types/gating.d.ts +80 -0
- package/lib/types/harness.d.ts +152 -0
- package/lib/types/index.d.ts +75 -0
- package/lib/types/project.d.ts +93 -0
- package/lib/types/registry.d.ts +96 -0
- package/lib/types/requirements.d.ts +67 -0
- package/lib/types/skills.d.ts +54 -0
- package/lib/types/watch.d.ts +34 -0
- package/lib/watch.js +84 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +70 -4
- package/skills/2d-pixel-perfect/SKILL.md +208 -0
- package/skills/2d-pixel-perfect/references/api-reference.md +81 -0
- package/skills/2d-pixel-perfect/references/camera-setup-builtin.cs +40 -0
- package/skills/2d-pixel-perfect/references/camera-setup-urp.cs +49 -0
- package/skills/2d-pixel-perfect/references/pipeline-detection.cs +50 -0
- package/skills/2d-pixel-perfect/references/sprite-settings.cs +37 -0
- package/skills/asset-transformer-toolkit/SECURITY.md +15 -0
- package/skills/asset-transformer-toolkit/SKILL.md +39 -0
- package/skills/asset-transformer-toolkit/references/create-importer.md +121 -0
- package/skills/asset-transformer-toolkit/references/lods.md +61 -0
- package/skills/asset-transformer-toolkit/references/rule-api.md +154 -0
- package/skills/asset-transformer-toolkit/references/ruleblock-api.md +37 -0
- package/skills/asset-transformer-toolkit/references/ruleset-api.md +138 -0
- package/skills/asset-transformer-toolkit/references/rulesets-and-actions.md +227 -0
- package/skills/audio-setup-mixers/SECURITY.md +16 -0
- package/skills/audio-setup-mixers/SKILL.md +127 -0
- package/skills/audio-setup-mixers/references/api.md +162 -0
- package/skills/build-gtk/SECURITY.md +16 -0
- package/skills/build-gtk/SKILL.md +200 -0
- package/skills/build-gtk/references/api-reference.md +33 -0
- package/skills/build-gtk/references/graph-api-gaps.md +96 -0
- package/skills/build-gtk/references/runtime-and-visualization.md +191 -0
- package/skills/build-gtk/references/state-machine-api.md +270 -0
- package/skills/build-gtk/references/where-the-docs-stop.md +49 -0
- package/skills/build-live-game/SKILL.md +159 -0
- package/skills/build-live-game/references/achievements.md +757 -0
- package/skills/build-live-game/references/apis.md +271 -0
- package/skills/build-live-game/references/authentication.md +431 -0
- package/skills/build-live-game/references/battlepass.md +904 -0
- package/skills/build-live-game/references/blueprints-and-samples.md +75 -0
- package/skills/build-live-game/references/cloud-code-cloudbehaviours.md +1111 -0
- package/skills/build-live-game/references/cloud-code-modules.md +1276 -0
- package/skills/build-live-game/references/cloud-code.md +58 -0
- package/skills/build-live-game/references/cloud-save.md +464 -0
- package/skills/build-live-game/references/deployment.md +231 -0
- package/skills/build-live-game/references/orientation.md +30 -0
- package/skills/build-live-game/references/player-account.md +821 -0
- package/skills/build-live-game/references/remote-config.md +96 -0
- package/skills/build-live-game/references/services-overview.md +76 -0
- package/skills/build-live-game/references/tooling.md +375 -0
- package/skills/build-live-game/references/ugs-cli.md +86 -0
- package/skills/craft-game-floors/SECURITY.md +23 -0
- package/skills/craft-game-floors/SKILL.md +134 -0
- package/skills/craft-game-floors/references/art-direction.md +85 -0
- package/skills/craft-game-floors/references/camera-rigs.md +51 -0
- package/skills/craft-game-floors/references/character-motion.md +35 -0
- package/skills/craft-game-floors/references/game-audio.md +47 -0
- package/skills/craft-game-floors/references/game-feel.md +68 -0
- package/skills/craft-game-floors/references/game-shell.md +45 -0
- package/skills/craft-game-floors/references/live-floor.md +35 -0
- package/skills/craft-game-floors/references/placeholder-assets.md +35 -0
- package/skills/craft-game-floors/references/scene-lighting.md +52 -0
- package/skills/craft-game-floors/references/toon-shading.md +34 -0
- package/skills/craft-game-floors/references/vfx.md +40 -0
- package/skills/craft-game-floors/references/visual-scorecard.md +43 -0
- package/skills/create-2d-physics/SECURITY.md +16 -0
- package/skills/create-2d-physics/SKILL.md +128 -0
- package/skills/create-2d-physics/references/2d-physics-core.md +155 -0
- package/skills/create-2d-physics/references/legacy-2d-physics.md +45 -0
- package/skills/create-tile-palette-or-rule-tiles/SKILL.md +95 -0
- package/skills/create-tile-palette-or-rule-tiles/references/hexagonalruletile.md +71 -0
- package/skills/create-tile-palette-or-rule-tiles/references/palette-create.md +38 -0
- package/skills/create-tile-palette-or-rule-tiles/references/ruletile-createempty.md +37 -0
- package/skills/create-tile-palette-or-rule-tiles/references/ruletile-createfromsegment.md +219 -0
- package/skills/create-tile-palette-or-rule-tiles/references/ruletile.md +95 -0
- package/skills/create-tile-palette-or-rule-tiles/scripts/CreatePaletteTemplate.cs +148 -0
- package/skills/create-tile-palette-or-rule-tiles/scripts/ManualWorkflowExample.cs +63 -0
- package/skills/create-tile-palette-or-rule-tiles/scripts/RuleTileGenerator.cs +61 -0
- package/skills/create-tile-palette-or-rule-tiles/scripts/TilemapRuleTileCreateFromSegment.cs +225 -0
- package/skills/fix-3d-physics-collisions/SECURITY.md +17 -0
- package/skills/fix-3d-physics-collisions/SKILL.md +139 -0
- package/skills/fix-3d-physics-collisions/references/collision-checklist.md +80 -0
- package/skills/fix-3d-physics-collisions/references/collision-debugger.md +18 -0
- package/skills/fix-3d-physics-collisions/references/console-errors-table.md +9 -0
- package/skills/fix-3d-physics-collisions/references/kinematic-trigger-facts.md +18 -0
- package/skills/fix-3d-physics-collisions/references/other-symptoms.md +29 -0
- package/skills/fix-3d-physics-collisions/references/raycast-checklist.md +8 -0
- package/skills/fix-3d-physics-collisions/references/topic-map.md +42 -0
- package/skills/fix-3d-physics-collisions/references/trigger-checklist.md +9 -0
- package/skills/fix-3d-physics-collisions/scripts/CollisionDebugger.cs +561 -0
- package/skills/generate-editor-search-query/SECURITY.md +17 -0
- package/skills/generate-editor-search-query/SKILL.md +117 -0
- package/skills/generate-editor-search-query/references/open-search-window.md +70 -0
- package/skills/generate-editor-search-query/references/query-patterns.md +124 -0
- package/skills/implement-in-app-purchases/SKILL.md +82 -0
- package/skills/implement-in-app-purchases/references/api-details.md +41 -0
- package/skills/implement-in-app-purchases/references/api-notes.md +105 -0
- package/skills/implement-in-app-purchases/references/codeless-catalog.md +197 -0
- package/skills/implement-in-app-purchases/references/convert-adapty.md +270 -0
- package/skills/implement-in-app-purchases/references/convert-essentialkit.md +239 -0
- package/skills/implement-in-app-purchases/references/convert-revenuecat.md +277 -0
- package/skills/implement-in-app-purchases/references/convert-unipay.md +145 -0
- package/skills/implement-in-app-purchases/references/migration-v4-to-v5.md +46 -0
- package/skills/implement-in-app-purchases/references/path-add-iap-to-new-project.md +197 -0
- package/skills/implement-in-app-purchases/references/path-convert-native-google-billing.md +302 -0
- package/skills/implement-in-app-purchases/references/path-convert-native-storekit.md +357 -0
- package/skills/implement-in-app-purchases/references/path-implement-iap-d2c.md +253 -0
- package/skills/implement-in-app-purchases/references/platform-notes.md +55 -0
- package/skills/implement-in-app-purchases/references/pre-check.md +207 -0
- package/skills/implement-in-app-purchases/references/topic-map.md +46 -0
- package/skills/initialize-ai-navigation/SKILL.md +109 -0
- package/skills/initialize-ai-navigation/references/navigation-system.md +793 -0
- package/skills/initialize-ai-navigation/references/topic-map.md +66 -0
- package/skills/levelplay-unity-integration/SKILL.md +122 -0
- package/skills/levelplay-unity-integration/references/adding-more-ad-formats.md +15 -0
- package/skills/levelplay-unity-integration/references/banner-api.md +927 -0
- package/skills/levelplay-unity-integration/references/best-practices.md +604 -0
- package/skills/levelplay-unity-integration/references/dependency-resolution.md +94 -0
- package/skills/levelplay-unity-integration/references/examples.md +10 -0
- package/skills/levelplay-unity-integration/references/ilrd-api.md +337 -0
- package/skills/levelplay-unity-integration/references/initialization-api.md +851 -0
- package/skills/levelplay-unity-integration/references/interstitial-api.md +907 -0
- package/skills/levelplay-unity-integration/references/ios-setup.md +463 -0
- package/skills/levelplay-unity-integration/references/migration-sdk-9.md +666 -0
- package/skills/levelplay-unity-integration/references/privacy-settings.md +593 -0
- package/skills/levelplay-unity-integration/references/production-release-checklist.md +22 -0
- package/skills/levelplay-unity-integration/references/rewarded-api.md +918 -0
- package/skills/levelplay-unity-integration/references/step-0-new-or-migration.md +8 -0
- package/skills/levelplay-unity-integration/references/step-1-verify-environment.md +4 -0
- package/skills/levelplay-unity-integration/references/step-10-testing.md +15 -0
- package/skills/levelplay-unity-integration/references/step-2-business-goals.md +12 -0
- package/skills/levelplay-unity-integration/references/step-3-install-sdk.md +55 -0
- package/skills/levelplay-unity-integration/references/step-4-native-dependencies.md +22 -0
- package/skills/levelplay-unity-integration/references/step-5-app-key-and-ad-units.md +18 -0
- package/skills/levelplay-unity-integration/references/step-6-5-privacy-and-regulation.md +51 -0
- package/skills/levelplay-unity-integration/references/step-6-admob-keys.md +16 -0
- package/skills/levelplay-unity-integration/references/step-7-initialize.md +50 -0
- package/skills/levelplay-unity-integration/references/step-8-ad-unit-strategy.md +16 -0
- package/skills/levelplay-unity-integration/references/step-9-implement-ad-units.md +66 -0
- package/skills/levelplay-unity-integration/references/testing-and-validation.md +222 -0
- package/skills/levelplay-unity-integration/references/troubleshooting.md +99 -0
- package/skills/localize-unity-project/SKILL.md +159 -0
- package/skills/localize-unity-project/references/api-notes.md +15 -0
- package/skills/localize-unity-project/references/cjk-fonts.md +83 -0
- package/skills/localize-unity-project/references/docs-map.md +42 -0
- package/skills/localize-unity-project/references/documentation-lookup.md +33 -0
- package/skills/localize-unity-project/references/locale-switching.md +17 -0
- package/skills/localize-unity-project/references/table-completeness-check.md +47 -0
- package/skills/localize-unity-project/references/translating-existing-project.md +47 -0
- package/skills/localize-unity-project/references/translation-strategy.md +41 -0
- package/skills/localize-unity-project/references/troubleshooting.md +12 -0
- package/skills/localize-unity-project/scripts/L10nBatchProcessor.cs +191 -0
- package/skills/localize-unity-project/scripts/LocalizedFontAsset.cs +18 -0
- package/skills/manage-sprite-atlas/SKILL.md +202 -0
- package/skills/manage-sprite-atlas/references/addressables-delivery.md +58 -0
- package/skills/manage-sprite-atlas/references/advanced-manual-authoring.md +19 -0
- package/skills/manage-sprite-atlas/references/api.md +382 -0
- package/skills/manage-sprite-atlas/references/best-practices.md +183 -0
- package/skills/manage-sprite-atlas/references/common-errors.md +123 -0
- package/skills/manage-sprite-atlas/references/complete-workflow.md +61 -0
- package/skills/manage-sprite-atlas/references/custom-packing.md +147 -0
- package/skills/manage-sprite-atlas/references/delivery-mechanism.md +30 -0
- package/skills/manage-sprite-atlas/references/key-requirements.md +21 -0
- package/skills/manage-sprite-atlas/references/manual-authoring.md +39 -0
- package/skills/manage-sprite-atlas/references/namespaces.md +15 -0
- package/skills/manage-sprite-atlas/references/v2-architecture.md +21 -0
- package/skills/manage-sprite-atlas/resources/authoringvsruntime.cs +176 -0
- package/skills/manage-sprite-atlas/resources/buildaddressablespostprocess.cs +59 -0
- package/skills/manage-sprite-atlas/resources/cacheloadedatlases.cs +145 -0
- package/skills/manage-sprite-atlas/resources/cleanupbatchoperations.cs +119 -0
- package/skills/manage-sprite-atlas/resources/createandconfiguremasteratlas.cs +57 -0
- package/skills/manage-sprite-atlas/resources/custompackersetup.cs +88 -0
- package/skills/manage-sprite-atlas/resources/deprecatedmethods.cs +142 -0
- package/skills/manage-sprite-atlas/resources/dontmodifywithoutsaving.cs +120 -0
- package/skills/manage-sprite-atlas/resources/dontpackinruntimebuilds.cs +190 -0
- package/skills/manage-sprite-atlas/resources/dontscriptspriteatlasineditor.cs +114 -0
- package/skills/manage-sprite-atlas/resources/editorconfiguration.cs +95 -0
- package/skills/manage-sprite-atlas/resources/enablespritepacking.cs +172 -0
- package/skills/manage-sprite-atlas/resources/gridspritepacker.cs +50 -0
- package/skills/manage-sprite-atlas/resources/handlelatebinding.cs +147 -0
- package/skills/manage-sprite-atlas/resources/handlenullcases.cs +141 -0
- package/skills/manage-sprite-atlas/resources/migratev1tov2.cs +335 -0
- package/skills/manage-sprite-atlas/resources/multipagepacker.cs +80 -0
- package/skills/manage-sprite-atlas/resources/optimizetexturesettings.cs +191 -0
- package/skills/manage-sprite-atlas/resources/packerdebugging.cs +158 -0
- package/skills/manage-sprite-atlas/resources/packtransform.cs +51 -0
- package/skills/manage-sprite-atlas/resources/platformnames.cs +127 -0
- package/skills/manage-sprite-atlas/resources/queryspritesefficiently.cs +222 -0
- package/skills/manage-sprite-atlas/resources/registercallbacks.cs +152 -0
- package/skills/manage-sprite-atlas/resources/runtimeatlasloader.cs +15 -0
- package/skills/manage-sprite-atlas/resources/runtimespriteaccess.cs +19 -0
- package/skills/manage-sprite-atlas/resources/savespriteatlasasset.cs +107 -0
- package/skills/manage-sprite-atlas/resources/scriptablepacker.cs +81 -0
- package/skills/manage-sprite-atlas/resources/setincludeinbuild.cs +164 -0
- package/skills/manage-sprite-atlas/resources/sizeoptimizedpacker.cs +88 -0
- package/skills/manage-sprite-atlas/resources/spriteatlaslatebinding.cs +123 -0
- package/skills/manage-sprite-atlas/resources/spriteatlasprebuildgenerator.cs +219 -0
- package/skills/manage-sprite-atlas/resources/spritedata.cs +35 -0
- package/skills/manage-sprite-atlas/resources/spritepack.cs +39 -0
- package/skills/manage-sprite-atlas/resources/texturedata.cs +15 -0
- package/skills/manage-sprite-atlas/resources/updatebuildscripts.cs +357 -0
- package/skills/manage-sprite-atlas/resources/updatesettingsconfiguration.cs +135 -0
- package/skills/manage-sprite-atlas/resources/usevariantswisely.cs +179 -0
- package/skills/manage-sprite-atlas/resources/variantatlas.cs +39 -0
- package/skills/migrate-birp-to-urp/SECURITY.md +16 -0
- package/skills/migrate-birp-to-urp/SKILL.md +167 -0
- package/skills/migrate-birp-to-urp/references/capturing-the-editor.md +66 -0
- package/skills/migrate-birp-to-urp/references/complex-shader-situations.md +272 -0
- package/skills/migrate-birp-to-urp/references/conversion-and-rendering-triage.md +113 -0
- package/skills/migrate-birp-to-urp/references/custom-shader-triage.md +123 -0
- package/skills/migrate-birp-to-urp/references/implementation-patterns.md +529 -0
- package/skills/migrate-birp-to-urp/references/migration-workflow.md +265 -0
- package/skills/migrate-birp-to-urp/references/parity-validation-and-troubleshooting.md +114 -0
- package/skills/migrate-birp-to-urp/references/preflight-and-urp-setup.md +195 -0
- package/skills/migrate-birp-to-urp/references/quality-settings-map.md +69 -0
- package/skills/new-unity-project/SECURITY.md +26 -0
- package/skills/new-unity-project/SKILL.md +171 -0
- package/skills/new-unity-project/references/checklist.md +18 -0
- package/skills/new-unity-project/references/common-mistakes.md +15 -0
- package/skills/new-unity-project/references/skill-setup.md +66 -0
- package/skills/new-unity-project/references/step-1-concept.md +13 -0
- package/skills/new-unity-project/references/step-2-platforms-and-create.md +31 -0
- package/skills/new-unity-project/references/step-3-join-and-reconcile.md +16 -0
- package/skills/new-unity-project/references/step-4-source-control.md +9 -0
- package/skills/new-unity-project/references/step-5-packages.md +18 -0
- package/skills/new-unity-project/references/step-6-identity-and-floors.md +20 -0
- package/skills/new-unity-project/references/step-7-visual-baseline.md +75 -0
- package/skills/new-unity-project/references/step-8-first-commit.md +21 -0
- package/skills/new-unity-project/references/step-9-handoff.md +23 -0
- package/skills/optimize-audio/SECURITY.md +16 -0
- package/skills/optimize-audio/SKILL.md +120 -0
- package/skills/optimize-audio/references/diagnostics.md +42 -0
- package/skills/optimize-audio/references/troubleshooting.md +41 -0
- package/skills/optimize-audio/resources/audio-import-api.md +149 -0
- package/skills/optimize-audio/resources/platform-settings.md +48 -0
- package/skills/optimize-text-mesh-pro/SKILL.md +181 -0
- package/skills/optimize-text-mesh-pro/references/dynamic-atlas-and-profiling.md +28 -0
- package/skills/optimize-text-mesh-pro/references/topic-map.md +36 -0
- package/skills/optimize-web/SECURITY.md +16 -0
- package/skills/optimize-web/SKILL.md +157 -0
- package/skills/optimize-web/references/editor-csharp.md +120 -0
- package/skills/optimize-web/references/topic-map.md +49 -0
- package/skills/optimize-web/references/troubleshooting.md +45 -0
- package/skills/optimize-web/references/understand-request.md +19 -0
- package/skills/optimize-web/references/web-assets-quality.md +59 -0
- package/skills/optimize-web/references/web-player-settings.md +39 -0
- package/skills/optimize-web/references/web-profiling-memory.md +71 -0
- package/skills/optimize-web/scripts/WebOptimizer.cs +46 -0
- package/skills/optimize-web/scripts/toktx-examples.sh +11 -0
- package/skills/setup-multiplayer-services/SKILL.md +36 -0
- package/skills/setup-multiplayer-services/references/dgs-entrypoint.md +79 -0
- package/skills/setup-multiplayer-services/references/entrypoints.md +213 -0
- package/skills/setup-multiplayer-services/references/examples.md +33 -0
- package/skills/setup-multiplayer-services/references/implementation-fit.md +30 -0
- package/skills/setup-multiplayer-services/references/underlying-services.md +11 -0
- package/skills/setup-multiplayer-services/references/workflows-prerequisites.md +17 -0
- package/skills/setup-vivox-voice-chat/SECURITY.md +16 -0
- package/skills/setup-vivox-voice-chat/SKILL.md +166 -0
- package/skills/setup-vivox-voice-chat/references/api-reference-lookup.md +28 -0
- package/skills/setup-vivox-voice-chat/references/docs-topic-map.md +13 -0
- package/skills/setup-vivox-voice-chat/references/events-and-participants.md +79 -0
- package/skills/setup-vivox-voice-chat/references/init-and-login.md +92 -0
- package/skills/setup-vivox-voice-chat/references/text-chat.md +93 -0
- package/skills/setup-vivox-voice-chat/references/troubleshooting.md +47 -0
- package/skills/setup-vivox-voice-chat/references/voice-channels.md +92 -0
- package/skills/shader-graph-create-custom-node/SKILL.md +25 -0
- package/skills/shader-graph-create-custom-node/resources/all_hints.hlsl +182 -0
- package/skills/sprite-editor/SECURITY.md +16 -0
- package/skills/sprite-editor/SKILL.md +66 -0
- package/skills/sprite-editor/references/api_reference.md +151 -0
- package/skills/sprite-editor/references/background.md +112 -0
- package/skills/sprite-editor/references/templates.md +72 -0
- package/skills/sprite-editor/scripts/AutomaticSliceTexture.cs +40 -0
- package/skills/sprite-editor/scripts/GenerateNewSpriteRects.cs +200 -0
- package/skills/sprite-editor/scripts/GetTextureSourceImageSize.cs +32 -0
- package/skills/sprite-editor/scripts/GetTextureToSlice.cs +55 -0
- package/skills/sprite-editor/scripts/GridSliceTexture.cs +40 -0
- package/skills/sprite-editor/scripts/IsometricSliceTexture.cs +141 -0
- package/skills/sprite-editor/scripts/README.md +134 -0
- package/skills/sprite-editor/scripts/SetPivotExample.cs +58 -0
- package/skills/sprite-editor/scripts/SpriteToPng.cs +88 -0
- package/skills/sprite-segment-3x3grid/SKILL.md +177 -0
- package/skills/sprite-segment-3x3grid/references/topic-map.md +37 -0
- package/skills/sprite-segment-3x3grid/scripts/SpriteGridAnalysis.cs +119 -0
- package/skills/ui/SKILL.md +142 -0
- package/skills/ui-imgui/SKILL.md +180 -0
- package/skills/ui-imgui/references/gui-elements.md +156 -0
- package/skills/ui-imgui/references/templates.md +141 -0
- package/skills/ui-ugui/SKILL.md +217 -0
- package/skills/ui-ugui/references/layout-and-anchors.md +61 -0
- package/skills/ui-ugui/references/scrollview-setup.md +29 -0
- package/skills/ui-uitk/SKILL.md +229 -0
- package/skills/ui-uitk/references/common-issues.md +74 -0
- package/skills/ui-uitk/references/custom-elements.md +241 -0
- package/skills/ui-uitk/references/painter2d.md +282 -0
- package/skills/ui-uitk/references/pointermanipulator-guide.md +94 -0
- package/skills/ui-uitk/references/svg-icons.md +136 -0
- package/skills/ui-uitk/references/ui-runtime-binding.md +234 -0
- package/skills/ui-uitk/references/uss-guide.md +138 -0
- package/skills/unity-cli/CHANGELOG.md +524 -0
- package/skills/unity-cli/SECURITY.md +68 -0
- package/skills/unity-cli/SKILL.md +160 -0
- package/skills/unity-cli/references/auth-license-cloud.md +318 -0
- package/skills/unity-cli/references/bootstrap-project.md +177 -0
- package/skills/unity-cli/references/build-run-test.md +555 -0
- package/skills/unity-cli/references/catalog-plugins.md +86 -0
- package/skills/unity-cli/references/ci-recipes.md +76 -0
- package/skills/unity-cli/references/cloud-automation.md +819 -0
- package/skills/unity-cli/references/cloud-workflows.md +19 -0
- package/skills/unity-cli/references/collaboration.md +533 -0
- package/skills/unity-cli/references/config-hub.md +239 -0
- package/skills/unity-cli/references/diagnostics-maintenance.md +718 -0
- package/skills/unity-cli/references/docs-workflow.md +179 -0
- package/skills/unity-cli/references/editor-targeting.md +29 -0
- package/skills/unity-cli/references/editors-install.md +490 -0
- package/skills/unity-cli/references/environment-variables.md +42 -0
- package/skills/unity-cli/references/exit-codes.md +47 -0
- package/skills/unity-cli/references/global-flags.md +32 -0
- package/skills/unity-cli/references/integration-advanced.md +1130 -0
- package/skills/unity-cli/references/notes.md +20 -0
- package/skills/unity-cli/references/notifications.md +39 -0
- package/skills/unity-cli/references/playmode-verification-loop.md +279 -0
- package/skills/unity-cli/references/projects-templates.md +997 -0
- package/skills/unity-cli/references/scene-editing-preflight.md +25 -0
- package/skills/unity-cli/references/setup-and-help.md +54 -0
- package/skills/unity-cli/references/version-control.md +612 -0
- package/skills/unity-package-management/SKILL.md +169 -0
- package/skills/unity-package-management/references/discovering-packages.md +66 -0
- package/skills/unity-package-management/references/headless-run.md +31 -0
- package/skills/unity-package-management/references/installer-script.md +92 -0
- package/skills/unity-package-management/references/select-packages.md +126 -0
- package/skills/unity-pipeline/SECURITY.md +17 -0
- package/skills/unity-pipeline/SKILL.md +205 -0
- package/skills/unity-pipeline/references/csharp-eval.md +23 -0
- package/skills/unity-pipeline/references/multiplayer-play-mode.md +103 -0
- package/skills/urp-postprocessing/SECURITY.md +16 -0
- package/skills/urp-postprocessing/SKILL.md +188 -0
- package/skills/urp-postprocessing/references/code-templates.md +150 -0
- package/skills/urp-postprocessing/references/effect-reference.md +86 -0
- package/skills/validate-urp-render-graph-renderer-feature/SKILL.md +92 -0
- package/skills/validate-urp-render-graph-renderer-feature/references/validation-checklist.md +179 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# 0. New Integration or Migration?
|
|
2
|
+
|
|
3
|
+
Ask: "Are you starting a new LevelPlay integration, migrating an existing one (from an older SDK version or from Unity Ads), or troubleshooting an existing setup?"
|
|
4
|
+
|
|
5
|
+
- **New integration**: proceed to Step 1.
|
|
6
|
+
- **Migration** (SDK upgrade, replacing IronSource.Agent APIs, migrating from Unity Ads, or fixing a Maven Central Android build failure): Read `references/migration-sdk-9.md`. Ask which of the five scenarios applies — A = SDK upgrade, B = init API migration, C = ad unit API migration, D = Maven Central build failure, E = Unity Ads migration — then follow the matching scenario. After applying all code changes, work through the Migration Completeness Checklist (section C5 of the reference) — it catches requirements that a line-by-line translation misses because the legacy code had no equivalent line. Then ask the user to check the Unity console for compilation errors, and fix any that appear before presenting results. Do not block or keep retrying if you cannot see the console: list the files you changed, say what to look for, and continue.
|
|
7
|
+
- **Troubleshooting or adding to an existing setup** (ATT, GDPR, ILRD, Test Suite, build errors on a fresh integration, or adding a feature to an already-working integration): Identify what the user needs and go directly to the relevant step or reference from "When to Read Detailed References."
|
|
8
|
+
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# 1. Verify Unity Environment
|
|
2
|
+
|
|
3
|
+
Check that the user is working in a Unity project by verifying Assets/ and ProjectSettings/ directories exist. If not in a Unity project, instruct the user to navigate to their Unity project directory. If those directories are not found but the user believes they are in the right place, ask: "It looks like you may not be at your project root — can you navigate to the top-level folder of your Unity project and confirm you can see Assets/ and ProjectSettings/ there?"
|
|
4
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# 10. Testing and Validation
|
|
2
|
+
|
|
3
|
+
LevelPlay provides two validation approaches for different stages of development. **Full detail — setup, callback-behavior tables, the Test Suite initializer template, and the iOS coroutine placement — is in `references/testing-and-validation.md`. Read it when the user is testing.**
|
|
4
|
+
|
|
5
|
+
**Early Development: Mock Ads in Unity Editor.** For rapid iteration and callback testing. Pressing Play in the Editor provides mock ads automatically — but **only if the active build target is Android or iOS** (Standalone/PC/Mac returns no ads; this is the most common "no ads in Editor" cause — see Step 4). Mock ads work with any App Key/Ad Unit ID, but recommend real credentials so they aren't forgotten. Mock ads fire most callbacks (OnAdLoaded/Displayed/Rewarded/Closed) but NOT failure, click, or impression/ILRD callbacks — so test error handling on device. Details and the full callback table: `references/testing-and-validation.md`.
|
|
6
|
+
|
|
7
|
+
**Integration Validation: LevelPlay Test Suite (Recommended).** The primary method for comprehensive validation against real ad networks on device. Key rules that must not change:
|
|
8
|
+
- `LevelPlay.SetMetaData("is_test_suite", "enable");` **before** `LevelPlay.Init()`
|
|
9
|
+
- `LevelPlay.LaunchTestSuite();` inside `OnInitSuccess`
|
|
10
|
+
- **Requires a device build** (does not work in the Editor); enable **Development Build** so SDK logs are visible; use the production App Key.
|
|
11
|
+
- **Remove both lines before production release.**
|
|
12
|
+
- iOS coroutine initializer: put `SetMetaData` as the first line inside `InitializeLevelPlay()` before `Init` (not in `Start()`).
|
|
13
|
+
|
|
14
|
+
Add the two lines to the existing `LevelPlayInitializer.cs` (don't create a new file). The full setup, the standalone template for users without an initializer, and the testing workflow are in `references/testing-and-validation.md`.
|
|
15
|
+
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# 2. Understand Business Goals
|
|
2
|
+
|
|
3
|
+
Before implementing ad units, determine the user's optimization priorities to recommend the appropriate ad unit strategy. Ask:
|
|
4
|
+
|
|
5
|
+
**"What's your primary optimization goal?"**
|
|
6
|
+
- **Revenue-focused**: Maximize ad revenue and impression opportunities
|
|
7
|
+
- **UX-focused**: Prioritize gameplay flow and user satisfaction
|
|
8
|
+
- **Balanced**: Optimize for both revenue and UX
|
|
9
|
+
- **Not sure yet**: Default to Balanced and proceed. At Step 8, briefly note you're using Balanced since they were unsure, and invite them to indicate a different preference now that they've seen the format options.
|
|
10
|
+
|
|
11
|
+
Record this answer for later strategy recommendation in Step 8.
|
|
12
|
+
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# 3. Install LevelPlay SDK via UPM
|
|
2
|
+
|
|
3
|
+
**If the SDK looks already installed:** do not take that on trust, and do not ask the user to read
|
|
4
|
+
the Package Manager window for you. Read `Packages/packages-lock.json` and look for
|
|
5
|
+
`com.unity.services.levelplay`. If it is there, say which version resolved and proceed to Step 4.
|
|
6
|
+
If it is not, it is not installed, whatever the conversation so far has assumed: continue with the
|
|
7
|
+
install below.
|
|
8
|
+
|
|
9
|
+
Guide through installing the LevelPlay Unity package using Unity Package Manager:
|
|
10
|
+
|
|
11
|
+
1. Open Unity → Window > Package Manager
|
|
12
|
+
2. Select Unity Registry dropdown or Services tab
|
|
13
|
+
3. In the Package Manager search bar, type **Ads Mediation**
|
|
14
|
+
4. Confirm the package name matches exactly: the correct package is titled **Ads Mediation**. Do not install either of these packages:
|
|
15
|
+
- **Ads IAP Mediation Adaptor** (a separate in-app purchases package, not the LevelPlay SDK)
|
|
16
|
+
- **Advertisement Legacy** (a deprecated package, not compatible with the current LevelPlay integration)
|
|
17
|
+
5. Click Install button
|
|
18
|
+
6. Wait for package to download and import
|
|
19
|
+
|
|
20
|
+
When you install the package, you may see a prompt to install Mobile Dependency Resolver — click **Import** if it appears. This is covered in more detail in the next step.
|
|
21
|
+
|
|
22
|
+
**Then verify it resolved, by reading the project rather than by asking.** The package id is
|
|
23
|
+
`com.unity.services.levelplay` (its Package Manager display name is **Ads Mediation**; the id is
|
|
24
|
+
what the project files record). Check both files:
|
|
25
|
+
|
|
26
|
+
- **`Packages/manifest.json`** lists what the project *asks for*. `com.unity.services.levelplay`
|
|
27
|
+
must appear under `dependencies`.
|
|
28
|
+
- **`Packages/packages-lock.json`** records what Unity actually *resolved*. The same id must appear
|
|
29
|
+
here too, with a concrete version. This is the file that answers "did it install", and it is the
|
|
30
|
+
one to trust.
|
|
31
|
+
|
|
32
|
+
Both are plain JSON in the project, so this check needs no Editor, no CLI, and nothing from the
|
|
33
|
+
user. Read them.
|
|
34
|
+
|
|
35
|
+
> **This is a hard gate, not a formality.** Do not write, generate, or paste a single line of
|
|
36
|
+
> LevelPlay code until `com.unity.services.levelplay` is present in `packages-lock.json`. Skipping
|
|
37
|
+
> ahead produces code that looks correct, compiles nowhere, and fails with `CS0246` on every
|
|
38
|
+
> LevelPlay symbol. If the id is missing from `manifest.json`, the install never happened. If it is
|
|
39
|
+
> in `manifest.json` but not `packages-lock.json`, Unity has not resolved it yet: the Editor may
|
|
40
|
+
> still be importing, or resolution failed. Say which of the two you found, and stop.
|
|
41
|
+
>
|
|
42
|
+
> **If you added the id to `manifest.json` yourself and no Editor has run since, the lock file will
|
|
43
|
+
> not show it yet. That is expected, not a failure.** Never write the entry into
|
|
44
|
+
> `packages-lock.json` yourself: that file is Unity's resolution output, hand-editing it is what the
|
|
45
|
+
> migration guide forbids, and an entry you wrote is a false "resolved" signal rather than a passed
|
|
46
|
+
> gate. Ask the user to open the Unity Editor so resolution runs, then re-read the file. If no
|
|
47
|
+
> Editor is available at all, say so and stop there rather than manufacturing the evidence.
|
|
48
|
+
|
|
49
|
+
Report the resolved version you found. Do not report "installed" on the strength of the Package
|
|
50
|
+
Manager window, a previous turn, or a user's recollection.
|
|
51
|
+
|
|
52
|
+
**Network Manager:** Access **Ads Mediation > Network Manager** at any time to install additional ad network adapters and check for SDK and adapter updates.
|
|
53
|
+
|
|
54
|
+
For iOS builds, note that SKAdNetwork configuration will be needed later (reference `references/ios-setup.md` when ready for iOS builds).
|
|
55
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# 4. Resolve Native Dependencies (Critical)
|
|
2
|
+
|
|
3
|
+
**Critical for Android/iOS builds**: LevelPlay requires native dependency resolution. Without this, code compiles in Unity Editor but fails during platform builds with gradle (Android) or CocoaPods (iOS) errors.
|
|
4
|
+
|
|
5
|
+
**Platform checkpoint — ask before proceeding:** "Which platform(s) are you targeting — iOS, Android, or both?" Record this. It determines which dependency resolution steps apply here, whether ATT is required (Step 6.5), and which testing steps are relevant (Step 10).
|
|
6
|
+
|
|
7
|
+
**Set the active build target now.** Switch the project's active build target to Android or iOS via **File ▸ Build Profiles** (called **Build Settings** before Unity 6) → **Switch Platform**. This is required before any testing: LevelPlay only runs on Android/iOS targets, so even mock ads in the Editor (Step 10) do nothing while the target is Standalone/PC/Mac.
|
|
8
|
+
|
|
9
|
+
**Resolve dependencies for the target platform(s).** LevelPlay requires native Android/iOS libraries that Unity's package manager alone doesn't handle; a dependency manager (MDR, UEDM, or EDM4U) bridges this gap. The full procedure — checking for an existing dependency manager, resolving on Android vs iOS, installing one if the user has none, verification, and the older-version Custom Main Gradle Template — is in **`references/dependency-resolution.md`**. Walk the user through it now, and **if targeting both Android and iOS, complete resolution for both before proceeding.**
|
|
10
|
+
|
|
11
|
+
Ask: "Have you run dependency resolution for your target platform(s) without errors?"
|
|
12
|
+
|
|
13
|
+
**Android API 33+ (Android 13+):** declare the AD_ID permission in AndroidManifest.xml:
|
|
14
|
+
|
|
15
|
+
```xml
|
|
16
|
+
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Without it, advertising ID access fails on Android 13+ devices. Details in `references/dependency-resolution.md`.
|
|
20
|
+
|
|
21
|
+
**If dependency resolution fails**, see `references/troubleshooting.md` for gradle and CocoaPods error guidance.
|
|
22
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# 5. Get App Key and Ad Unit IDs
|
|
2
|
+
|
|
3
|
+
Before initializing LevelPlay, collect credentials from the LevelPlay dashboard.
|
|
4
|
+
|
|
5
|
+
**Dashboard:** https://platform.ironsrc.com/
|
|
6
|
+
|
|
7
|
+
**New to LevelPlay?** Set up your app and ad units first:
|
|
8
|
+
- [Add your app](https://docs.unity.com/en-us/grow/levelplay/platform/get-started/add-app)
|
|
9
|
+
- [Create ad units](https://docs.unity.com/en-us/grow/levelplay/platform/get-started/ad-units)
|
|
10
|
+
|
|
11
|
+
**App Key:** In the dashboard, go to **Apps** in the left sidenav → find your app → copy the alphanumeric string displayed under the app title.
|
|
12
|
+
|
|
13
|
+
**Ad Unit IDs:** Go to **Ad units** in the left sidenav → select your app → copy the ID for each format you plan to implement (Rewarded, Interstitial, Banner).
|
|
14
|
+
|
|
15
|
+
**Note:** You need your App Key now for initialization (Step 7). Ad Unit IDs are only needed at Step 9 — if you haven't decided which ad formats to implement yet, just copy your App Key for now and return here after Step 8.
|
|
16
|
+
|
|
17
|
+
Keep both accessible — you'll need them in the next steps.
|
|
18
|
+
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# 6.5. Privacy & Regulation Settings (If Required)
|
|
2
|
+
|
|
3
|
+
> **Note:** This skill provides technical integration guidance, including for LevelPlay's privacy APIs. It is not legal advice, and it does not determine which laws apply to your app — that depends on your users, your data practices, and your distribution. Consult your own legal counsel, and refer to [Regulation Advanced Settings for Unity](https://docs.unity.com/en-us/grow/levelplay/sdk/unity/regulation-advanced-settings) for the authoritative LevelPlay documentation.
|
|
4
|
+
|
|
5
|
+
Ask the user: "Do you need to configure privacy settings for GDPR, CCPA/CPRA (or certain state privacy consumer acts), or for child-directed apps?"
|
|
6
|
+
|
|
7
|
+
**If YES to any:**
|
|
8
|
+
|
|
9
|
+
Privacy settings must be configured **BEFORE** SDK initialization. See `references/privacy-settings.md` for the complete implementation guide (UI, consent management, combined regulations, and the full network key list).
|
|
10
|
+
|
|
11
|
+
**GDPR — the correct API depends on the user's SDK version** (check in **Ads Mediation > Network Manager**):
|
|
12
|
+
|
|
13
|
+
**SDK 9.5.0+** — global consent boolean:
|
|
14
|
+
```csharp
|
|
15
|
+
using Unity.Services.LevelPlay;
|
|
16
|
+
|
|
17
|
+
// true = user has granted consent, false = user has not consented
|
|
18
|
+
LevelPlayPrivacySettings.SetGDPRConsent(true);
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**SDK 9.4.x** — per-network consent dictionary (this is the CURRENT API on 9.4.x, not legacy — it only becomes `[Obsolete]` on 9.5.0+; do not mislabel it as deprecated):
|
|
22
|
+
```csharp
|
|
23
|
+
using Unity.Services.LevelPlay;
|
|
24
|
+
using System.Collections.Generic;
|
|
25
|
+
|
|
26
|
+
// Add an entry for each ad network you have installed
|
|
27
|
+
LevelPlayPrivacySettings.SetGDPRConsents(new Dictionary<string, bool> {
|
|
28
|
+
{ "UnityAds", true },
|
|
29
|
+
{ "IronSource", true }
|
|
30
|
+
// See references/privacy-settings.md for the full network key list
|
|
31
|
+
});
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
If neither API compiles, your Unity package/SDK may be below 9.4.0 (legacy) — recommend upgrading via **Ads Mediation > Network Manager**. If the user cannot upgrade, the legacy `LevelPlay.SetConsent(bool)` API is documented in `references/privacy-settings.md`.
|
|
35
|
+
|
|
36
|
+
**CCPA (SDK 9.4.0+):**
|
|
37
|
+
```csharp
|
|
38
|
+
LevelPlayPrivacySettings.SetCCPA(true); // User opted out of data sale
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**COPPA (SDK 9.4.0+):**
|
|
42
|
+
```csharp
|
|
43
|
+
LevelPlayPrivacySettings.SetCOPPA(true); // Child-directed app
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
If CCPA or COPPA fails to compile, upgrade your Unity package/SDK via **Ads Mediation > Network Manager**. Call all of these BEFORE `LevelPlay.Init()` in Step 7.
|
|
47
|
+
|
|
48
|
+
**For iOS builds — required regardless of privacy regulations above:** Also implement App Tracking Transparency (ATT) before proceeding to Step 7. Apple requires ATT authorization before your app tracks users or accesses the device's advertising identifier on iOS 14.5+. Request ATT authorization before calling `LevelPlay.Init()` — this is both an Apple platform requirement and necessary for personalized ads (which also affects fill rate). See `references/ios-setup.md` for the ATT implementation code.
|
|
49
|
+
|
|
50
|
+
**If NO privacy regulations and not targeting iOS:** Skip this step and proceed to Step 7.
|
|
51
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# 6. Configure AdMob Keys (If Using AdMob Network)
|
|
2
|
+
|
|
3
|
+
**When to use**: Only if using AdMob as a mediation network adapter in LevelPlay.
|
|
4
|
+
|
|
5
|
+
If using AdMob, configure platform-specific app keys in Unity Editor:
|
|
6
|
+
|
|
7
|
+
**Access**: Ads Mediation > Developer Settings > LevelPlay Mediation Settings
|
|
8
|
+
|
|
9
|
+
**Configuration:**
|
|
10
|
+
- **Android App Key**: AdMob Android app key
|
|
11
|
+
- **iOS App Key**: AdMob iOS app key
|
|
12
|
+
|
|
13
|
+
This configuration is required for AdMob to work as a mediation network in LevelPlay.
|
|
14
|
+
|
|
15
|
+
**Troubleshooting**: If you don't see the 'Ads Mediation' menu in Unity Editor, verify the Ads Mediation package is installed (Step 3) and restart Unity Editor.
|
|
16
|
+
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# 7. Initialize LevelPlay SDK
|
|
2
|
+
|
|
3
|
+
**Installation checkpoint:**
|
|
4
|
+
|
|
5
|
+
**First, re-read `Packages/packages-lock.json` and confirm `com.unity.services.levelplay` is there.**
|
|
6
|
+
Do this every time you reach this point, even if Step 3 already passed earlier in the conversation.
|
|
7
|
+
It costs one file read, and it is the only item here you can settle without the user. An earlier
|
|
8
|
+
turn saying the package was installed is not evidence that it is: this check exists because the
|
|
9
|
+
install step is the one most often skipped, and the resulting code fails with `CS0246` on every
|
|
10
|
+
LevelPlay symbol. If the id is absent, go back to Step 3 and do not write initialization code.
|
|
11
|
+
|
|
12
|
+
Then confirm the remaining prerequisites with the user, which are the ones no file can answer.
|
|
13
|
+
**If the user confirmed they are not using AdMob, omit the Step 6 item.** If Step 4 was already
|
|
14
|
+
confirmed in this conversation, skip that item and ask only about Step 5 and Step 6 (if AdMob).
|
|
15
|
+
|
|
16
|
+
"Please confirm these are working correctly:
|
|
17
|
+
- Step 4: Have you run dependency resolution for your target platform(s) without errors?
|
|
18
|
+
- Step 5: Do you have your App Key copied from the LevelPlay dashboard?
|
|
19
|
+
- Step 6 (only if using AdMob): Have you configured AdMob keys in Unity Editor settings?
|
|
20
|
+
|
|
21
|
+
Verify these are working before proceeding."
|
|
22
|
+
|
|
23
|
+
**If the package check failed or they answer NO or are unsure:**
|
|
24
|
+
- Package id absent from `packages-lock.json`: code will show `CS0246` namespace errors → Direct to Step 3. This one you established yourself; do not ask the user to overrule it.
|
|
25
|
+
- Missing Step 4: Code compiles but Android/iOS builds will fail → Direct to Step 4
|
|
26
|
+
- Missing Step 5: They won't have credentials to initialize → Direct to Step 5
|
|
27
|
+
- Do not provide C# code until they confirm all steps are complete
|
|
28
|
+
|
|
29
|
+
**If they answer YES:**
|
|
30
|
+
- **Optional — Analytics: ILRD Wiring.** Ask this question verbatim — do not summarize or rephrase it: "Do you use an analytics or attribution platform (Firebase, AppsFlyer, Adjust, Singular, or custom backend) that needs ad revenue data? If yes, the init script will include a logging stub for Impression Level Revenue (ILRD) — 3 lines of code, no analytics platform setup required yet. (Yes / No / Not sure — defaults to yes)" Record the answer.
|
|
31
|
+
- Proceed with initialization code.
|
|
32
|
+
|
|
33
|
+
LevelPlay SDK must be initialized before loading or showing any ads. Initialization should happen early in the application lifecycle.
|
|
34
|
+
|
|
35
|
+
**Ask how they want to handle initialization. Present all four options exactly as listed — do not condense or omit any:**
|
|
36
|
+
1. Create a new dedicated script for LevelPlay initialization
|
|
37
|
+
2. Add to an existing initialization/manager script they already have
|
|
38
|
+
3. Create a new LevelPlay script that your existing manager references
|
|
39
|
+
4. Just show me the initialization code — I'll decide how to integrate it
|
|
40
|
+
|
|
41
|
+
**Full code for each option is in `references/initialization-api.md` (Code Organization Options).** Behavior that must not change:
|
|
42
|
+
- **Option 1 (new script):** If ATT was set up in Step 6.5 (iOS), use the `LevelPlayInitializer.cs` from `references/ios-setup.md` Part 3 (the `IEnumerator Start()` coroutine variant) instead of the plain template.
|
|
43
|
+
- **Option 4 (just the code):** provide the complete Option 1 initialization class as a standalone snippet — do NOT create files or add Inspector/GameObject setup steps — with the note: "save it as `LevelPlayInitializer.cs`, attach it to a persistent GameObject in your first scene, and set the App Key field in the Inspector."
|
|
44
|
+
|
|
45
|
+
**ILRD wiring (if the user answered Yes or Not Sure).** The correct approach depends on the SDK version (check in **Ads Mediation > Network Manager**):
|
|
46
|
+
- **SDK 9.5.0+ (current):** add nothing to the initializer — ILRD is delivered per ad instance via `OnAdImpressionDataReady`, wired when each ad is created in Step 9. The global `LevelPlay.OnImpressionDataReady` event is **deprecated on 9.5.0+ and generates a compiler warning** — do not use it.
|
|
47
|
+
- **SDK 9.4.x and earlier:** subscribe to the global `LevelPlay.OnImpressionDataReady` event **before** `LevelPlay.Init()`, add a logging stub, and unsubscribe in `OnDestroy()`. On the iOS coroutine initializer, place the subscription inside `InitializeLevelPlay()` immediately before `LevelPlay.Init(appKey)`.
|
|
48
|
+
|
|
49
|
+
The exact wiring code for each option (including the iOS coroutine placement) is in `references/initialization-api.md` (Version-Aware ILRD Init Wiring). ILRD callbacks do not fire with mock ads — a device build is needed to verify (see Step 10). For advanced options (user ID, segmentation, consent management), see `references/initialization-api.md`.
|
|
50
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# 8. Recommend Ad Unit Strategy
|
|
2
|
+
|
|
3
|
+
Based on the optimization goal identified in Step 2, recommend an ad unit strategy.
|
|
4
|
+
|
|
5
|
+
**Recall the user's optimization goal from Step 2.** If the conversation has been long or the answer is unclear, confirm: "Earlier you mentioned your optimization goal. To confirm, are you primarily focused on revenue, user experience, or a balance of both?"
|
|
6
|
+
|
|
7
|
+
**Map the answer to a strategy** and give a brief recommendation (full detail, benchmarks, and placement guidance are in `references/best-practices.md` under "Ad Format Strategy by Goal"):
|
|
8
|
+
|
|
9
|
+
- **Revenue-focused** → **Revenue Strategy.** Rewarded (primary monetization, multiple high-value moments) → Interstitial (secondary; at transitions; frequency cap 3–5 min) → Banner (persistent during gameplay). Bid floors are an optional revenue lever configured in Step 9. Implementation priority: **Rewarded → Interstitial → Banner**.
|
|
10
|
+
- **UX-focused** → **UX Strategy.** Rewarded only, user-initiated (explicit opt-in), high-value rewards, **no forced ads, ever**. Interstitials optional/sparingly at session boundaries only; banners generally avoided or menu-only. Implementation priority: **Rewarded only, or Rewarded → (optional) Interstitial**.
|
|
11
|
+
- **Balanced** → **Balanced Strategy.** Rewarded (2–3 strategic placements) → Interstitial (moderate; natural breakpoints; frequency cap 5–7 min) → Banner (selective; menus/low-attention). Implementation priority: **Rewarded → Interstitial → Banner (selective)**.
|
|
12
|
+
- **"Not sure yet"** (from Step 2) → use the **Balanced Strategy**, then add: "Since you weren't sure of your goal earlier, I've gone with the Balanced approach — if you'd prefer to lean more toward revenue or user experience now that you've seen the options, just say so."
|
|
13
|
+
- If still unclear, ask: "Would you prioritize revenue, user experience, or a balance of both?"
|
|
14
|
+
|
|
15
|
+
The next step asks which ad formats to implement from this priority list. If the user wants a different order than recommended, accommodate that preference.
|
|
16
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# 9. Implement Ad Units
|
|
2
|
+
|
|
3
|
+
**Read `references/best-practices.md` first** — its "Code Generation Guidelines (Step 9)" section carries the general ad lifecycle, the per-organization-approach code-gen rules, the always-include requirements (MonoBehaviour, `DestroyAd()` in `OnDestroy()`, the placement-capping show-path check (when placements are used), event unsubscription, null checks, error handling), and the bid-floor wiring examples. Incorporate those patterns into all ad implementations.
|
|
4
|
+
|
|
5
|
+
**Implementation checkpoint:**
|
|
6
|
+
|
|
7
|
+
"Before providing ad implementation code, please confirm:
|
|
8
|
+
- Did you complete SDK initialization in Step 7?
|
|
9
|
+
- Did you receive the 'LevelPlay SDK initialized successfully' log message in your Unity console?
|
|
10
|
+
|
|
11
|
+
Verify initialization is working before proceeding with ad units."
|
|
12
|
+
|
|
13
|
+
**If they answer NO or are unsure:** direct back to Step 7 and do not provide ad implementation code until initialization is confirmed working.
|
|
14
|
+
|
|
15
|
+
**Ad format checkpoint — ask before generating any code:** "Which ad formats do you want to implement? Rewarded, Interstitial, Banner, or a combination?" Only implement the formats the user selects. They can add more formats later using the 'Adding More Ad Formats Later' section.
|
|
16
|
+
|
|
17
|
+
**First, ask the user how they want to organize the ad code. Do not generate any code until they have answered:**
|
|
18
|
+
|
|
19
|
+
"How would you like to structure your ad implementation?"
|
|
20
|
+
|
|
21
|
+
1. **Separate manager scripts for each ad format** - Create individual scripts like `RewardedAdManager.cs`, `InterstitialAdManager.cs`, `BannerAdManager.cs` (good for larger projects, clear separation of concerns)
|
|
22
|
+
|
|
23
|
+
2. **One unified AdManager script** - Create a single `AdManager.cs` that handles all ad formats (simpler, everything in one place)
|
|
24
|
+
|
|
25
|
+
3. **Just show me the code snippets** - Provide implementation code without wrapping it in specific files, so you can integrate it however you prefer
|
|
26
|
+
|
|
27
|
+
4. **I already have ad manager code** - Review and help fix/update existing implementation
|
|
28
|
+
|
|
29
|
+
Based on their answer, adapt your response accordingly (see the code-gen guidelines in `references/best-practices.md`).
|
|
30
|
+
|
|
31
|
+
**If the user already has ad code (e.g., an existing manager script), ask to see it before generating any** — so you can provide targeted fixes rather than new code from scratch. This applies regardless of which organization option they picked (Option 4 is specifically for reviewing existing code, but the same "show me your code first" applies whenever the user mentions they already have some).
|
|
32
|
+
|
|
33
|
+
**Then present the optional bid floor feature (skip for Option 4 — review existing code instead):**
|
|
34
|
+
|
|
35
|
+
Present bid floor ranges only for the formats the user is implementing in this session. Reference starting ranges: Rewarded: $0.50–$2.00 | Interstitial: $0.20–$1.00 | Banner: $0.05–$0.20. Include only the ranges for formats being implemented.
|
|
36
|
+
|
|
37
|
+
"**Optional — Advanced: Bid Floors**
|
|
38
|
+
|
|
39
|
+
Most publishers skip this initially and add it once they have real dashboard data. You can safely skip now and return to it later.
|
|
40
|
+
|
|
41
|
+
If you'd like to set bid floors now: a bid floor sets a minimum bid price (USD) per ad unit — it raises your average eCPM at the cost of lower fill rate. Starting ranges:
|
|
42
|
+
[ranges for formats being implemented]
|
|
43
|
+
|
|
44
|
+
Reply with values per format, or just say 'skip' — you can add them any time."
|
|
45
|
+
|
|
46
|
+
**Record the answer per format.** Wire `Config.Builder().SetBidFloor(...)` into the ad construction for any format where a value was provided; formats marked 'skip' use the basic constructor (see the bid-floor examples in `references/best-practices.md`).
|
|
47
|
+
|
|
48
|
+
**If they choose Option 4 (existing code):**
|
|
49
|
+
- Ask: "Please share your existing ad manager code for review" and wait for it.
|
|
50
|
+
- Analyze the implementation: whether they use the current LevelPlay Ad Unit API (LevelPlayRewardedAd, LevelPlayInterstitialAd, LevelPlayBannerAd), whether they use **deprecated IronSource.Agent APIs**, proper callback registration/unsubscription, and missing error handling or memory leaks.
|
|
51
|
+
- Provide specific guidance:
|
|
52
|
+
- If using deprecated APIs: "You're using the old IronSource.Agent API. Here's how to migrate to the new LevelPlay Ad Unit API:" (full migration detail in `references/migration-sdk-9.md` — Scenario B for init, Scenario C per ad format including the C5 completeness checklist)
|
|
53
|
+
- If using current APIs with issues: "Your implementation looks good but I noticed [specific issues]. Here's how to fix them:"
|
|
54
|
+
- If implementation is correct: "Your implementation looks solid. Which additional ad formats would you like to add?"
|
|
55
|
+
- Offer fixes as code snippets or suggest refactoring. When adding new formats after review, present the bid floor prompt scoped to those new formats only, confirm whether to match their existing organization pattern or use a new one, then follow the same guidelines as Options 1–3.
|
|
56
|
+
|
|
57
|
+
For each ad format, follow the implementation guidelines in the detailed references:
|
|
58
|
+
|
|
59
|
+
- **Rewarded ads**: See `references/rewarded-api.md`
|
|
60
|
+
- **Interstitial ads**: See `references/interstitial-api.md`
|
|
61
|
+
- **Banner ads**: See `references/banner-api.md`
|
|
62
|
+
|
|
63
|
+
**Impression Level Revenue Tracking (version-aware):** See `references/ilrd-api.md` to forward impression data to the analytics platform (Firebase, AppsFlyer, Adjust, Singular, or custom backend).
|
|
64
|
+
- **SDK 9.5.0+ (current):** subscribe to each ad object's `OnAdImpressionDataReady` event right after you create it (and unsubscribe in `OnDestroy()`). Add this to every ad manager you generate — it is the correct ILRD path in 9.5.0+.
|
|
65
|
+
- **SDK 9.4.x and earlier:** ILRD uses the single global `LevelPlay.OnImpressionDataReady` event, wired in the init script (Step 7). If the user answered Yes/Not Sure in Step 7, it is already wired. If they said "No" and want it now, subscribe to `LevelPlay.OnImpressionDataReady` **before** the existing `LevelPlay.Init()` call.
|
|
66
|
+
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# LevelPlay Testing and Validation
|
|
2
|
+
|
|
3
|
+
Detailed guidance for the two validation approaches referenced from Step 10 of SKILL.md: mock ads in
|
|
4
|
+
the Unity Editor (early development) and the LevelPlay Test Suite (integration validation on device).
|
|
5
|
+
Read this when the user is testing their integration, asks how mock ads work, or is setting up the
|
|
6
|
+
Test Suite.
|
|
7
|
+
|
|
8
|
+
## Contents
|
|
9
|
+
- [Early Development: Mock Ads in Unity Editor](#early-development-mock-ads-in-unity-editor)
|
|
10
|
+
- [Mock Ad Callback Behavior](#mock-ad-callback-behavior)
|
|
11
|
+
- [Mock Ads Limitations](#mock-ads-limitations)
|
|
12
|
+
- [Integration Validation: LevelPlay Test Suite](#integration-validation-levelplay-test-suite)
|
|
13
|
+
- [Test Suite Setup](#test-suite-setup)
|
|
14
|
+
- [Test Suite Initializer Template](#test-suite-initializer-template)
|
|
15
|
+
- [Testing Workflow](#testing-workflow)
|
|
16
|
+
|
|
17
|
+
## Early Development: Mock Ads in Unity Editor
|
|
18
|
+
|
|
19
|
+
For early iteration and callback testing, use **mock ads** in Unity Editor. When you press Play in the
|
|
20
|
+
Editor, Unity provides mock ads automatically — but only if the active build target is Android or iOS
|
|
21
|
+
(see the requirement below).
|
|
22
|
+
|
|
23
|
+
> **Required: set the active build target to Android or iOS first.** Mock ads (and the LevelPlay SDK
|
|
24
|
+
generally) do **not** work while the active build target is Standalone/PC/Mac — which is the default
|
|
25
|
+
for new desktop projects. On a non-mobile target the SDK runs as an "unsupported platform" and returns
|
|
26
|
+
no ads, so `Init()` and ad loads will appear to do nothing in the Editor. Switch via **File ▸ Build
|
|
27
|
+
Profiles** (called **Build Settings** before Unity 6) → select **Android** or **iOS** → **Switch
|
|
28
|
+
Platform**, then press Play. If mock ads never appear in the Editor, this is the most likely cause.
|
|
29
|
+
|
|
30
|
+
**How it works:**
|
|
31
|
+
|
|
32
|
+
Once the build target is Android or iOS, pressing Play in the Editor provides mock ads automatically.
|
|
33
|
+
Mock ads work with ANY App Key and Ad Unit ID values (including dummy values like "test" or "editor").
|
|
34
|
+
However, **recommend using real App Key and real Ad Unit IDs** from the LevelPlay dashboard so you don't
|
|
35
|
+
forget to update them before building to device.
|
|
36
|
+
|
|
37
|
+
**Example setup (works in both Editor and device builds):**
|
|
38
|
+
|
|
39
|
+
The same initialization code you wrote in Step 7 works in both Editor (with mock ads) and device builds
|
|
40
|
+
(with real ads). For example:
|
|
41
|
+
|
|
42
|
+
```csharp
|
|
43
|
+
// Initialize with your actual App Key (replace "abc123..." with yours)
|
|
44
|
+
// Mock ads work with any value, but use your real key to avoid forgetting to update it later
|
|
45
|
+
LevelPlay.Init("abc123youractualappkey");
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Example for rewarded ads (works in both Editor and device):
|
|
49
|
+
```csharp
|
|
50
|
+
// In OnInitSuccess callback:
|
|
51
|
+
// Use your real ad unit ID from LevelPlay dashboard (replace "12345..." with yours)
|
|
52
|
+
// Mock ads work with any value, but use your real IDs to avoid forgetting to update them later
|
|
53
|
+
LevelPlayRewardedAd rewardedAd = new LevelPlayRewardedAd("12345youractualadunitid");
|
|
54
|
+
rewardedAd.OnAdLoaded += OnAdLoaded;
|
|
55
|
+
rewardedAd.OnAdRewarded += OnAdRewarded;
|
|
56
|
+
rewardedAd.LoadAd();
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Key points:**
|
|
60
|
+
- **Mock ads work with any App Key/Ad Unit ID values** (you can even use "test" or "editor")
|
|
61
|
+
- **Recommended: Use your real credentials** from Step 5 to avoid forgetting to update them later
|
|
62
|
+
- **Mock ads appear automatically** when testing in Unity Editor
|
|
63
|
+
- **Real ads appear automatically** when building to device
|
|
64
|
+
- **Same code works everywhere** - no switching or conditional compilation needed
|
|
65
|
+
- **Android API 33+**: If targeting Android 13+ devices, verify you've added the AD_ID permission to AndroidManifest.xml (see Step 4)
|
|
66
|
+
|
|
67
|
+
**What mock ads validate:**
|
|
68
|
+
- Ad integration flow works correctly
|
|
69
|
+
- Most callbacks fire as expected (see callback behavior below)
|
|
70
|
+
- Ad loading, showing, and closing logic
|
|
71
|
+
- Ad positioning and layout (for banners)
|
|
72
|
+
- Basic ad logic and state management
|
|
73
|
+
|
|
74
|
+
## Mock Ad Callback Behavior
|
|
75
|
+
|
|
76
|
+
Mock ads in Unity Editor fire most callbacks, but not all:
|
|
77
|
+
|
|
78
|
+
**Callbacks that FIRE:**
|
|
79
|
+
- `OnAdLoaded` - Always fires after LoadAd()
|
|
80
|
+
- `OnAdDisplayed` - Fires when ShowAd() is called
|
|
81
|
+
- `OnAdRewarded` - Fires for rewarded ads (with test reward)
|
|
82
|
+
- `OnAdClosed` - Fires when mock ad is dismissed
|
|
83
|
+
|
|
84
|
+
**Callbacks that DON'T fire:**
|
|
85
|
+
- `OnAdLoadFailed` - Mock ads always succeed loading
|
|
86
|
+
- `OnAdDisplayFailed` - Mock ads always succeed showing
|
|
87
|
+
- `OnAdClicked` - Mock ads don't simulate user clicks
|
|
88
|
+
- `OnAdExpanded` / `OnAdCollapsed` - Banner expand/collapse not simulated
|
|
89
|
+
- `OnAdLeftApplication` - No real ad redirect in Editor
|
|
90
|
+
- `OnAdInfoChanged` - Mock ads don't update ad info dynamically
|
|
91
|
+
- Impression data events (ILRD — `OnAdImpressionDataReady` on 9.5.0+, or `LevelPlay.OnImpressionDataReady` on 9.4.x and earlier) - No impression data generated in Editor
|
|
92
|
+
|
|
93
|
+
This means you can test your happy-path flow in Editor, but must test error handling on real devices.
|
|
94
|
+
|
|
95
|
+
**Note on SDK initialization in the Editor:** `LevelPlay.OnInitSuccess` may not fire in all SDK
|
|
96
|
+
configurations when running in the Unity Editor. If your initialization callback doesn't trigger and
|
|
97
|
+
your ad objects never load as a result, try creating them directly in `Start()` after calling
|
|
98
|
+
`LevelPlay.Init()` rather than waiting for the callback — mock ads will appear even without
|
|
99
|
+
`OnInitSuccess` firing.
|
|
100
|
+
|
|
101
|
+
## Mock Ads Limitations
|
|
102
|
+
- Don't simulate network latency or failures
|
|
103
|
+
- Don't test real ad network behavior
|
|
104
|
+
- Don't validate reward logic server-side
|
|
105
|
+
- Placeholder UI instead of real ad creatives
|
|
106
|
+
- Error callbacks never fire
|
|
107
|
+
|
|
108
|
+
**Best for**: Early development, rapid iteration on ad logic, callback testing
|
|
109
|
+
|
|
110
|
+
## Integration Validation: LevelPlay Test Suite
|
|
111
|
+
|
|
112
|
+
The **Test Suite** is the primary method for comprehensive validation. It tests your integration with
|
|
113
|
+
real ad networks on device.
|
|
114
|
+
|
|
115
|
+
**What Test Suite validates:**
|
|
116
|
+
- All ad formats (Rewarded, Interstitial, Banner) with real ads
|
|
117
|
+
- SDK initialization with production App Key
|
|
118
|
+
- All callbacks fire correctly in production environment
|
|
119
|
+
- Real ad network behavior, latency, and edge cases
|
|
120
|
+
- Ad rendering and user interaction flows
|
|
121
|
+
|
|
122
|
+
**Before running the Test Suite:**
|
|
123
|
+
- **Unity Ads is pre-installed** — the Ads Mediation package includes the Unity Ads adapter by default, so you have at least one network ready without any additional setup. For ads to fill on device, verify your LevelPlay dashboard has active instances configured for your ad units.
|
|
124
|
+
- **Enable Development Build** in **Build Profiles** (called **Build Settings** in Unity versions before Unity 6) before building to device. Without it, SDK console output won't be visible, making it very difficult to diagnose issues if something doesn't work as expected.
|
|
125
|
+
- **Expect an ATS warning on iOS.** Integration validation reports "App Transport Security settings MISSING" when the app uses the default ATS configuration, which is the recommended setup. Ignore it; don't add `NSAllowsArbitraryLoads` to make it go away. See [ios-setup.md](ios-setup.md#app-transport-security-ats-configuration).
|
|
126
|
+
|
|
127
|
+
## Test Suite Setup
|
|
128
|
+
|
|
129
|
+
**Setup (requires device build):**
|
|
130
|
+
|
|
131
|
+
Add these two lines to your existing `LevelPlayInitializer.cs` — do not create a new file or replace
|
|
132
|
+
your existing initializer:
|
|
133
|
+
|
|
134
|
+
1. Before `LevelPlay.Init(appKey)` — at the top of `Start()`:
|
|
135
|
+
```csharp
|
|
136
|
+
LevelPlay.SetMetaData("is_test_suite", "enable");
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
2. Inside your `OnInitSuccess` callback:
|
|
140
|
+
```csharp
|
|
141
|
+
LevelPlay.LaunchTestSuite();
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
> **iOS path (`references/ios-setup.md` Part 3 initializer):** `Start()` is a coroutine and
|
|
145
|
+
`LevelPlay.Init(appKey)` lives inside `InitializeLevelPlay()`, not `Start()`. Put
|
|
146
|
+
`LevelPlay.SetMetaData("is_test_suite", "enable");` as the **first line inside `InitializeLevelPlay()`,
|
|
147
|
+
before `LevelPlay.Init(appKey)`** — do NOT put it in `Start()` and do NOT put it after `Init`.
|
|
148
|
+
`LaunchTestSuite()` still goes in `OnInitSuccess`. `SetMetaData` must run before `Init` or the Test
|
|
149
|
+
Suite will silently never launch.
|
|
150
|
+
|
|
151
|
+
**Important**: Remove both lines before your production release. Test Suite should only be used during
|
|
152
|
+
development and testing.
|
|
153
|
+
|
|
154
|
+
## Test Suite Initializer Template
|
|
155
|
+
|
|
156
|
+
**Don't have a `LevelPlayInitializer.cs` yet?** Use this complete template:
|
|
157
|
+
|
|
158
|
+
```csharp
|
|
159
|
+
using UnityEngine;
|
|
160
|
+
using Unity.Services.LevelPlay;
|
|
161
|
+
|
|
162
|
+
public class LevelPlayInitializer : MonoBehaviour
|
|
163
|
+
{
|
|
164
|
+
[SerializeField] private string appKey;
|
|
165
|
+
|
|
166
|
+
void Awake()
|
|
167
|
+
{
|
|
168
|
+
DontDestroyOnLoad(gameObject);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
void Start()
|
|
172
|
+
{
|
|
173
|
+
// Enable Test Suite — REMOVE before production release
|
|
174
|
+
LevelPlay.SetMetaData("is_test_suite", "enable");
|
|
175
|
+
|
|
176
|
+
LevelPlay.OnInitSuccess += OnInitSuccess;
|
|
177
|
+
LevelPlay.OnInitFailed += OnInitFailed;
|
|
178
|
+
LevelPlay.Init(appKey);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
private void OnInitSuccess(LevelPlayConfiguration config)
|
|
182
|
+
{
|
|
183
|
+
Debug.Log("LevelPlay initialized successfully");
|
|
184
|
+
// Launch Test Suite — REMOVE before production release
|
|
185
|
+
LevelPlay.LaunchTestSuite();
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
private void OnInitFailed(LevelPlayInitError error)
|
|
189
|
+
{
|
|
190
|
+
Debug.LogError($"LevelPlay initialization failed: {error.ErrorMessage}");
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
void OnDestroy()
|
|
194
|
+
{
|
|
195
|
+
LevelPlay.OnInitSuccess -= OnInitSuccess;
|
|
196
|
+
LevelPlay.OnInitFailed -= OnInitFailed;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**After creating this script:**
|
|
202
|
+
1. Attach it to a GameObject in your first scene
|
|
203
|
+
2. In the Unity Inspector, find the "App Key" field
|
|
204
|
+
3. Paste your App Key from Step 5 into that field
|
|
205
|
+
|
|
206
|
+
**Key points:**
|
|
207
|
+
- `LevelPlay.SetMetaData("is_test_suite", "enable");` must be called **BEFORE** `LevelPlay.Init()` — if the Test Suite doesn't appear after launch, this is the most likely cause
|
|
208
|
+
- `LevelPlay.LaunchTestSuite();` is called **AFTER** successful initialization (in `OnInitSuccess`)
|
|
209
|
+
- **Requires device build** - Test Suite does not work in Unity Editor
|
|
210
|
+
- Use production App Key, not "editor"
|
|
211
|
+
- Build to Android or iOS device and run the app
|
|
212
|
+
- Test Suite UI will appear automatically after initialization
|
|
213
|
+
|
|
214
|
+
## Testing Workflow
|
|
215
|
+
1. Add Test Suite code (SetMetaData before Init, LaunchTestSuite after OnInitSuccess)
|
|
216
|
+
2. Build to Android or iOS device
|
|
217
|
+
3. Run the app on device
|
|
218
|
+
4. Test Suite UI launches automatically
|
|
219
|
+
5. Follow on-screen instructions to test each ad format
|
|
220
|
+
6. Verify all ad formats load and callbacks fire correctly
|
|
221
|
+
|
|
222
|
+
**Best for**: Integration validation before production, final testing with real ad networks
|