nccgs 1.0.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/.claude/agents/nccgs-accessibility-specialist.md +26 -0
- package/.claude/agents/nccgs-adversarial-reviewer.md +26 -0
- package/.claude/agents/nccgs-ai-programmer.md +26 -0
- package/.claude/agents/nccgs-analytics-engineer.md +26 -0
- package/.claude/agents/nccgs-art-direction-lead.md +26 -0
- package/.claude/agents/nccgs-audio-direction-lead.md +26 -0
- package/.claude/agents/nccgs-creative-director.md +26 -0
- package/.claude/agents/nccgs-documentation-manager.md +26 -0
- package/.claude/agents/nccgs-economy-designer.md +26 -0
- package/.claude/agents/nccgs-engine-programmer.md +26 -0
- package/.claude/agents/nccgs-game-design-lead.md +26 -0
- package/.claude/agents/nccgs-game-designer.md +26 -0
- package/.claude/agents/nccgs-gameplay-programmer.md +26 -0
- package/.claude/agents/nccgs-level-designer.md +26 -0
- package/.claude/agents/nccgs-live-ops-designer.md +26 -0
- package/.claude/agents/nccgs-localization-lead.md +26 -0
- package/.claude/agents/nccgs-narrative-lead.md +26 -0
- package/.claude/agents/nccgs-network-programmer.md +26 -0
- package/.claude/agents/nccgs-performance-analyst.md +26 -0
- package/.claude/agents/nccgs-producer.md +26 -0
- package/.claude/agents/nccgs-production-coordinator.md +23 -0
- package/.claude/agents/nccgs-programming-lead.md +26 -0
- package/.claude/agents/nccgs-prototyper.md +26 -0
- package/.claude/agents/nccgs-qa-engineer.md +26 -0
- package/.claude/agents/nccgs-qa-lead.md +26 -0
- package/.claude/agents/nccgs-release-engineer.md +26 -0
- package/.claude/agents/nccgs-release-lead.md +26 -0
- package/.claude/agents/nccgs-security-engineer.md +26 -0
- package/.claude/agents/nccgs-sound-designer.md +26 -0
- package/.claude/agents/nccgs-systems-designer.md +26 -0
- package/.claude/agents/nccgs-technical-architect.md +26 -0
- package/.claude/agents/nccgs-technical-artist.md +26 -0
- package/.claude/agents/nccgs-technical-director.md +26 -0
- package/.claude/agents/nccgs-tools-programmer.md +26 -0
- package/.claude/agents/nccgs-ui-programmer.md +26 -0
- package/.claude/agents/nccgs-unity-build-specialist.md +26 -0
- package/.claude/agents/nccgs-unity-content-specialist.md +26 -0
- package/.claude/agents/nccgs-unity-implementer.md +26 -0
- package/.claude/agents/nccgs-unity-rendering-specialist.md +26 -0
- package/.claude/agents/nccgs-unity-systems-specialist.md +26 -0
- package/.claude/agents/nccgs-unity-ui-specialist.md +26 -0
- package/.claude/agents/nccgs-ux-designer.md +26 -0
- package/.claude/agents/nccgs-verification-engineer.md +26 -0
- package/.claude/agents/nccgs-world-builder.md +26 -0
- package/.claude/agents/nccgs-writer.md +26 -0
- package/.claude/nccgs/THIRD_PARTY_NOTICES.md +13 -0
- package/.claude/nccgs/VERSION +1 -0
- package/.claude/nccgs/constitution.md +131 -0
- package/.claude/nccgs/hooks/agent-audit.mjs +10 -0
- package/.claude/nccgs/hooks/common.mjs +41 -0
- package/.claude/nccgs/hooks/post-compact.mjs +1 -0
- package/.claude/nccgs/hooks/pre-compact.mjs +8 -0
- package/.claude/nccgs/hooks/protect-git.mjs +22 -0
- package/.claude/nccgs/hooks/protect-write.mjs +17 -0
- package/.claude/nccgs/hooks/session-start.mjs +15 -0
- package/.claude/nccgs/hooks/session-stop.mjs +7 -0
- package/.claude/nccgs/protocols/agent-contract.md +34 -0
- package/.claude/nccgs/protocols/context-packets.md +13 -0
- package/.claude/nccgs/protocols/evidence.md +15 -0
- package/.claude/nccgs/protocols/model-routing.md +22 -0
- package/.claude/nccgs/protocols/orchestration.md +26 -0
- package/.claude/nccgs/protocols/unity-boundary.md +11 -0
- package/.claude/nccgs/settings.fragment.json +77 -0
- package/.claude/nccgs/studio.json +347 -0
- package/.claude/nccgs/tools/configure-models.mjs +39 -0
- package/.claude/nccgs/unity-skills-manifest.json +727 -0
- package/.claude/nccgs/workflow-catalog.json +317 -0
- package/.claude/rules/nccgs-canonical-docs.md +19 -0
- package/.claude/rules/nccgs-editor-tools.md +12 -0
- package/.claude/rules/nccgs-localization.md +12 -0
- package/.claude/rules/nccgs-networking.md +13 -0
- package/.claude/rules/nccgs-performance.md +14 -0
- package/.claude/rules/nccgs-rendering.md +16 -0
- package/.claude/rules/nccgs-security.md +13 -0
- package/.claude/rules/nccgs-tests.md +18 -0
- package/.claude/rules/nccgs-ui.md +14 -0
- package/.claude/rules/nccgs-unity-assets.md +21 -0
- package/.claude/rules/nccgs-unity-code.md +22 -0
- package/.claude/skills/accessibility-review/SKILL.md +14 -0
- package/.claude/skills/architecture-decision/SKILL.md +14 -0
- package/.claude/skills/asset-audit/SKILL.md +14 -0
- package/.claude/skills/audit/SKILL.md +16 -0
- package/.claude/skills/audit/references/dimensions.md +46 -0
- package/.claude/skills/balance-review/SKILL.md +14 -0
- package/.claude/skills/bug-triage/SKILL.md +14 -0
- package/.claude/skills/build-live-game/SKILL.md +317 -0
- package/.claude/skills/build-live-game/references/achievements.md +779 -0
- package/.claude/skills/build-live-game/references/apis.md +280 -0
- package/.claude/skills/build-live-game/references/authentication.md +437 -0
- package/.claude/skills/build-live-game/references/battlepass.md +860 -0
- package/.claude/skills/build-live-game/references/cloud-code.md +563 -0
- package/.claude/skills/build-live-game/references/cloud-save.md +474 -0
- package/.claude/skills/build-live-game/references/deployment.md +216 -0
- package/.claude/skills/build-live-game/references/player-account.md +813 -0
- package/.claude/skills/build-live-game/references/remote-config.md +96 -0
- package/.claude/skills/build-live-game/references/tooling.md +431 -0
- package/.claude/skills/closure/SKILL.md +14 -0
- package/.claude/skills/code-review/SKILL.md +14 -0
- package/.claude/skills/compatibility-review/SKILL.md +14 -0
- package/.claude/skills/context-pack/SKILL.md +14 -0
- package/.claude/skills/dependency-review/SKILL.md +14 -0
- package/.claude/skills/design/SKILL.md +20 -0
- package/.claude/skills/design-review/SKILL.md +14 -0
- package/.claude/skills/evidence-review/SKILL.md +14 -0
- package/.claude/skills/hotfix/SKILL.md +14 -0
- package/.claude/skills/implement-in-app-purchases/README.md +233 -0
- package/.claude/skills/implement-in-app-purchases/SKILL.md +158 -0
- package/.claude/skills/implement-in-app-purchases/references/api-notes.md +562 -0
- package/.claude/skills/implement-in-app-purchases/references/codeless-catalog.md +331 -0
- package/.claude/skills/implement-in-app-purchases/references/convert-adapty.md +268 -0
- package/.claude/skills/implement-in-app-purchases/references/convert-essentialkit.md +239 -0
- package/.claude/skills/implement-in-app-purchases/references/convert-revenuecat.md +275 -0
- package/.claude/skills/implement-in-app-purchases/references/convert-unipay.md +145 -0
- package/.claude/skills/implement-in-app-purchases/references/migration-v4-to-v5.md +204 -0
- package/.claude/skills/implement-in-app-purchases/references/path-add-iap-to-new-project.md +198 -0
- package/.claude/skills/implement-in-app-purchases/references/path-convert-native-google-billing.md +356 -0
- package/.claude/skills/implement-in-app-purchases/references/path-convert-native-storekit.md +446 -0
- package/.claude/skills/implement-in-app-purchases/references/path-implement-iap-d2c.md +680 -0
- package/.claude/skills/implement-in-app-purchases/references/platform-notes.md +204 -0
- package/.claude/skills/implement-in-app-purchases/references/pre-check.md +205 -0
- package/.claude/skills/incident-recovery/SKILL.md +14 -0
- package/.claude/skills/initialize-ai-navigation/SKILL.md +95 -0
- package/.claude/skills/initialize-ai-navigation/references/navigation-system.md +794 -0
- package/.claude/skills/levelplay-unity-integration/CHANGELOG.md +57 -0
- package/.claude/skills/levelplay-unity-integration/README.md +74 -0
- package/.claude/skills/levelplay-unity-integration/SKILL.md +1126 -0
- package/.claude/skills/levelplay-unity-integration/references/banner-api.md +920 -0
- package/.claude/skills/levelplay-unity-integration/references/best-practices.md +536 -0
- package/.claude/skills/levelplay-unity-integration/references/ilrd-api.md +337 -0
- package/.claude/skills/levelplay-unity-integration/references/initialization-api.md +630 -0
- package/.claude/skills/levelplay-unity-integration/references/interstitial-api.md +899 -0
- package/.claude/skills/levelplay-unity-integration/references/ios-setup.md +491 -0
- package/.claude/skills/levelplay-unity-integration/references/migration-sdk-9.md +666 -0
- package/.claude/skills/levelplay-unity-integration/references/privacy-settings.md +608 -0
- package/.claude/skills/levelplay-unity-integration/references/rewarded-api.md +902 -0
- package/.claude/skills/localization/SKILL.md +135 -0
- package/.claude/skills/localization/references/api-notes.md +76 -0
- package/.claude/skills/localization/resources/L10nBatchProcessor.cs +69 -0
- package/.claude/skills/localization/resources/LocalizedFontAsset.cs +18 -0
- package/.claude/skills/localize-game/SKILL.md +14 -0
- package/.claude/skills/migrate-project/SKILL.md +21 -0
- package/.claude/skills/migrate-project/references/procedure.md +63 -0
- package/.claude/skills/milestone-review/SKILL.md +14 -0
- package/.claude/skills/new-unity-project/SKILL.md +179 -0
- package/.claude/skills/optimize-audio/SKILL.md +199 -0
- package/.claude/skills/optimize-audio/resources/audio-import-api.md +146 -0
- package/.claude/skills/optimize-audio/resources/platform-settings.md +48 -0
- package/.claude/skills/optimize-text-mesh-pro/SKILL.md +182 -0
- package/.claude/skills/optimize-web/SKILL.md +393 -0
- package/.claude/skills/optimize-web/resources/WebOptimizer.cs +21 -0
- package/.claude/skills/optimize-web/resources/toktx-examples.sh +11 -0
- package/.claude/skills/performance-audit/SKILL.md +14 -0
- package/.claude/skills/physics-3d-collision/SKILL.md +442 -0
- package/.claude/skills/physics-3d-collision/references/troubleshooting.md +41 -0
- package/.claude/skills/physics-3d-collision/resources/CollisionDebugger.cs +33 -0
- package/.claude/skills/plan-feature/SKILL.md +14 -0
- package/.claude/skills/playtest/SKILL.md +14 -0
- package/.claude/skills/project-stage/SKILL.md +14 -0
- package/.claude/skills/prototype-feature/SKILL.md +14 -0
- package/.claude/skills/qa-plan/SKILL.md +14 -0
- package/.claude/skills/release/SKILL.md +18 -0
- package/.claude/skills/release-readiness/SKILL.md +14 -0
- package/.claude/skills/retrospective/SKILL.md +14 -0
- package/.claude/skills/review/SKILL.md +16 -0
- package/.claude/skills/security-audit/SKILL.md +14 -0
- package/.claude/skills/setup-multiplayer-services/SKILL.md +39 -0
- package/.claude/skills/setup-multiplayer-services/references/dgs-entrypoint.md +79 -0
- package/.claude/skills/setup-multiplayer-services/references/entrypoints.md +213 -0
- package/.claude/skills/setup-multiplayer-services/references/examples.md +33 -0
- package/.claude/skills/setup-multiplayer-services/references/implementation-fit.md +30 -0
- package/.claude/skills/setup-multiplayer-services/references/underlying-services.md +11 -0
- package/.claude/skills/setup-multiplayer-services/references/workflows-prerequisites.md +17 -0
- package/.claude/skills/setup-vivox-voice-chat/SKILL.md +118 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/.env.example +6 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/README.md +101 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/promptfooconfig.yaml +32 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/tests/init-and-login.yaml +76 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/tests/text-chat.yaml +65 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/tests/voice-channels.yaml +74 -0
- package/.claude/skills/setup-vivox-voice-chat/references/events-and-participants.md +79 -0
- package/.claude/skills/setup-vivox-voice-chat/references/init-and-login.md +92 -0
- package/.claude/skills/setup-vivox-voice-chat/references/text-chat.md +93 -0
- package/.claude/skills/setup-vivox-voice-chat/references/troubleshooting.md +47 -0
- package/.claude/skills/setup-vivox-voice-chat/references/voice-channels.md +90 -0
- package/.claude/skills/shader-graph-create-custom-node/SKILL.md +25 -0
- package/.claude/skills/shader-graph-create-custom-node/resources/all_hints.hlsl +182 -0
- package/.claude/skills/sprint-plan/SKILL.md +14 -0
- package/.claude/skills/sprite-editor/SKILL.md +66 -0
- package/.claude/skills/sprite-editor/references/api_reference.md +151 -0
- package/.claude/skills/sprite-editor/references/background.md +112 -0
- package/.claude/skills/sprite-editor/references/templates.md +72 -0
- package/.claude/skills/sprite-editor/scripts/AutomaticSliceTexture.cs +40 -0
- package/.claude/skills/sprite-editor/scripts/GenerateNewSpriteRects.cs +200 -0
- package/.claude/skills/sprite-editor/scripts/GetTextureSourceImageSize.cs +32 -0
- package/.claude/skills/sprite-editor/scripts/GetTextureToSlice.cs +55 -0
- package/.claude/skills/sprite-editor/scripts/GridSliceTexture.cs +40 -0
- package/.claude/skills/sprite-editor/scripts/IsometricSliceTexture.cs +141 -0
- package/.claude/skills/sprite-editor/scripts/README.md +134 -0
- package/.claude/skills/sprite-editor/scripts/SetPivotExample.cs +58 -0
- package/.claude/skills/sprite-editor/scripts/SpriteToPng.cs +88 -0
- package/.claude/skills/status/SKILL.md +16 -0
- package/.claude/skills/story-readiness/SKILL.md +14 -0
- package/.claude/skills/test/SKILL.md +16 -0
- package/.claude/skills/ui/SKILL.md +142 -0
- package/.claude/skills/ui-imgui/SKILL.md +186 -0
- package/.claude/skills/ui-imgui/references/gui-elements.md +156 -0
- package/.claude/skills/ui-imgui/references/templates.md +141 -0
- package/.claude/skills/ui-review/SKILL.md +14 -0
- package/.claude/skills/ui-ugui/SKILL.md +282 -0
- package/.claude/skills/ui-ugui/references/scrollview-setup.md +29 -0
- package/.claude/skills/ui-uitk/SKILL.md +235 -0
- package/.claude/skills/ui-uitk/references/common-issues.md +74 -0
- package/.claude/skills/ui-uitk/references/custom-elements.md +241 -0
- package/.claude/skills/ui-uitk/references/painter2d.md +282 -0
- package/.claude/skills/ui-uitk/references/pointermanipulator-guide.md +94 -0
- package/.claude/skills/ui-uitk/references/svg-icons.md +136 -0
- package/.claude/skills/ui-uitk/references/ui-runtime-binding.md +234 -0
- package/.claude/skills/ui-uitk/references/uss-guide.md +138 -0
- package/.claude/skills/unity-cli/CHANGELOG.md +233 -0
- package/.claude/skills/unity-cli/SECURITY.md +22 -0
- package/.claude/skills/unity-cli/SKILL.md +414 -0
- package/.claude/skills/unity-cli/references/auth-license-cloud.md +146 -0
- package/.claude/skills/unity-cli/references/build-run-test.md +349 -0
- package/.claude/skills/unity-cli/references/collaboration.md +472 -0
- package/.claude/skills/unity-cli/references/config-hub.md +103 -0
- package/.claude/skills/unity-cli/references/diagnostics-maintenance.md +326 -0
- package/.claude/skills/unity-cli/references/editors-install.md +327 -0
- package/.claude/skills/unity-cli/references/integration-advanced.md +472 -0
- package/.claude/skills/unity-cli/references/projects-templates.md +574 -0
- package/.claude/skills/unity-package-management/SKILL.md +304 -0
- package/.claude/skills/unity-package-management/references/select-packages.md +108 -0
- package/.claude/skills/urp-postprocessing/SKILL.md +188 -0
- package/.claude/skills/urp-postprocessing/references/code-templates.md +119 -0
- package/.claude/skills/urp-postprocessing/references/effect-reference.md +86 -0
- package/.claude/skills/validate-urp-render-graph-renderer-feature/SKILL.md +269 -0
- package/.claude/skills/work/SKILL.md +36 -0
- package/.claude/skills/work/references/classification.md +41 -0
- package/.claude/skills/work/references/closure.md +50 -0
- package/.claude/skills/work/references/feature-contracts.md +32 -0
- package/.claude/skills/work/references/verification.md +26 -0
- package/CLAUDE.md +6 -0
- package/LICENSE +21 -0
- package/README.md +162 -0
- package/THIRD_PARTY_NOTICES.md +23 -0
- package/UPGRADING.md +32 -0
- package/VERSION +1 -0
- package/docs/ARCHITECTURE.md +73 -0
- package/docs/HUONG-DAN-MIGRATE-VA-SU-DUNG.md +324 -0
- package/docs/MIGRATION-MATRIX.md +23 -0
- package/docs/PROJECT-POLICY.md +67 -0
- package/docs/WORKFLOWS.md +61 -0
- package/package-assets/setup-vivox-voice-chat-evals.gitignore +7 -0
- package/package.json +41 -0
- package/scaffold/.nccgs/bugs/.gitkeep +1 -0
- package/scaffold/.nccgs/closures/.gitkeep +1 -0
- package/scaffold/.nccgs/context/.gitkeep +1 -0
- package/scaffold/.nccgs/decisions/.gitkeep +1 -0
- package/scaffold/.nccgs/evidence/.gitkeep +1 -0
- package/scaffold/.nccgs/features/.gitkeep +1 -0
- package/scaffold/.nccgs/migrations/.gitkeep +1 -0
- package/scaffold/.nccgs/playtests/.gitkeep +1 -0
- package/scaffold/.nccgs/project.yaml +103 -0
- package/scaffold/.nccgs/requirements.yaml +10 -0
- package/scaffold/.nccgs/reviews/.gitkeep +1 -0
- package/scaffold/.nccgs/state.md +40 -0
- package/scaffold/.nccgs/templates/agent-handoff.md +25 -0
- package/scaffold/.nccgs/templates/architecture-decision.md +27 -0
- package/scaffold/.nccgs/templates/closure-record.md +51 -0
- package/scaffold/.nccgs/templates/context-packet.yaml +17 -0
- package/scaffold/.nccgs/templates/evidence-record.md +23 -0
- package/scaffold/.nccgs/templates/feature-contract.md +35 -0
- package/scaffold/.nccgs/templates/migration-plan.md +40 -0
- package/scaffold/.nccgs/templates/waiver.md +11 -0
- package/scripts/cli.mjs +56 -0
- package/scripts/install.mjs +267 -0
- package/scripts/sync-unity-skills.mjs +126 -0
- package/scripts/validate.mjs +205 -0
- package/tests/framework.test.mjs +121 -0
|
@@ -0,0 +1,920 @@
|
|
|
1
|
+
# Banner Ads API Reference
|
|
2
|
+
|
|
3
|
+
## Contents
|
|
4
|
+
- [Overview](#overview)
|
|
5
|
+
- [Key Characteristics](#key-characteristics)
|
|
6
|
+
- [Implementation Pattern](#implementation-pattern)
|
|
7
|
+
- [API Reference](#api-reference)
|
|
8
|
+
- [Data Types](#data-types)
|
|
9
|
+
- [Best Practices](#best-practices)
|
|
10
|
+
- [Common Issues](#common-issues)
|
|
11
|
+
- [Testing Checklist](#testing-checklist)
|
|
12
|
+
|
|
13
|
+
## Overview
|
|
14
|
+
|
|
15
|
+
Banner ads are rectangular ads that occupy a portion of the screen. They can be displayed at the top or bottom of the screen and remain visible while users interact with your app.
|
|
16
|
+
|
|
17
|
+
## Key Characteristics
|
|
18
|
+
|
|
19
|
+
- **Persistent**: Remain on screen until explicitly destroyed
|
|
20
|
+
- **Always visible**: Can distract from gameplay if poorly positioned
|
|
21
|
+
- **Best for**: Menu screens, waiting periods, low-attention moments
|
|
22
|
+
|
|
23
|
+
## Implementation Pattern
|
|
24
|
+
|
|
25
|
+
### Basic Banner Implementation
|
|
26
|
+
|
|
27
|
+
```csharp
|
|
28
|
+
using UnityEngine;
|
|
29
|
+
using Unity.Services.LevelPlay;
|
|
30
|
+
|
|
31
|
+
public class BannerAdManager : MonoBehaviour
|
|
32
|
+
{
|
|
33
|
+
private LevelPlayBannerAd bannerAd;
|
|
34
|
+
private string adUnitId = "YOUR_BANNER_AD_UNIT_ID";
|
|
35
|
+
|
|
36
|
+
void Start()
|
|
37
|
+
{
|
|
38
|
+
// Create the banner ad object using constructor
|
|
39
|
+
bannerAd = new LevelPlayBannerAd(adUnitId);
|
|
40
|
+
|
|
41
|
+
// Register event listeners
|
|
42
|
+
bannerAd.OnAdLoaded += OnAdLoaded;
|
|
43
|
+
bannerAd.OnAdLoadFailed += OnAdLoadFailed;
|
|
44
|
+
bannerAd.OnAdDisplayed += OnAdDisplayed;
|
|
45
|
+
bannerAd.OnAdDisplayFailed += OnAdDisplayFailed;
|
|
46
|
+
bannerAd.OnAdClicked += OnAdClicked;
|
|
47
|
+
bannerAd.OnAdExpanded += OnAdExpanded;
|
|
48
|
+
bannerAd.OnAdCollapsed += OnAdCollapsed;
|
|
49
|
+
bannerAd.OnAdLeftApplication += OnAdLeftApplication;
|
|
50
|
+
|
|
51
|
+
// Load and show banner
|
|
52
|
+
LoadBanner();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
void OnDestroy()
|
|
56
|
+
{
|
|
57
|
+
// Unregister event listeners
|
|
58
|
+
if (bannerAd != null)
|
|
59
|
+
{
|
|
60
|
+
bannerAd.OnAdLoaded -= OnAdLoaded;
|
|
61
|
+
bannerAd.OnAdLoadFailed -= OnAdLoadFailed;
|
|
62
|
+
bannerAd.OnAdDisplayed -= OnAdDisplayed;
|
|
63
|
+
bannerAd.OnAdDisplayFailed -= OnAdDisplayFailed;
|
|
64
|
+
bannerAd.OnAdClicked -= OnAdClicked;
|
|
65
|
+
bannerAd.OnAdExpanded -= OnAdExpanded;
|
|
66
|
+
bannerAd.OnAdCollapsed -= OnAdCollapsed;
|
|
67
|
+
bannerAd.OnAdLeftApplication -= OnAdLeftApplication;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Destroy banner
|
|
71
|
+
DestroyBanner();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public void LoadBanner()
|
|
75
|
+
{
|
|
76
|
+
Debug.Log("Loading banner ad...");
|
|
77
|
+
bannerAd.LoadAd();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public void ShowBanner()
|
|
81
|
+
{
|
|
82
|
+
Debug.Log("Showing banner ad");
|
|
83
|
+
bannerAd.ShowAd();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
public void HideBanner()
|
|
87
|
+
{
|
|
88
|
+
Debug.Log("Hiding banner ad");
|
|
89
|
+
bannerAd.HideAd();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public void DestroyBanner()
|
|
93
|
+
{
|
|
94
|
+
if (bannerAd != null)
|
|
95
|
+
{
|
|
96
|
+
Debug.Log("Destroying banner ad");
|
|
97
|
+
bannerAd.DestroyAd();
|
|
98
|
+
bannerAd = null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Event Callbacks
|
|
103
|
+
private void OnAdLoaded(LevelPlayAdInfo adInfo)
|
|
104
|
+
{
|
|
105
|
+
Debug.Log("Banner ad loaded");
|
|
106
|
+
// Banner is ready, can call ShowAd() if needed
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
private void OnAdLoadFailed(LevelPlayAdError error)
|
|
110
|
+
{
|
|
111
|
+
Debug.LogWarning($"Banner ad load failed: {error.ErrorMessage}");
|
|
112
|
+
// Retry loading after delay
|
|
113
|
+
Invoke(nameof(LoadBanner), 60f);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
private void OnAdDisplayed(LevelPlayAdInfo adInfo)
|
|
117
|
+
{
|
|
118
|
+
Debug.Log("Banner ad displayed");
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
private void OnAdDisplayFailed(LevelPlayAdInfo adInfo, LevelPlayAdError error)
|
|
122
|
+
{
|
|
123
|
+
Debug.LogError($"Banner ad display failed: {error.ErrorMessage}");
|
|
124
|
+
// Retry loading
|
|
125
|
+
Invoke(nameof(LoadBanner), 60f);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
private void OnAdClicked(LevelPlayAdInfo adInfo)
|
|
129
|
+
{
|
|
130
|
+
Debug.Log("Banner ad clicked");
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
private void OnAdExpanded(LevelPlayAdInfo adInfo)
|
|
134
|
+
{
|
|
135
|
+
Debug.Log("Banner ad expanded");
|
|
136
|
+
// Optionally pause game if banner expands to full screen
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
private void OnAdCollapsed(LevelPlayAdInfo adInfo)
|
|
140
|
+
{
|
|
141
|
+
Debug.Log("Banner ad collapsed");
|
|
142
|
+
// Resume game if paused
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
private void OnAdLeftApplication(LevelPlayAdInfo adInfo)
|
|
146
|
+
{
|
|
147
|
+
Debug.Log("Banner ad left application");
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Banner with Custom Configuration
|
|
153
|
+
|
|
154
|
+
Use the Config Builder pattern to customize banner size, position, and behavior:
|
|
155
|
+
|
|
156
|
+
```csharp
|
|
157
|
+
using UnityEngine;
|
|
158
|
+
using Unity.Services.LevelPlay;
|
|
159
|
+
|
|
160
|
+
public class CustomBannerAdManager : MonoBehaviour
|
|
161
|
+
{
|
|
162
|
+
private LevelPlayBannerAd bannerAd;
|
|
163
|
+
private string adUnitId = "YOUR_BANNER_AD_UNIT_ID";
|
|
164
|
+
|
|
165
|
+
void Start()
|
|
166
|
+
{
|
|
167
|
+
// Create config using Builder pattern
|
|
168
|
+
var configBuilder = new LevelPlayBannerAd.Config.Builder();
|
|
169
|
+
|
|
170
|
+
// Set banner size (UPPERCASE!)
|
|
171
|
+
configBuilder.SetSize(LevelPlayAdSize.LARGE); // 320x90
|
|
172
|
+
|
|
173
|
+
// Set position on screen
|
|
174
|
+
configBuilder.SetPosition(LevelPlayBannerPosition.BottomCenter);
|
|
175
|
+
|
|
176
|
+
// Auto-display when loaded
|
|
177
|
+
configBuilder.SetDisplayOnLoad(true);
|
|
178
|
+
|
|
179
|
+
// Respect safe area (Android only)
|
|
180
|
+
configBuilder.SetRespectSafeArea(true);
|
|
181
|
+
|
|
182
|
+
// Build the config
|
|
183
|
+
var bannerConfig = configBuilder.Build();
|
|
184
|
+
|
|
185
|
+
// Create banner with config
|
|
186
|
+
bannerAd = new LevelPlayBannerAd(adUnitId, bannerConfig);
|
|
187
|
+
|
|
188
|
+
// Register callbacks
|
|
189
|
+
bannerAd.OnAdLoaded += OnAdLoaded;
|
|
190
|
+
bannerAd.OnAdLoadFailed += OnAdLoadFailed;
|
|
191
|
+
bannerAd.OnAdDisplayed += OnAdDisplayed;
|
|
192
|
+
|
|
193
|
+
// Load banner
|
|
194
|
+
bannerAd.LoadAd();
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
void OnDestroy()
|
|
198
|
+
{
|
|
199
|
+
if (bannerAd != null)
|
|
200
|
+
{
|
|
201
|
+
bannerAd.OnAdLoaded -= OnAdLoaded;
|
|
202
|
+
bannerAd.OnAdLoadFailed -= OnAdLoadFailed;
|
|
203
|
+
bannerAd.OnAdDisplayed -= OnAdDisplayed;
|
|
204
|
+
bannerAd.DestroyAd();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
private void OnAdLoaded(LevelPlayAdInfo adInfo)
|
|
209
|
+
{
|
|
210
|
+
Debug.Log("Custom banner loaded");
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
private void OnAdLoadFailed(LevelPlayAdError error)
|
|
214
|
+
{
|
|
215
|
+
Debug.LogWarning($"Banner load failed: {error.ErrorMessage}");
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
private void OnAdDisplayed(LevelPlayAdInfo adInfo)
|
|
219
|
+
{
|
|
220
|
+
Debug.Log("Custom banner displayed");
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Advanced: Context-Aware Banner Management
|
|
226
|
+
|
|
227
|
+
Show banners only in appropriate scenes:
|
|
228
|
+
|
|
229
|
+
```csharp
|
|
230
|
+
using UnityEngine;
|
|
231
|
+
using UnityEngine.SceneManagement;
|
|
232
|
+
using Unity.Services.LevelPlay;
|
|
233
|
+
|
|
234
|
+
public class ContextAwareBannerManager : MonoBehaviour
|
|
235
|
+
{
|
|
236
|
+
private LevelPlayBannerAd bannerAd;
|
|
237
|
+
private string adUnitId = "YOUR_BANNER_AD_UNIT_ID";
|
|
238
|
+
|
|
239
|
+
// Scenes where banner should be shown
|
|
240
|
+
private string[] bannerEnabledScenes = { "MainMenu", "LevelSelect", "Shop" };
|
|
241
|
+
|
|
242
|
+
private bool isBannerLoaded = false;
|
|
243
|
+
|
|
244
|
+
void Start()
|
|
245
|
+
{
|
|
246
|
+
// Make this manager persist across scenes
|
|
247
|
+
DontDestroyOnLoad(gameObject);
|
|
248
|
+
|
|
249
|
+
// Create banner ad
|
|
250
|
+
bannerAd = new LevelPlayBannerAd(adUnitId);
|
|
251
|
+
|
|
252
|
+
// Register callbacks
|
|
253
|
+
bannerAd.OnAdLoaded += OnAdLoaded;
|
|
254
|
+
bannerAd.OnAdLoadFailed += OnAdLoadFailed;
|
|
255
|
+
|
|
256
|
+
// Register for scene changes
|
|
257
|
+
SceneManager.sceneLoaded += OnSceneLoaded;
|
|
258
|
+
|
|
259
|
+
// Load banner
|
|
260
|
+
bannerAd.LoadAd();
|
|
261
|
+
|
|
262
|
+
// Check initial scene
|
|
263
|
+
OnSceneLoaded(SceneManager.GetActiveScene(), LoadSceneMode.Single);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
void OnDestroy()
|
|
267
|
+
{
|
|
268
|
+
// Unregister callbacks
|
|
269
|
+
if (bannerAd != null)
|
|
270
|
+
{
|
|
271
|
+
bannerAd.OnAdLoaded -= OnAdLoaded;
|
|
272
|
+
bannerAd.OnAdLoadFailed -= OnAdLoadFailed;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
SceneManager.sceneLoaded -= OnSceneLoaded;
|
|
276
|
+
|
|
277
|
+
// Destroy banner
|
|
278
|
+
if (bannerAd != null)
|
|
279
|
+
{
|
|
280
|
+
bannerAd.DestroyAd();
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
|
|
285
|
+
{
|
|
286
|
+
if (ShouldShowBannerInScene(scene.name))
|
|
287
|
+
{
|
|
288
|
+
ShowBanner();
|
|
289
|
+
}
|
|
290
|
+
else
|
|
291
|
+
{
|
|
292
|
+
HideBanner();
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
private bool ShouldShowBannerInScene(string sceneName)
|
|
297
|
+
{
|
|
298
|
+
foreach (string enabledScene in bannerEnabledScenes)
|
|
299
|
+
{
|
|
300
|
+
if (sceneName == enabledScene)
|
|
301
|
+
{
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
private void ShowBanner()
|
|
309
|
+
{
|
|
310
|
+
if (isBannerLoaded && bannerAd != null)
|
|
311
|
+
{
|
|
312
|
+
bannerAd.ShowAd();
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
private void HideBanner()
|
|
317
|
+
{
|
|
318
|
+
if (bannerAd != null)
|
|
319
|
+
{
|
|
320
|
+
bannerAd.HideAd();
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
private void OnAdLoaded(LevelPlayAdInfo adInfo)
|
|
325
|
+
{
|
|
326
|
+
Debug.Log("Banner ad loaded");
|
|
327
|
+
isBannerLoaded = true;
|
|
328
|
+
|
|
329
|
+
// Show banner if we're in an enabled scene
|
|
330
|
+
if (ShouldShowBannerInScene(SceneManager.GetActiveScene().name))
|
|
331
|
+
{
|
|
332
|
+
ShowBanner();
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
private void OnAdLoadFailed(LevelPlayAdError error)
|
|
337
|
+
{
|
|
338
|
+
Debug.LogWarning($"Banner ad load failed: {error.ErrorMessage}");
|
|
339
|
+
isBannerLoaded = false;
|
|
340
|
+
Invoke(nameof(LoadBanner), 60f);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
private void LoadBanner()
|
|
344
|
+
{
|
|
345
|
+
if (bannerAd != null)
|
|
346
|
+
{
|
|
347
|
+
isBannerLoaded = false; // Reset flag when loading
|
|
348
|
+
bannerAd.LoadAd();
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
## API Reference
|
|
355
|
+
|
|
356
|
+
### Constructor
|
|
357
|
+
|
|
358
|
+
#### `new LevelPlayBannerAd(string adUnitId)`
|
|
359
|
+
Create a banner ad object with default configuration.
|
|
360
|
+
|
|
361
|
+
**Parameters:**
|
|
362
|
+
- `adUnitId`: The ad unit identifier from your LevelPlay dashboard
|
|
363
|
+
|
|
364
|
+
**Returns:** `LevelPlayBannerAd` object
|
|
365
|
+
|
|
366
|
+
**Usage:**
|
|
367
|
+
```csharp
|
|
368
|
+
LevelPlayBannerAd bannerAd = new LevelPlayBannerAd("your_ad_unit_id");
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
**Default behavior:**
|
|
372
|
+
- Size: Standard banner (320x50)
|
|
373
|
+
- Position: Bottom center
|
|
374
|
+
- DisplayOnLoad: true (banner shows automatically when loaded)
|
|
375
|
+
|
|
376
|
+
**Important:** Call this only after `LevelPlay.Init()` has completed successfully.
|
|
377
|
+
|
|
378
|
+
#### `new LevelPlayBannerAd(string adUnitId, Config config)`
|
|
379
|
+
Create a banner ad object with custom configuration.
|
|
380
|
+
|
|
381
|
+
**Parameters:**
|
|
382
|
+
- `adUnitId`: The ad unit identifier
|
|
383
|
+
- `config`: Configuration object built using Config.Builder()
|
|
384
|
+
|
|
385
|
+
**Usage:**
|
|
386
|
+
```csharp
|
|
387
|
+
var configBuilder = new LevelPlayBannerAd.Config.Builder();
|
|
388
|
+
configBuilder.SetSize(LevelPlayAdSize.LARGE);
|
|
389
|
+
configBuilder.SetPosition(LevelPlayBannerPosition.TopCenter);
|
|
390
|
+
var config = configBuilder.Build();
|
|
391
|
+
|
|
392
|
+
LevelPlayBannerAd bannerAd = new LevelPlayBannerAd("your_ad_unit_id", config);
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
### Configuration Builder
|
|
396
|
+
|
|
397
|
+
#### `LevelPlayBannerAd.Config.Builder()`
|
|
398
|
+
Create a configuration builder for customizing banner behavior.
|
|
399
|
+
|
|
400
|
+
**Methods:**
|
|
401
|
+
|
|
402
|
+
**`SetSize(LevelPlayAdSize size)`**
|
|
403
|
+
Set the banner size.
|
|
404
|
+
|
|
405
|
+
**Usage:**
|
|
406
|
+
```csharp
|
|
407
|
+
configBuilder.SetSize(LevelPlayAdSize.BANNER); // 320x50
|
|
408
|
+
configBuilder.SetSize(LevelPlayAdSize.LARGE); // 320x90
|
|
409
|
+
configBuilder.SetSize(LevelPlayAdSize.MEDIUM_RECTANGLE); // 300x250
|
|
410
|
+
configBuilder.SetSize(LevelPlayAdSize.LEADERBOARD); // 728x90
|
|
411
|
+
configBuilder.SetSize(LevelPlayAdSize.CreateAdaptiveAdSize()); // Adaptive
|
|
412
|
+
configBuilder.SetSize(LevelPlayAdSize.CreateCustomBannerSize(300, 150)); // Custom size
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
**`SetPosition(LevelPlayBannerPosition position)`**
|
|
416
|
+
Set the banner position on screen.
|
|
417
|
+
|
|
418
|
+
**Usage:**
|
|
419
|
+
```csharp
|
|
420
|
+
configBuilder.SetPosition(LevelPlayBannerPosition.TopCenter);
|
|
421
|
+
configBuilder.SetPosition(LevelPlayBannerPosition.BottomCenter);
|
|
422
|
+
// Also: TopLeft, TopRight, BottomLeft, BottomRight
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
**`SetDisplayOnLoad(bool displayOnLoad)`**
|
|
426
|
+
Whether to automatically show banner when loaded.
|
|
427
|
+
|
|
428
|
+
**Usage:**
|
|
429
|
+
```csharp
|
|
430
|
+
configBuilder.SetDisplayOnLoad(true); // Auto-show (default)
|
|
431
|
+
configBuilder.SetDisplayOnLoad(false); // Manual show
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
**`SetRespectSafeArea(bool respectSafeArea)`**
|
|
435
|
+
Whether to respect device safe area (Android only).
|
|
436
|
+
|
|
437
|
+
**Usage:**
|
|
438
|
+
```csharp
|
|
439
|
+
configBuilder.SetRespectSafeArea(true); // Avoid notches/cutouts
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
**`SetPlacementName(string placementName)`**
|
|
443
|
+
Set the placement name for analytics tracking.
|
|
444
|
+
|
|
445
|
+
**Usage:**
|
|
446
|
+
```csharp
|
|
447
|
+
configBuilder.SetPlacementName("main_menu_banner");
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
**When to use:** When tracking multiple banner placements for analytics and reporting.
|
|
451
|
+
|
|
452
|
+
**Set minimum bid price:**
|
|
453
|
+
```csharp
|
|
454
|
+
configBuilder.SetBidFloor(1.0); // Minimum bid price in USD ($1.00 CPM)
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
**When to use:** Set a minimum bid price in USD for ad requests to ensure revenue floor.
|
|
458
|
+
|
|
459
|
+
**`Build()`**
|
|
460
|
+
Build the configuration object.
|
|
461
|
+
|
|
462
|
+
**Usage:**
|
|
463
|
+
```csharp
|
|
464
|
+
var config = configBuilder.Build();
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
### Core Methods
|
|
468
|
+
|
|
469
|
+
#### `LoadAd()`
|
|
470
|
+
Load a banner ad.
|
|
471
|
+
|
|
472
|
+
**Usage:**
|
|
473
|
+
```csharp
|
|
474
|
+
bannerAd.LoadAd();
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
**Note:** After loading succeeds, you can call `ShowAd()` to display it (unless `SetDisplayOnLoad(true)` was used).
|
|
478
|
+
|
|
479
|
+
#### `ShowAd()`
|
|
480
|
+
Show the banner ad.
|
|
481
|
+
|
|
482
|
+
**Usage:**
|
|
483
|
+
```csharp
|
|
484
|
+
bannerAd.ShowAd();
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
**Note:** Banner must be loaded first.
|
|
488
|
+
|
|
489
|
+
#### `HideAd()`
|
|
490
|
+
Hide the banner ad without destroying it.
|
|
491
|
+
|
|
492
|
+
**Usage:**
|
|
493
|
+
```csharp
|
|
494
|
+
bannerAd.HideAd();
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
**When to use:** Temporarily hide banner (e.g., during gameplay) while keeping it loaded for quick re-display.
|
|
498
|
+
|
|
499
|
+
#### `DestroyAd()`
|
|
500
|
+
Destroy the banner ad and free resources.
|
|
501
|
+
|
|
502
|
+
**Usage:**
|
|
503
|
+
```csharp
|
|
504
|
+
bannerAd.DestroyAd();
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
**When to use:** When leaving a scene where banner was shown, or when switching to a different banner size.
|
|
508
|
+
|
|
509
|
+
**Note on IsAdReady():** Unlike Rewarded and Interstitial ads, Banner ads do NOT have an `IsAdReady()` method. Banners are ready to show immediately after `OnAdLoaded` fires. Simply call `ShowAd()` in the `OnAdLoaded` callback or afterward.
|
|
510
|
+
|
|
511
|
+
#### `PauseAutoRefresh()`
|
|
512
|
+
Pause automatic banner refresh.
|
|
513
|
+
|
|
514
|
+
**Usage:**
|
|
515
|
+
```csharp
|
|
516
|
+
bannerAd.PauseAutoRefresh();
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
**When to use:** When banner is not visible but still loaded (e.g., during gameplay).
|
|
520
|
+
|
|
521
|
+
#### `ResumeAutoRefresh()`
|
|
522
|
+
Resume automatic banner refresh.
|
|
523
|
+
|
|
524
|
+
**Usage:**
|
|
525
|
+
```csharp
|
|
526
|
+
bannerAd.ResumeAutoRefresh();
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
**When to use:** When banner becomes visible again after pausing.
|
|
530
|
+
|
|
531
|
+
### Banner Sizes
|
|
532
|
+
|
|
533
|
+
Available banner sizes from `LevelPlayAdSize` (note: **UPPERCASE**):
|
|
534
|
+
|
|
535
|
+
| Size | Description | Typical Dimensions |
|
|
536
|
+
|------|-------------|-------------------|
|
|
537
|
+
| `LevelPlayAdSize.BANNER` | Standard banner | 320x50 |
|
|
538
|
+
| `LevelPlayAdSize.LARGE` | Large banner | 320x90 |
|
|
539
|
+
| `LevelPlayAdSize.MEDIUM_RECTANGLE` | Medium rectangle | 300x250 |
|
|
540
|
+
| `LevelPlayAdSize.LEADERBOARD` | Leaderboard banner | 728x90 |
|
|
541
|
+
| `LevelPlayAdSize.CreateAdaptiveAdSize()` | Adaptive banner | Adapts to screen width |
|
|
542
|
+
| `LevelPlayAdSize.CreateCustomBannerSize(int width, int height)` | Custom size | Custom dimensions |
|
|
543
|
+
|
|
544
|
+
**Usage:**
|
|
545
|
+
```csharp
|
|
546
|
+
// Standard banner (most common)
|
|
547
|
+
LevelPlayAdSize.BANNER
|
|
548
|
+
|
|
549
|
+
// Large banner
|
|
550
|
+
LevelPlayAdSize.LARGE
|
|
551
|
+
|
|
552
|
+
// Medium rectangle
|
|
553
|
+
LevelPlayAdSize.MEDIUM_RECTANGLE
|
|
554
|
+
|
|
555
|
+
// Leaderboard
|
|
556
|
+
LevelPlayAdSize.LEADERBOARD
|
|
557
|
+
|
|
558
|
+
// Adaptive banner (method call)
|
|
559
|
+
LevelPlayAdSize.CreateAdaptiveAdSize()
|
|
560
|
+
|
|
561
|
+
// Custom size
|
|
562
|
+
LevelPlayAdSize.CreateCustomBannerSize(300, 150)
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
**Recommendation:** Use `BANNER` (320x50) for most cases. Use `CreateAdaptiveAdSize()` for adaptive sizing across devices.
|
|
566
|
+
|
|
567
|
+
**LevelPlayAdSize Properties (SDK 8.8.0+):**
|
|
568
|
+
|
|
569
|
+
After setting a banner size, you can query the actual dimensions:
|
|
570
|
+
|
|
571
|
+
```csharp
|
|
572
|
+
LevelPlayAdSize adSize = LevelPlayAdSize.BANNER;
|
|
573
|
+
int width = adSize.Width; // e.g., 320
|
|
574
|
+
int height = adSize.Height; // e.g., 50
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
**Properties:**
|
|
578
|
+
- `Width` (int): Banner width in pixels
|
|
579
|
+
- `Height` (int): Banner height in pixels
|
|
580
|
+
|
|
581
|
+
**When to use:** When calculating UI layout offsets or positioning other UI elements around the banner.
|
|
582
|
+
|
|
583
|
+
### Banner Positions
|
|
584
|
+
|
|
585
|
+
Available positions from `LevelPlayBannerPosition`:
|
|
586
|
+
|
|
587
|
+
| Position | Description |
|
|
588
|
+
|----------|-------------|
|
|
589
|
+
| `TopLeft` | Top-left corner |
|
|
590
|
+
| `TopCenter` | Top-center |
|
|
591
|
+
| `TopRight` | Top-right corner |
|
|
592
|
+
| `CenterLeft` | Center-left |
|
|
593
|
+
| `Center` | Center |
|
|
594
|
+
| `CenterRight` | Center-right |
|
|
595
|
+
| `BottomLeft` | Bottom-left corner |
|
|
596
|
+
| `BottomCenter` | Bottom-center (most common) |
|
|
597
|
+
| `BottomRight` | Bottom-right corner |
|
|
598
|
+
|
|
599
|
+
**Usage:**
|
|
600
|
+
```csharp
|
|
601
|
+
LevelPlayBannerPosition.BottomCenter
|
|
602
|
+
LevelPlayBannerPosition.TopCenter
|
|
603
|
+
LevelPlayBannerPosition.Center
|
|
604
|
+
// etc.
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
**Additional:** Custom positioning can be achieved using a Vector2 constructor.
|
|
608
|
+
|
|
609
|
+
**Recommendation:** `BottomCenter` is less intrusive and more commonly used.
|
|
610
|
+
|
|
611
|
+
### Events
|
|
612
|
+
|
|
613
|
+
All events are properties of the `LevelPlayBannerAd` object.
|
|
614
|
+
|
|
615
|
+
**Threading:** All ad callbacks run on the Unity main thread, so you can safely call Unity APIs (update UI, access GameObjects, etc.) directly in these callbacks. This is different from the ILRD impression callback (see `references/ilrd-api.md`), which runs on a background thread.
|
|
616
|
+
|
|
617
|
+
#### `OnAdLoaded`
|
|
618
|
+
Fired when a banner ad is loaded.
|
|
619
|
+
|
|
620
|
+
**Signature:** `event Action<LevelPlayAdInfo>`
|
|
621
|
+
|
|
622
|
+
**Usage:**
|
|
623
|
+
```csharp
|
|
624
|
+
bannerAd.OnAdLoaded += (adInfo) =>
|
|
625
|
+
{
|
|
626
|
+
Debug.Log("Banner loaded");
|
|
627
|
+
bannerAd.ShowAd();
|
|
628
|
+
};
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
#### `OnAdLoadFailed`
|
|
632
|
+
Fired when a banner ad fails to load.
|
|
633
|
+
|
|
634
|
+
**Signature:** `event Action<LevelPlayAdError>`
|
|
635
|
+
|
|
636
|
+
**Usage:**
|
|
637
|
+
```csharp
|
|
638
|
+
bannerAd.OnAdLoadFailed += (error) =>
|
|
639
|
+
{
|
|
640
|
+
Debug.LogWarning($"Banner load failed: {error.ErrorMessage}");
|
|
641
|
+
};
|
|
642
|
+
```
|
|
643
|
+
|
|
644
|
+
#### `OnAdDisplayed`
|
|
645
|
+
Fired when banner ad is displayed.
|
|
646
|
+
|
|
647
|
+
**Signature:** `event Action<LevelPlayAdInfo>`
|
|
648
|
+
|
|
649
|
+
**Usage:**
|
|
650
|
+
```csharp
|
|
651
|
+
bannerAd.OnAdDisplayed += (adInfo) =>
|
|
652
|
+
{
|
|
653
|
+
Debug.Log("Banner displayed");
|
|
654
|
+
};
|
|
655
|
+
```
|
|
656
|
+
|
|
657
|
+
#### `OnAdDisplayFailed`
|
|
658
|
+
Fired when banner ad fails to display.
|
|
659
|
+
|
|
660
|
+
**Signature:** `event Action<LevelPlayAdInfo, LevelPlayAdError>`
|
|
661
|
+
|
|
662
|
+
**Usage:**
|
|
663
|
+
```csharp
|
|
664
|
+
bannerAd.OnAdDisplayFailed += (adInfo, error) =>
|
|
665
|
+
{
|
|
666
|
+
Debug.LogError($"Banner display failed: {error.ErrorMessage}");
|
|
667
|
+
};
|
|
668
|
+
```
|
|
669
|
+
|
|
670
|
+
#### `OnAdClicked`
|
|
671
|
+
Fired when user clicks on the banner.
|
|
672
|
+
|
|
673
|
+
**Signature:** `event Action<LevelPlayAdInfo>`
|
|
674
|
+
|
|
675
|
+
**Usage:**
|
|
676
|
+
```csharp
|
|
677
|
+
bannerAd.OnAdClicked += (adInfo) =>
|
|
678
|
+
{
|
|
679
|
+
Debug.Log("Banner clicked");
|
|
680
|
+
};
|
|
681
|
+
```
|
|
682
|
+
|
|
683
|
+
#### `OnAdExpanded`
|
|
684
|
+
Fired when banner ad expands to full screen (e.g., after click).
|
|
685
|
+
|
|
686
|
+
**Signature:** `event Action<LevelPlayAdInfo>`
|
|
687
|
+
|
|
688
|
+
**Usage:**
|
|
689
|
+
```csharp
|
|
690
|
+
bannerAd.OnAdExpanded += (adInfo) =>
|
|
691
|
+
{
|
|
692
|
+
Debug.Log("Banner expanded");
|
|
693
|
+
// Pause game if needed
|
|
694
|
+
};
|
|
695
|
+
```
|
|
696
|
+
|
|
697
|
+
#### `OnAdCollapsed`
|
|
698
|
+
Fired when expanded banner collapses back.
|
|
699
|
+
|
|
700
|
+
**Signature:** `event Action<LevelPlayAdInfo>`
|
|
701
|
+
|
|
702
|
+
**Usage:**
|
|
703
|
+
```csharp
|
|
704
|
+
bannerAd.OnAdCollapsed += (adInfo) =>
|
|
705
|
+
{
|
|
706
|
+
Debug.Log("Banner collapsed");
|
|
707
|
+
// Resume game if paused
|
|
708
|
+
};
|
|
709
|
+
```
|
|
710
|
+
|
|
711
|
+
#### `OnAdLeftApplication`
|
|
712
|
+
Fired when banner click causes user to leave the application.
|
|
713
|
+
|
|
714
|
+
**Signature:** `event Action<LevelPlayAdInfo>`
|
|
715
|
+
|
|
716
|
+
**Usage:**
|
|
717
|
+
```csharp
|
|
718
|
+
bannerAd.OnAdLeftApplication += (adInfo) =>
|
|
719
|
+
{
|
|
720
|
+
Debug.Log("Banner left application");
|
|
721
|
+
};
|
|
722
|
+
```
|
|
723
|
+
|
|
724
|
+
## Data Types
|
|
725
|
+
|
|
726
|
+
### LevelPlayAdInfo
|
|
727
|
+
|
|
728
|
+
Contains information about the ad.
|
|
729
|
+
|
|
730
|
+
**Properties:**
|
|
731
|
+
- `AdId` (string): Unique identifier for this specific ad instance
|
|
732
|
+
- `AdUnitId` (string): The ad unit identifier
|
|
733
|
+
- `AdUnitName` (string): The ad unit name
|
|
734
|
+
- `AdSize` (LevelPlayAdSize): The ad size (may be null; banner-relevant)
|
|
735
|
+
- `AdFormat` (string): The ad format (e.g., "BANNER")
|
|
736
|
+
- `PlacementName` (string): Placement name where ad was shown
|
|
737
|
+
- `AuctionId` (string): Unique auction identifier
|
|
738
|
+
- `CreativeId` (string): Creative identifier
|
|
739
|
+
- `Country` (string): User's country code (ISO 3166-1)
|
|
740
|
+
- `Ab` (string): A/B test segment identifier
|
|
741
|
+
- `SegmentName` (string): User segment name
|
|
742
|
+
- `AdNetwork` (string): Ad network that served the ad
|
|
743
|
+
- `InstanceName` (string): Ad network instance name
|
|
744
|
+
- `InstanceId` (string): Ad network instance identifier
|
|
745
|
+
- `Revenue` (double?): Estimated revenue in USD (nullable - check for null)
|
|
746
|
+
- `Precision` (string): Revenue precision level
|
|
747
|
+
- `EncryptedCPM` (string): Encrypted CPM value
|
|
748
|
+
|
|
749
|
+
### LevelPlayAdError
|
|
750
|
+
|
|
751
|
+
Contains error information when ad operations fail.
|
|
752
|
+
|
|
753
|
+
**Properties:**
|
|
754
|
+
- `ErrorCode` (int): Numeric error code
|
|
755
|
+
- `ErrorMessage` (string): Human-readable error description
|
|
756
|
+
- `AdUnitId` (string): The ad unit identifier where the error occurred
|
|
757
|
+
- `AdId` (string): Unique identifier for the specific ad instance
|
|
758
|
+
|
|
759
|
+
## Best Practices
|
|
760
|
+
|
|
761
|
+
### Loading
|
|
762
|
+
|
|
763
|
+
- Load banners when entering scenes where they'll be displayed
|
|
764
|
+
- Destroy banners when leaving those scenes to free memory
|
|
765
|
+
- Only one banner per ad unit can be active at a time
|
|
766
|
+
- If you need to change size/position, destroy and recreate
|
|
767
|
+
|
|
768
|
+
### Placement
|
|
769
|
+
|
|
770
|
+
- **Bottom position** is generally less intrusive than top
|
|
771
|
+
- **Avoid during gameplay** - show in menus, waiting screens
|
|
772
|
+
- **Consider UI overlap** - ensure banner doesn't cover important UI
|
|
773
|
+
- **Test on various screen sizes** - especially important for mobile
|
|
774
|
+
|
|
775
|
+
### Visibility Management
|
|
776
|
+
|
|
777
|
+
- Use `HideAd()` / `ShowAd()` for temporary visibility changes
|
|
778
|
+
- Use `DestroyAd()` when permanently done with banner (frees memory)
|
|
779
|
+
- Hide banners during gameplay for UX-focused strategy
|
|
780
|
+
- Show banners persistently for revenue-focused strategy
|
|
781
|
+
|
|
782
|
+
### Auto-Refresh Management
|
|
783
|
+
|
|
784
|
+
- Use `PauseAutoRefresh()` when banner is hidden
|
|
785
|
+
- Use `ResumeAutoRefresh()` when banner is shown again
|
|
786
|
+
|
|
787
|
+
**Example:**
|
|
788
|
+
```csharp
|
|
789
|
+
void OnGameplayStart()
|
|
790
|
+
{
|
|
791
|
+
bannerAd.HideAd();
|
|
792
|
+
bannerAd.PauseAutoRefresh();
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
void OnGameplayEnd()
|
|
796
|
+
{
|
|
797
|
+
bannerAd.ShowAd();
|
|
798
|
+
bannerAd.ResumeAutoRefresh();
|
|
799
|
+
}
|
|
800
|
+
```
|
|
801
|
+
|
|
802
|
+
### Memory Management
|
|
803
|
+
|
|
804
|
+
- Always call `DestroyAd()` in `OnDestroy()` or when leaving scene
|
|
805
|
+
- Don't keep banners loaded in scenes where they're not displayed
|
|
806
|
+
- Unsubscribe from events properly
|
|
807
|
+
|
|
808
|
+
```csharp
|
|
809
|
+
void OnDestroy()
|
|
810
|
+
{
|
|
811
|
+
if (bannerAd != null)
|
|
812
|
+
{
|
|
813
|
+
bannerAd.DestroyAd();
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
```
|
|
817
|
+
|
|
818
|
+
### UX Considerations
|
|
819
|
+
|
|
820
|
+
- Banners can be distracting during gameplay
|
|
821
|
+
- Best practice: Show in menus, hide during gameplay
|
|
822
|
+
- For revenue-focused: Show persistently but position carefully
|
|
823
|
+
- Test with actual users to gauge impact on experience
|
|
824
|
+
|
|
825
|
+
## Common Issues
|
|
826
|
+
|
|
827
|
+
### Issue: Repeated LoadAd() calls
|
|
828
|
+
|
|
829
|
+
**Cause:** Calling `LoadAd()` more than once on the same banner object — in `Update()`, on scene re-entry, or to manually refresh the creative.
|
|
830
|
+
|
|
831
|
+
**Common mistake:**
|
|
832
|
+
```csharp
|
|
833
|
+
void Update()
|
|
834
|
+
{
|
|
835
|
+
// WRONG - Don't call LoadAd() in Update(); it runs every frame
|
|
836
|
+
bannerAd.LoadAd();
|
|
837
|
+
}
|
|
838
|
+
```
|
|
839
|
+
|
|
840
|
+
**Why to avoid:** A banner object takes exactly one `LoadAd()` call for its lifetime, whether or not auto-refresh is enabled. New creatives come from auto-refresh (based on your platform settings), and visibility is controlled with `ShowAd()`/`HideAd()` — never by reloading. Banner ads don't throw errors for repeated loads like interstitial/rewarded ads do, but extra `LoadAd()` calls waste resources and can cause unexpected behavior.
|
|
841
|
+
|
|
842
|
+
**Solution:** Call `LoadAd()` once after creating the banner:
|
|
843
|
+
```csharp
|
|
844
|
+
void Start()
|
|
845
|
+
{
|
|
846
|
+
bannerAd = new LevelPlayBannerAd(adUnitId);
|
|
847
|
+
bannerAd.OnAdLoaded += OnAdLoaded;
|
|
848
|
+
bannerAd.OnAdLoadFailed += OnAdLoadFailed;
|
|
849
|
+
bannerAd.LoadAd(); // The only LoadAd() for this object's lifetime
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
void OnAdLoadFailed(LevelPlayAdError error)
|
|
853
|
+
{
|
|
854
|
+
// Optionally retry after delay
|
|
855
|
+
Invoke(nameof(RetryLoad), 5f);
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
void RetryLoad()
|
|
859
|
+
{
|
|
860
|
+
bannerAd.LoadAd();
|
|
861
|
+
}
|
|
862
|
+
```
|
|
863
|
+
|
|
864
|
+
**Note:** The failure retry above is the only case where calling `LoadAd()` again on the same object is correct. After `DestroyAd()`, create a new banner object and give it its own single `LoadAd()`.
|
|
865
|
+
|
|
866
|
+
### Issue: Banner overlaps UI elements
|
|
867
|
+
|
|
868
|
+
**Solutions:**
|
|
869
|
+
- Calculate banner height and offset UI elements
|
|
870
|
+
- Use `Canvas.offsetMin` or `RectTransform.anchoredPosition` to create spacing
|
|
871
|
+
- Test on different screen sizes
|
|
872
|
+
- Use `SetRespectSafeArea(true)` to avoid notches
|
|
873
|
+
|
|
874
|
+
### Issue: Banner not showing
|
|
875
|
+
|
|
876
|
+
**Possible causes:**
|
|
877
|
+
- SDK not initialized before creating banner
|
|
878
|
+
- Banner not loaded before calling `ShowAd()`
|
|
879
|
+
- Banner is hidden with `HideAd()`
|
|
880
|
+
- `SetDisplayOnLoad(false)` used without manual `ShowAd()`
|
|
881
|
+
|
|
882
|
+
**Solutions:**
|
|
883
|
+
- Create banner only after `OnInitSuccess` callback
|
|
884
|
+
- Ensure `LoadAd()` is called and `OnAdLoaded` fires before `ShowAd()`
|
|
885
|
+
- Check banner visibility state
|
|
886
|
+
|
|
887
|
+
### Issue: Banner shows in wrong scenes
|
|
888
|
+
|
|
889
|
+
**Solutions:**
|
|
890
|
+
- Implement scene-based visibility management
|
|
891
|
+
- Destroy banner when leaving scenes where it shouldn't appear
|
|
892
|
+
- Use `SceneManager.sceneLoaded` event for automatic management
|
|
893
|
+
|
|
894
|
+
### Issue: Wrong banner size
|
|
895
|
+
|
|
896
|
+
**Possible causes:**
|
|
897
|
+
- Using lowercase enum values (e.g., `.Banner` instead of `.BANNER`)
|
|
898
|
+
- Not using Config Builder to set size
|
|
899
|
+
|
|
900
|
+
**Solutions:**
|
|
901
|
+
- Always use UPPERCASE: `LevelPlayAdSize.BANNER`, not `.Banner`
|
|
902
|
+
- Use Config Builder to explicitly set size:
|
|
903
|
+
```csharp
|
|
904
|
+
var config = new LevelPlayBannerAd.Config.Builder()
|
|
905
|
+
.SetSize(LevelPlayAdSize.LARGE)
|
|
906
|
+
.Build();
|
|
907
|
+
```
|
|
908
|
+
|
|
909
|
+
## Testing Checklist
|
|
910
|
+
|
|
911
|
+
- [ ] Banner loads and displays correctly
|
|
912
|
+
- [ ] Banner appears in correct position (top/bottom)
|
|
913
|
+
- [ ] Banner size is appropriate for screen
|
|
914
|
+
- [ ] Banner doesn't overlap important UI
|
|
915
|
+
- [ ] Banner hides/shows correctly
|
|
916
|
+
- [ ] Banner destroys properly when leaving scene
|
|
917
|
+
- [ ] Banner works on different screen sizes/orientations
|
|
918
|
+
- [ ] Retry logic works if banner fails to load
|
|
919
|
+
- [ ] Auto-refresh pauses/resumes correctly
|
|
920
|
+
- [ ] Safe area respected on devices with notches (Android)
|