@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,604 @@
|
|
|
1
|
+
# LevelPlay Ad Unit Implementation Best Practices
|
|
2
|
+
|
|
3
|
+
## Contents
|
|
4
|
+
- [Overview](#overview)
|
|
5
|
+
- [Strategic Framework: Revenue vs UX Optimization](#strategic-framework-revenue-vs-ux-optimization)
|
|
6
|
+
- [Ad Format Strategy by Goal](#ad-format-strategy-by-goal)
|
|
7
|
+
- [Placement Strategy](#placement-strategy)
|
|
8
|
+
- [Implementation Patterns](#implementation-patterns)
|
|
9
|
+
- [Frequency Management](#frequency-management)
|
|
10
|
+
- [Error Handling and Graceful Degradation](#error-handling-and-graceful-degradation)
|
|
11
|
+
- [A/B Testing Considerations](#ab-testing-considerations)
|
|
12
|
+
- [Common Mistakes to Avoid](#common-mistakes-to-avoid)
|
|
13
|
+
- [Platform-Specific Considerations](#platform-specific-considerations)
|
|
14
|
+
- [Success Metrics by Strategy](#success-metrics-by-strategy)
|
|
15
|
+
- [Final Recommendations](#final-recommendations)
|
|
16
|
+
- [Code Generation Guidelines (Step 9)](#code-generation-guidelines-step-9)
|
|
17
|
+
|
|
18
|
+
## Overview
|
|
19
|
+
|
|
20
|
+
This reference compiles best practices from the LevelPlay enablement playbook, covering strategy selection, placement optimization, and common implementation patterns that drive both revenue and user satisfaction.
|
|
21
|
+
|
|
22
|
+
## Strategic Framework: Revenue vs UX Optimization
|
|
23
|
+
|
|
24
|
+
### Understanding the Trade-off
|
|
25
|
+
|
|
26
|
+
Every ad implementation involves a fundamental trade-off between revenue generation and user experience. Your optimization goal should guide every decision.
|
|
27
|
+
|
|
28
|
+
| Optimization Goal | Philosophy | Typical Outcome |
|
|
29
|
+
|-------------------|------------|-----------------|
|
|
30
|
+
| **Revenue-Focused** | Maximize impression opportunities | Higher revenue, potential UX impact |
|
|
31
|
+
| **UX-Focused** | Protect user experience at all costs | Better retention, lower short-term revenue |
|
|
32
|
+
| **Balanced** | Optimize for sustainable long-term value | Moderate revenue with good UX |
|
|
33
|
+
|
|
34
|
+
### Choosing Your Optimization Goal
|
|
35
|
+
|
|
36
|
+
**Ask yourself:**
|
|
37
|
+
1. What stage is your app in? (Early = UX focus, Mature = revenue optimization)
|
|
38
|
+
2. What's your business model? (Ads-only = revenue, Hybrid = balanced)
|
|
39
|
+
3. What's your competitive landscape? (High competition = UX focus)
|
|
40
|
+
4. What are your user expectations? (Casual games = more ads tolerated)
|
|
41
|
+
|
|
42
|
+
## Ad Format Strategy by Goal
|
|
43
|
+
|
|
44
|
+
### Revenue-Focused Implementation
|
|
45
|
+
|
|
46
|
+
**Goal**: Maximize ad revenue and impression opportunities
|
|
47
|
+
|
|
48
|
+
**Rewarded Ads** (Primary):
|
|
49
|
+
- Implement 3-5 placements across high-value moments
|
|
50
|
+
- Examples: Hints, extra lives, power-ups, bonus currency, skip levels
|
|
51
|
+
- Always keep a rewarded ad loaded and ready
|
|
52
|
+
- Reload immediately after showing
|
|
53
|
+
|
|
54
|
+
**Interstitial Ads** (Secondary):
|
|
55
|
+
- Show at every natural transition point
|
|
56
|
+
- Frequency cap: Every 3-5 minutes of active gameplay
|
|
57
|
+
- Placements: Level complete, game over, returning to menu
|
|
58
|
+
- Load proactively before transitions
|
|
59
|
+
|
|
60
|
+
**Banner Ads** (Tertiary):
|
|
61
|
+
- Show persistently during gameplay
|
|
62
|
+
- Position: Bottom (less intrusive than top)
|
|
63
|
+
- Keep loaded throughout session for continuous impressions
|
|
64
|
+
- Accept some visual clutter for revenue
|
|
65
|
+
|
|
66
|
+
**Expected Outcomes:** *(Industry benchmarks, not LevelPlay-specific)*
|
|
67
|
+
- ✅ 30-50% higher ad revenue
|
|
68
|
+
- ⚠ 5-15% increase in early abandonment
|
|
69
|
+
- ⚠ Lower user satisfaction scores
|
|
70
|
+
- ✅ Strong monetization from engaged users
|
|
71
|
+
|
|
72
|
+
### UX-Focused Implementation
|
|
73
|
+
|
|
74
|
+
**Goal**: Maintain excellent user experience while monetizing thoughtfully
|
|
75
|
+
|
|
76
|
+
**Rewarded Ads** (Only or Primary):
|
|
77
|
+
- Single placement or 2 maximum
|
|
78
|
+
- User-initiated only (player chooses to watch)
|
|
79
|
+
- High-value rewards that feel generous
|
|
80
|
+
- Never force ads
|
|
81
|
+
|
|
82
|
+
**Interstitial Ads** (Optional, Rare):
|
|
83
|
+
- Only at major session boundaries (returning to menu, closing app)
|
|
84
|
+
- Frequency cap: 10+ minutes or once per session
|
|
85
|
+
- Skip during active gameplay entirely
|
|
86
|
+
|
|
87
|
+
**Banner Ads** (Avoid or Minimize):
|
|
88
|
+
- Show only in menus, never during gameplay
|
|
89
|
+
- If used, small sizes (standard 320x50, not rectangles)
|
|
90
|
+
- Hide during any active user engagement
|
|
91
|
+
|
|
92
|
+
**Expected Outcomes:** *(Industry benchmarks, not LevelPlay-specific)*
|
|
93
|
+
- ⚠ 40-60% lower ad revenue vs revenue-focused
|
|
94
|
+
- ✅ Better user retention and satisfaction
|
|
95
|
+
- ✅ Higher organic growth and word-of-mouth
|
|
96
|
+
- ✅ Premium brand perception
|
|
97
|
+
|
|
98
|
+
### Balanced Implementation (Recommended for Most Apps)
|
|
99
|
+
|
|
100
|
+
**Goal**: Sustainable monetization with good user experience
|
|
101
|
+
|
|
102
|
+
**Rewarded Ads** (Primary):
|
|
103
|
+
- 2-3 well-chosen placements
|
|
104
|
+
- Focus on moments of high user engagement
|
|
105
|
+
- Make rewards feel valuable but not exploitative
|
|
106
|
+
- Examples: Extra attempts, time skips, premium currency
|
|
107
|
+
|
|
108
|
+
**Interstitial Ads** (Moderate):
|
|
109
|
+
- Natural transition points only (level complete, game over)
|
|
110
|
+
- Frequency cap: Every 5-7 minutes
|
|
111
|
+
- Never interrupt active gameplay
|
|
112
|
+
- Respect user flow
|
|
113
|
+
|
|
114
|
+
**Banner Ads** (Selective):
|
|
115
|
+
- Show in menus and low-attention moments
|
|
116
|
+
- Hide during intense or immersive gameplay
|
|
117
|
+
- Position at bottom with proper UI offset
|
|
118
|
+
- Rotation: Show/hide based on context
|
|
119
|
+
|
|
120
|
+
**Expected Outcomes:** *(Industry benchmarks, not LevelPlay-specific)*
|
|
121
|
+
- ✅ Strong ad revenue (70-85% of revenue-focused approach)
|
|
122
|
+
- ✅ Good user retention
|
|
123
|
+
- ✅ Sustainable long-term monetization
|
|
124
|
+
- ✅ Positive user sentiment
|
|
125
|
+
|
|
126
|
+
## Placement Strategy
|
|
127
|
+
|
|
128
|
+
### Identifying Strong Placement Moments
|
|
129
|
+
|
|
130
|
+
**High-value moments** (Best for rewarded ads):
|
|
131
|
+
- Post-victory celebrations
|
|
132
|
+
- Level progression milestones
|
|
133
|
+
- Unlock opportunities
|
|
134
|
+
- User feels positive emotion
|
|
135
|
+
|
|
136
|
+
**Natural transitions** (Good for interstitials):
|
|
137
|
+
- Level complete
|
|
138
|
+
- Game over
|
|
139
|
+
- Returning to main menu
|
|
140
|
+
- Session boundaries
|
|
141
|
+
|
|
142
|
+
**Low-attention periods** (Acceptable for banners):
|
|
143
|
+
- Waiting screens
|
|
144
|
+
- Loading periods
|
|
145
|
+
- Menu browsing
|
|
146
|
+
- Non-interactive moments
|
|
147
|
+
|
|
148
|
+
### Placement Anti-Patterns (Avoid These)
|
|
149
|
+
|
|
150
|
+
❌ **Mid-gameplay interruptions**: Never show interstitials during active play
|
|
151
|
+
❌ **Bait-and-switch**: Don't offer rewards then show unrewarded interstitials
|
|
152
|
+
❌ **Excessive frequency**: Showing ads every 1-2 minutes frustrates users
|
|
153
|
+
❌ **Punitive ads**: Using ads as punishment for failure feels manipulative
|
|
154
|
+
❌ **Blocking progression**: Making ads mandatory to continue playing
|
|
155
|
+
❌ **Poor timing**: Showing ads right before key moments or cliffhangers
|
|
156
|
+
|
|
157
|
+
## Implementation Patterns
|
|
158
|
+
|
|
159
|
+
> **Note:** These patterns build on the manager classes defined in `rewarded-api.md` and `interstitial-api.md` (`RewardedAdManager`, `InterstitialAdManager`). They use only those managers' public members — `LoadAd()`, `ShowAd()`, `IsAdReady()`, and (for rewarded) the `OnRewardGranted` hook. Generate the manager classes from those references first so these examples compile.
|
|
160
|
+
|
|
161
|
+
### Pattern 1: Rewarded Hints System
|
|
162
|
+
|
|
163
|
+
**Use case**: Puzzle or strategy games where hints add value
|
|
164
|
+
|
|
165
|
+
```csharp
|
|
166
|
+
public class HintSystem : MonoBehaviour
|
|
167
|
+
{
|
|
168
|
+
[SerializeField] private RewardedAdManager adManager;
|
|
169
|
+
[SerializeField] private int hintsAvailable = 3;
|
|
170
|
+
|
|
171
|
+
public void RequestHint()
|
|
172
|
+
{
|
|
173
|
+
if (hintsAvailable > 0)
|
|
174
|
+
{
|
|
175
|
+
// User has free hints remaining
|
|
176
|
+
UseHint();
|
|
177
|
+
hintsAvailable--;
|
|
178
|
+
}
|
|
179
|
+
else
|
|
180
|
+
{
|
|
181
|
+
// Offer ad-based hint
|
|
182
|
+
if (adManager.IsAdReady())
|
|
183
|
+
{
|
|
184
|
+
ShowHintAdOffer();
|
|
185
|
+
}
|
|
186
|
+
else
|
|
187
|
+
{
|
|
188
|
+
ShowHintNotAvailableMessage();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
private void ShowHintAdOffer()
|
|
194
|
+
{
|
|
195
|
+
// Show dialog: "Watch an ad to get a hint?"
|
|
196
|
+
// If user accepts, subscribe to the reward hook and show the ad.
|
|
197
|
+
adManager.OnRewardGranted = OnHintAdRewardEarned;
|
|
198
|
+
adManager.ShowAd();
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
private void OnHintAdRewardEarned()
|
|
202
|
+
{
|
|
203
|
+
// RewardedAdManager invokes this only after the user earns the reward
|
|
204
|
+
UseHint();
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
private void UseHint()
|
|
208
|
+
{
|
|
209
|
+
// Show hint to player
|
|
210
|
+
Debug.Log("Showing hint");
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
private void ShowHintNotAvailableMessage()
|
|
214
|
+
{
|
|
215
|
+
// Inform user that hints aren't available right now
|
|
216
|
+
Debug.Log("Hints not available at the moment");
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**Why this works:**
|
|
222
|
+
- User has free hints first (generous)
|
|
223
|
+
- Ad is optional, not forced
|
|
224
|
+
- Clear value exchange (ad for hint)
|
|
225
|
+
- Graceful handling when ads unavailable
|
|
226
|
+
|
|
227
|
+
### Pattern 2: Level Transition Interstitial (Frequency Capped)
|
|
228
|
+
|
|
229
|
+
**Use case**: Showing interstitials between levels without annoying users
|
|
230
|
+
|
|
231
|
+
```csharp
|
|
232
|
+
public class LevelTransitionAds : MonoBehaviour
|
|
233
|
+
{
|
|
234
|
+
[SerializeField] private InterstitialAdManager adManager;
|
|
235
|
+
private int levelsCompletedSinceAd = 0;
|
|
236
|
+
private int levelsRequiredBetweenAds = 3; // Show ad every 3 levels
|
|
237
|
+
|
|
238
|
+
public void OnLevelComplete()
|
|
239
|
+
{
|
|
240
|
+
levelsCompletedSinceAd++;
|
|
241
|
+
|
|
242
|
+
if (levelsCompletedSinceAd >= levelsRequiredBetweenAds)
|
|
243
|
+
{
|
|
244
|
+
ShowInterstitialOpportunistically();
|
|
245
|
+
levelsCompletedSinceAd = 0;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
ProceedToNextLevel();
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
private void ShowInterstitialOpportunistically()
|
|
252
|
+
{
|
|
253
|
+
// Try to show, but don't wait if not ready
|
|
254
|
+
if (adManager.IsAdReady())
|
|
255
|
+
{
|
|
256
|
+
adManager.ShowAd();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
private void ProceedToNextLevel()
|
|
261
|
+
{
|
|
262
|
+
// Load next level regardless of ad status
|
|
263
|
+
// Never block user flow waiting for ads
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
**Why this works:**
|
|
269
|
+
- Frequency capping prevents ad fatigue
|
|
270
|
+
- Opportunistic showing (doesn't block if not ready)
|
|
271
|
+
- User flow never interrupted
|
|
272
|
+
- Predictable pattern users can adapt to
|
|
273
|
+
|
|
274
|
+
### Pattern 3: Context-Aware Banner Management
|
|
275
|
+
|
|
276
|
+
**Use case**: Showing banners in menus but hiding during gameplay
|
|
277
|
+
|
|
278
|
+
```csharp
|
|
279
|
+
public class ContextAwareBanners : MonoBehaviour
|
|
280
|
+
{
|
|
281
|
+
[SerializeField] private BannerAdManager bannerManager;
|
|
282
|
+
|
|
283
|
+
public enum AppContext
|
|
284
|
+
{
|
|
285
|
+
MainMenu,
|
|
286
|
+
Playing,
|
|
287
|
+
Paused,
|
|
288
|
+
GameOver
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
private AppContext currentContext;
|
|
292
|
+
|
|
293
|
+
public void SetContext(AppContext newContext)
|
|
294
|
+
{
|
|
295
|
+
currentContext = newContext;
|
|
296
|
+
UpdateBannerVisibility();
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
private void UpdateBannerVisibility()
|
|
300
|
+
{
|
|
301
|
+
switch (currentContext)
|
|
302
|
+
{
|
|
303
|
+
case AppContext.MainMenu:
|
|
304
|
+
case AppContext.GameOver:
|
|
305
|
+
// Show banners in menu contexts
|
|
306
|
+
bannerManager.ShowBanner();
|
|
307
|
+
break;
|
|
308
|
+
|
|
309
|
+
case AppContext.Playing:
|
|
310
|
+
// Hide during active gameplay
|
|
311
|
+
bannerManager.HideBanner();
|
|
312
|
+
break;
|
|
313
|
+
|
|
314
|
+
case AppContext.Paused:
|
|
315
|
+
// Optional: Show or hide based on your preference
|
|
316
|
+
// For UX-focused: Hide
|
|
317
|
+
// For revenue-focused: Show
|
|
318
|
+
bannerManager.ShowBanner();
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
**Why this works:**
|
|
326
|
+
- Banners shown only in appropriate contexts
|
|
327
|
+
- Gameplay experience uninterrupted
|
|
328
|
+
- Easy to adjust strategy by changing visibility logic
|
|
329
|
+
- Clean separation of concerns
|
|
330
|
+
|
|
331
|
+
## Frequency Management
|
|
332
|
+
|
|
333
|
+
### Time-Based Frequency Capping
|
|
334
|
+
|
|
335
|
+
Implement minimum time intervals between ads:
|
|
336
|
+
|
|
337
|
+
```csharp
|
|
338
|
+
public class FrequencyManager : MonoBehaviour
|
|
339
|
+
{
|
|
340
|
+
private float minSecondsBetweenInterstitials = 300f; // 5 minutes
|
|
341
|
+
private float lastInterstitialTime = -300f; // Allow first ad immediately
|
|
342
|
+
|
|
343
|
+
public bool CanShowInterstitial()
|
|
344
|
+
{
|
|
345
|
+
float timeSinceLast = Time.realtimeSinceStartup - lastInterstitialTime;
|
|
346
|
+
return timeSinceLast >= minSecondsBetweenInterstitials;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
public void RecordInterstitialShown()
|
|
350
|
+
{
|
|
351
|
+
lastInterstitialTime = Time.realtimeSinceStartup;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
**Recommended intervals:**
|
|
357
|
+
- Revenue-focused: 3-5 minutes
|
|
358
|
+
- Balanced: 5-7 minutes
|
|
359
|
+
- UX-focused: 10+ minutes
|
|
360
|
+
|
|
361
|
+
### Count-Based Frequency Capping
|
|
362
|
+
|
|
363
|
+
Implement minimum actions between ads:
|
|
364
|
+
|
|
365
|
+
```csharp
|
|
366
|
+
private int actionsRequiredBetweenAds = 3;
|
|
367
|
+
private int actionsSinceLastAd = 0;
|
|
368
|
+
|
|
369
|
+
public void OnUserAction()
|
|
370
|
+
{
|
|
371
|
+
actionsSinceLastAd++;
|
|
372
|
+
|
|
373
|
+
if (actionsSinceLastAd >= actionsRequiredBetweenAds)
|
|
374
|
+
{
|
|
375
|
+
// Eligible to show ad
|
|
376
|
+
TryShowAd();
|
|
377
|
+
actionsSinceLastAd = 0;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
**Examples of "actions":**
|
|
383
|
+
- Levels completed
|
|
384
|
+
- Games played
|
|
385
|
+
- Sessions started
|
|
386
|
+
- Feature uses
|
|
387
|
+
|
|
388
|
+
## Error Handling and Graceful Degradation
|
|
389
|
+
|
|
390
|
+
### Always Have a Fallback
|
|
391
|
+
|
|
392
|
+
Never let ad failures block user flow:
|
|
393
|
+
|
|
394
|
+
```csharp
|
|
395
|
+
public void OnAdLoadFailed()
|
|
396
|
+
{
|
|
397
|
+
// Log for debugging
|
|
398
|
+
Debug.LogWarning("Ad failed to load");
|
|
399
|
+
|
|
400
|
+
// Continue with user flow
|
|
401
|
+
ProceedWithoutAd();
|
|
402
|
+
|
|
403
|
+
// Schedule retry
|
|
404
|
+
Invoke(nameof(RetryLoadAd), 30f);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
private void ProceedWithoutAd()
|
|
408
|
+
{
|
|
409
|
+
// Your app continues normally
|
|
410
|
+
// Never block users because ads aren't available
|
|
411
|
+
}
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
### Reward Users Even When Ads Fail
|
|
415
|
+
|
|
416
|
+
For rewarded ads, consider granting rewards even if ad fails:
|
|
417
|
+
|
|
418
|
+
```csharp
|
|
419
|
+
public void OnRewardedAdShowFailed()
|
|
420
|
+
{
|
|
421
|
+
// User intended to watch ad, but it failed
|
|
422
|
+
// Consider granting reward anyway (generous approach)
|
|
423
|
+
if (shouldBeGenerousOnFailure)
|
|
424
|
+
{
|
|
425
|
+
GrantReward();
|
|
426
|
+
ShowMessage("Reward granted! (Ad unavailable)");
|
|
427
|
+
}
|
|
428
|
+
else
|
|
429
|
+
{
|
|
430
|
+
ShowMessage("Ad unavailable, please try again later");
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
**When to be generous:**
|
|
436
|
+
- UX-focused strategy
|
|
437
|
+
- High-value users
|
|
438
|
+
- Failure is on your end (not user's fault)
|
|
439
|
+
|
|
440
|
+
## A/B Testing Considerations
|
|
441
|
+
|
|
442
|
+
### What to Test
|
|
443
|
+
|
|
444
|
+
**High-impact variables:**
|
|
445
|
+
1. **Frequency caps**: 3min vs 5min vs 7min between interstitials
|
|
446
|
+
2. **Placement timing**: Immediate vs delayed interstitials
|
|
447
|
+
3. **Reward generosity**: 1x vs 2x multiplier for rewarded ads
|
|
448
|
+
4. **Banner visibility**: Always vs context-aware vs never during gameplay
|
|
449
|
+
5. **Interstitial presence**: With vs without interstitials
|
|
450
|
+
|
|
451
|
+
**How to test:**
|
|
452
|
+
- Split users into cohorts
|
|
453
|
+
- Track both revenue AND retention
|
|
454
|
+
- Run tests for 7-14 days minimum
|
|
455
|
+
- Focus on long-term value (LTV), not just day-1 revenue
|
|
456
|
+
|
|
457
|
+
### Metrics to Track
|
|
458
|
+
|
|
459
|
+
**Revenue metrics:**
|
|
460
|
+
- ARPDAU (Average Revenue Per Daily Active User)
|
|
461
|
+
- Impression per DAU
|
|
462
|
+
- eCPM (effective Cost Per Mille)
|
|
463
|
+
|
|
464
|
+
**UX metrics:**
|
|
465
|
+
- D1, D7, D30 retention
|
|
466
|
+
- Session length
|
|
467
|
+
- Session frequency
|
|
468
|
+
- Organic virality (shares, referrals)
|
|
469
|
+
|
|
470
|
+
**Balance metrics:**
|
|
471
|
+
- LTV (Lifetime Value)
|
|
472
|
+
- ARPU / Retention ratio
|
|
473
|
+
- User satisfaction scores
|
|
474
|
+
|
|
475
|
+
## Common Mistakes to Avoid
|
|
476
|
+
|
|
477
|
+
1. **Over-monetizing early**: Don't show tons of ads before users are engaged
|
|
478
|
+
2. **Ignoring retention**: High revenue means nothing if users quit
|
|
479
|
+
3. **Blocking without ads**: Never require watching ads to progress
|
|
480
|
+
4. **Poor frequency capping**: Ads every minute frustrate users
|
|
481
|
+
5. **Forcing rewarded ads**: Rewarded ads should always be optional
|
|
482
|
+
6. **Ignoring load failures**: Always handle ad failures gracefully
|
|
483
|
+
7. **One-size-fits-all**: Different user segments may need different strategies
|
|
484
|
+
8. **Neglecting testing**: Always A/B test major monetization changes
|
|
485
|
+
|
|
486
|
+
## Platform-Specific Considerations
|
|
487
|
+
|
|
488
|
+
### iOS
|
|
489
|
+
- Lower opt-in rates post-ATT (iOS 14.5+)
|
|
490
|
+
- Users who deny tracking see lower-value ads
|
|
491
|
+
- More privacy-conscious user base
|
|
492
|
+
- Consider more UX-focused approach
|
|
493
|
+
|
|
494
|
+
### Android
|
|
495
|
+
- Higher ad fill rates
|
|
496
|
+
- More permissive user expectations
|
|
497
|
+
- Diverse hardware requires testing
|
|
498
|
+
- Can push frequency slightly higher
|
|
499
|
+
|
|
500
|
+
## Success Metrics by Strategy
|
|
501
|
+
|
|
502
|
+
*(Example benchmarks from industry typical ranges, not LevelPlay-specific targets)*
|
|
503
|
+
|
|
504
|
+
### Revenue-Focused Success
|
|
505
|
+
- ARPDAU > $0.15
|
|
506
|
+
- Impression/DAU > 8
|
|
507
|
+
- D7 retention > 20%
|
|
508
|
+
|
|
509
|
+
### UX-Focused Success
|
|
510
|
+
- D7 retention > 35%
|
|
511
|
+
- Session length > 15 minutes
|
|
512
|
+
- Low uninstall rate (<5% weekly)
|
|
513
|
+
- ARPDAU > $0.05
|
|
514
|
+
|
|
515
|
+
### Balanced Success
|
|
516
|
+
- ARPDAU > $0.10
|
|
517
|
+
- D7 retention > 28%
|
|
518
|
+
- Impression/DAU > 5
|
|
519
|
+
- High user satisfaction
|
|
520
|
+
|
|
521
|
+
## Final Recommendations
|
|
522
|
+
|
|
523
|
+
1. **Start UX-focused**: Better to under-monetize early than drive users away
|
|
524
|
+
2. **Increase gradually**: Add monetization as users become engaged
|
|
525
|
+
3. **Always test**: Data beats assumptions
|
|
526
|
+
4. **Watch retention closely**: It's easier to add ads than win back users
|
|
527
|
+
5. **Be transparent**: Users appreciate honesty about ad-supported models
|
|
528
|
+
6. **Reward patience**: Give users free options before pushing ads
|
|
529
|
+
7. **Optimize continuously**: Ad strategy should evolve with your product
|
|
530
|
+
|
|
531
|
+
## Code Generation Guidelines (Step 9)
|
|
532
|
+
|
|
533
|
+
Read this before generating ad implementation code in Step 9. It contains the general ad lifecycle,
|
|
534
|
+
per-organization-approach guidance, the always-include requirements, and bid-floor wiring.
|
|
535
|
+
|
|
536
|
+
### General Implementation Pattern
|
|
537
|
+
|
|
538
|
+
All ad formats follow a similar lifecycle:
|
|
539
|
+
|
|
540
|
+
1. **Load**: Request an ad from LevelPlay
|
|
541
|
+
2. **Listen**: Register callbacks for ad events (loaded, failed, shown, clicked, closed)
|
|
542
|
+
3. **Check readiness**: Verify ad is ready before showing
|
|
543
|
+
4. **Show**: Display the ad to the user
|
|
544
|
+
5. **Handle callbacks**: Respond to user interactions and ad lifecycle events
|
|
545
|
+
|
|
546
|
+
### Adapt Output to the Chosen Organization Approach
|
|
547
|
+
|
|
548
|
+
**If the user mentions they have existing code**, ask to see it before providing implementation
|
|
549
|
+
guidance. This allows you to provide targeted fixes rather than generating new code from scratch.
|
|
550
|
+
|
|
551
|
+
**Option 1: Separate manager scripts**
|
|
552
|
+
- Create complete, production-ready `.cs` files for each ad format
|
|
553
|
+
- Name them clearly: `RewardedAdManager.cs`, `InterstitialAdManager.cs`, `BannerAdManager.cs`
|
|
554
|
+
- Include full class structure with proper namespaces
|
|
555
|
+
- Each manager handles one ad format completely
|
|
556
|
+
|
|
557
|
+
**Option 2: Unified AdManager**
|
|
558
|
+
- Create a single `AdManager.cs` file
|
|
559
|
+
- Include methods and callbacks for all requested ad formats in one class
|
|
560
|
+
- Use clear method naming to distinguish between formats (e.g., `LoadRewardedAd()`, `LoadInterstitial()`)
|
|
561
|
+
- Keep code organized with regions or comments separating each ad format
|
|
562
|
+
|
|
563
|
+
**Option 3: Code snippets only**
|
|
564
|
+
- Provide focused code blocks without full class wrappers
|
|
565
|
+
- Clearly label each snippet (e.g., "Rewarded Ad Initialization", "Interstitial Event Callbacks")
|
|
566
|
+
- Explain where/how to integrate each snippet
|
|
567
|
+
- Note any dependencies between snippets
|
|
568
|
+
|
|
569
|
+
### Regardless of Chosen Approach, Always Include
|
|
570
|
+
- All manager classes must inherit from `MonoBehaviour` — required for Unity lifecycle methods (`Start()`, `OnDestroy()`) and to attach the script to a GameObject
|
|
571
|
+
- After generating any manager script, instruct the user to attach it to a persistent GameObject in their scene (the same one as the initializer, with `DontDestroyOnLoad`)
|
|
572
|
+
- For banner and interstitial managers, call `DestroyAd()` in `OnDestroy()` so ads are destroyed and memory is freed when the manager is destroyed
|
|
573
|
+
- Rewarded and interstitial show paths check `IsAdReady()` before `ShowAd()`. If the game uses dashboard placements, also check the static `IsPlacementCapped(placementName)` — capping is configured per placement in the LevelPlay dashboard, and showing a capped placement fails (error codes 524/526)
|
|
574
|
+
- Proper event subscription and unsubscription (to avoid memory leaks)
|
|
575
|
+
- Null checks and defensive programming
|
|
576
|
+
- Debug logs for troubleshooting
|
|
577
|
+
- Clear variable names that match LevelPlay conventions
|
|
578
|
+
- Error handling and graceful degradation
|
|
579
|
+
|
|
580
|
+
### Bid Floor Handling (per-format)
|
|
581
|
+
- If the user provided a bid floor value for a format, wrap construction in `Config.Builder().SetBidFloor(value).Build()` and pass the config to the constructor.
|
|
582
|
+
- If the user said 'skip' for that format, use the basic constructor (`new LevelPlayRewardedAd(adUnitId)`).
|
|
583
|
+
- Apply per-format: a publisher may set a floor on rewarded but skip banner.
|
|
584
|
+
|
|
585
|
+
Example (with bid floor):
|
|
586
|
+
```csharp
|
|
587
|
+
var config = new LevelPlayRewardedAd.Config.Builder()
|
|
588
|
+
.SetBidFloor(0.80)
|
|
589
|
+
.Build();
|
|
590
|
+
rewardedAd = new LevelPlayRewardedAd(adUnitId, config);
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
Example (skipped):
|
|
594
|
+
```csharp
|
|
595
|
+
rewardedAd = new LevelPlayRewardedAd(adUnitId);
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
## Additional Resources
|
|
599
|
+
|
|
600
|
+
For detailed API implementation, see:
|
|
601
|
+
- `rewarded-api.md`: Rewarded ad implementation
|
|
602
|
+
- `interstitial-api.md`: Interstitial ad implementation
|
|
603
|
+
- `banner-api.md`: Banner ad implementation
|
|
604
|
+
- `initialization-api.md`: SDK setup and configuration
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# LevelPlay Native Dependency Resolution
|
|
2
|
+
|
|
3
|
+
Detailed guidance for Step 4 of SKILL.md. LevelPlay requires native Android/iOS libraries that Unity's
|
|
4
|
+
package manager alone doesn't handle; a dependency manager bridges this gap. Read this when resolving
|
|
5
|
+
native dependencies, when the user does not yet have a dependency manager, or when diagnosing gradle
|
|
6
|
+
(Android) / CocoaPods (iOS) build failures.
|
|
7
|
+
|
|
8
|
+
## Contents
|
|
9
|
+
- [Check for an Existing Dependency Manager](#check-for-an-existing-dependency-manager)
|
|
10
|
+
- [If They Have a Dependency Manager](#if-they-have-a-dependency-manager)
|
|
11
|
+
- [If They Don't Have a Dependency Manager](#if-they-dont-have-a-dependency-manager)
|
|
12
|
+
- [Verification](#verification)
|
|
13
|
+
- [Android Custom Main Gradle Template (Older Versions)](#android-custom-main-gradle-template-older-versions)
|
|
14
|
+
- [Android API 33+ Requirement](#android-api-33-requirement)
|
|
15
|
+
|
|
16
|
+
LevelPlay requires native Android/iOS libraries that Unity's package manager alone doesn't handle. A
|
|
17
|
+
dependency manager bridges this gap. If this is a new project without a dependency manager already set
|
|
18
|
+
up, the steps below cover installing one.
|
|
19
|
+
|
|
20
|
+
## Check for an Existing Dependency Manager
|
|
21
|
+
|
|
22
|
+
Ask: "Do you have a dependency manager like Mobile Dependency Resolver (MDR), Unity External Dependency
|
|
23
|
+
Manager (UEDM), or External Dependency Manager for Unity (EDM4U) installed? Check your Assets folder for
|
|
24
|
+
these tools."
|
|
25
|
+
|
|
26
|
+
**If unsure**: Check Assets folder in Unity for folders named 'Mobile Dependency Resolver', 'External
|
|
27
|
+
Dependency Manager', or 'EDM4U'. If you see any folder with these names, answer 'Yes'. If not, answer 'No'.
|
|
28
|
+
|
|
29
|
+
## If They Have a Dependency Manager
|
|
30
|
+
|
|
31
|
+
**For Android:**
|
|
32
|
+
- With newer versions of Mobile Dependency Resolver (shipped with the Ads Mediation package): Dependencies auto-resolve on build (no manual action needed). If unsure, try building first — if it fails, manually resolve via the Android Resolver menu.
|
|
33
|
+
- With older MDR or other managers: Go to Assets > [Your Dependency Manager] > Android Resolver > Resolve
|
|
34
|
+
- Example paths:
|
|
35
|
+
- MDR: `Assets > Mobile Dependency Resolver > Android Resolver > Resolve`
|
|
36
|
+
- EDM4U: `Assets > External Dependency Manager > Android Resolver > Resolve`
|
|
37
|
+
- Menu paths may vary depending on dependency manager version. Look for 'Android Resolver' under your dependency manager's menu.
|
|
38
|
+
|
|
39
|
+
**For iOS:**
|
|
40
|
+
- All dependency managers require manual CocoaPods installation:
|
|
41
|
+
- MDR: `Assets > Mobile Dependency Resolver > iOS Resolver > Install Cocoapods`
|
|
42
|
+
- EDM4U: `Assets > External Dependency Manager > iOS Resolver > Install Cocoapods`
|
|
43
|
+
- UEDM: Similar path under Unity External Dependency Manager
|
|
44
|
+
|
|
45
|
+
Ask: "Have you run the dependency resolution for your target platform(s)?"
|
|
46
|
+
|
|
47
|
+
**If targeting both Android and iOS**, complete dependency resolution for both platforms before proceeding.
|
|
48
|
+
|
|
49
|
+
## If They Don't Have a Dependency Manager
|
|
50
|
+
|
|
51
|
+
If the user didn't see the Mobile Dependency Resolver prompt during installation (see Step 3), restart
|
|
52
|
+
Unity Editor — the prompt may appear after restart. If it still doesn't appear, they may already have a
|
|
53
|
+
dependency manager installed.
|
|
54
|
+
|
|
55
|
+
When prompted:
|
|
56
|
+
1. Click **Import** on the prompt to install Mobile Dependency Resolver
|
|
57
|
+
2. After installation:
|
|
58
|
+
- **Android**: Dependencies will auto-resolve on build (newer MDR versions)
|
|
59
|
+
- **iOS**: Go to Assets > Mobile Dependency Resolver > iOS Resolver > Install Cocoapods
|
|
60
|
+
|
|
61
|
+
**Alternative**: Install another dependency manager like EDM4U if preferred (search for installation instructions in their documentation).
|
|
62
|
+
|
|
63
|
+
**Note**: Unity is transitioning to Unity External Dependency Manager (UEDM). If available in your Unity version, prefer UEDM over MDR.
|
|
64
|
+
|
|
65
|
+
## Verification
|
|
66
|
+
|
|
67
|
+
After resolution, verify:
|
|
68
|
+
- **Android**: Gradle dependencies in `Assets/Plugins/Android/`
|
|
69
|
+
- **iOS**: Podfile references or CocoaPods installation confirmation in console
|
|
70
|
+
|
|
71
|
+
**If dependency resolution fails**: Check the Unity console for specific error messages and share them for troubleshooting — or see `references/troubleshooting.md` for gradle and CocoaPods error guidance.
|
|
72
|
+
|
|
73
|
+
## Android Custom Main Gradle Template (Older Versions)
|
|
74
|
+
|
|
75
|
+
For older LevelPlay Unity package versions, manually enable the Custom Main Gradle Template:
|
|
76
|
+
1. Go to Edit > Project Settings > Player
|
|
77
|
+
2. Select Android tab
|
|
78
|
+
3. Expand Publishing Settings
|
|
79
|
+
4. Under Build, check Custom Main Gradle Template
|
|
80
|
+
|
|
81
|
+
In newer LevelPlay Unity package versions (with newer Mobile Dependency Resolver), this is enabled
|
|
82
|
+
automatically by default.
|
|
83
|
+
|
|
84
|
+
## Android API 33+ Requirement
|
|
85
|
+
|
|
86
|
+
If targeting Android API level 33 or higher, declare the AD_ID permission in AndroidManifest.xml:
|
|
87
|
+
|
|
88
|
+
```xml
|
|
89
|
+
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
This permission is required for advertising ID access on Android 13+.
|
|
93
|
+
|
|
94
|
+
**If you skip this step and target Android API 33+:** advertising ID access will fail on Android 13+ devices.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Examples
|
|
2
|
+
|
|
3
|
+
**Note**: Examples show abbreviated workflows for illustration. In practice, follow all steps 1–10 in order.
|
|
4
|
+
|
|
5
|
+
**Revenue-focused game** ("maximize ad revenue in my casual puzzle game"): Steps 1–7 to verify environment/goal/install/deps/App Key/AdMob/init → Step 8 recommend Revenue strategy → Step 9 ask code organization and generate the chosen structure → Step 10 testing.
|
|
6
|
+
|
|
7
|
+
**UX-focused game** ("optional rewarded ads for extra lives without annoying players"): same spine, but Step 8 recommends UX strategy (rewarded only, user-initiated) and Step 9 implements rewarded with proper patterns.
|
|
8
|
+
|
|
9
|
+
**Existing project** ("existing GameManager, add interstitials between levels"): same spine, Step 8 Balanced, Step 9 ask to see `GameManager.cs` then provide Option-2 snippets.
|
|
10
|
+
|