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.
Files changed (278) hide show
  1. package/.claude/agents/nccgs-accessibility-specialist.md +26 -0
  2. package/.claude/agents/nccgs-adversarial-reviewer.md +26 -0
  3. package/.claude/agents/nccgs-ai-programmer.md +26 -0
  4. package/.claude/agents/nccgs-analytics-engineer.md +26 -0
  5. package/.claude/agents/nccgs-art-direction-lead.md +26 -0
  6. package/.claude/agents/nccgs-audio-direction-lead.md +26 -0
  7. package/.claude/agents/nccgs-creative-director.md +26 -0
  8. package/.claude/agents/nccgs-documentation-manager.md +26 -0
  9. package/.claude/agents/nccgs-economy-designer.md +26 -0
  10. package/.claude/agents/nccgs-engine-programmer.md +26 -0
  11. package/.claude/agents/nccgs-game-design-lead.md +26 -0
  12. package/.claude/agents/nccgs-game-designer.md +26 -0
  13. package/.claude/agents/nccgs-gameplay-programmer.md +26 -0
  14. package/.claude/agents/nccgs-level-designer.md +26 -0
  15. package/.claude/agents/nccgs-live-ops-designer.md +26 -0
  16. package/.claude/agents/nccgs-localization-lead.md +26 -0
  17. package/.claude/agents/nccgs-narrative-lead.md +26 -0
  18. package/.claude/agents/nccgs-network-programmer.md +26 -0
  19. package/.claude/agents/nccgs-performance-analyst.md +26 -0
  20. package/.claude/agents/nccgs-producer.md +26 -0
  21. package/.claude/agents/nccgs-production-coordinator.md +23 -0
  22. package/.claude/agents/nccgs-programming-lead.md +26 -0
  23. package/.claude/agents/nccgs-prototyper.md +26 -0
  24. package/.claude/agents/nccgs-qa-engineer.md +26 -0
  25. package/.claude/agents/nccgs-qa-lead.md +26 -0
  26. package/.claude/agents/nccgs-release-engineer.md +26 -0
  27. package/.claude/agents/nccgs-release-lead.md +26 -0
  28. package/.claude/agents/nccgs-security-engineer.md +26 -0
  29. package/.claude/agents/nccgs-sound-designer.md +26 -0
  30. package/.claude/agents/nccgs-systems-designer.md +26 -0
  31. package/.claude/agents/nccgs-technical-architect.md +26 -0
  32. package/.claude/agents/nccgs-technical-artist.md +26 -0
  33. package/.claude/agents/nccgs-technical-director.md +26 -0
  34. package/.claude/agents/nccgs-tools-programmer.md +26 -0
  35. package/.claude/agents/nccgs-ui-programmer.md +26 -0
  36. package/.claude/agents/nccgs-unity-build-specialist.md +26 -0
  37. package/.claude/agents/nccgs-unity-content-specialist.md +26 -0
  38. package/.claude/agents/nccgs-unity-implementer.md +26 -0
  39. package/.claude/agents/nccgs-unity-rendering-specialist.md +26 -0
  40. package/.claude/agents/nccgs-unity-systems-specialist.md +26 -0
  41. package/.claude/agents/nccgs-unity-ui-specialist.md +26 -0
  42. package/.claude/agents/nccgs-ux-designer.md +26 -0
  43. package/.claude/agents/nccgs-verification-engineer.md +26 -0
  44. package/.claude/agents/nccgs-world-builder.md +26 -0
  45. package/.claude/agents/nccgs-writer.md +26 -0
  46. package/.claude/nccgs/THIRD_PARTY_NOTICES.md +13 -0
  47. package/.claude/nccgs/VERSION +1 -0
  48. package/.claude/nccgs/constitution.md +131 -0
  49. package/.claude/nccgs/hooks/agent-audit.mjs +10 -0
  50. package/.claude/nccgs/hooks/common.mjs +41 -0
  51. package/.claude/nccgs/hooks/post-compact.mjs +1 -0
  52. package/.claude/nccgs/hooks/pre-compact.mjs +8 -0
  53. package/.claude/nccgs/hooks/protect-git.mjs +22 -0
  54. package/.claude/nccgs/hooks/protect-write.mjs +17 -0
  55. package/.claude/nccgs/hooks/session-start.mjs +15 -0
  56. package/.claude/nccgs/hooks/session-stop.mjs +7 -0
  57. package/.claude/nccgs/protocols/agent-contract.md +34 -0
  58. package/.claude/nccgs/protocols/context-packets.md +13 -0
  59. package/.claude/nccgs/protocols/evidence.md +15 -0
  60. package/.claude/nccgs/protocols/model-routing.md +22 -0
  61. package/.claude/nccgs/protocols/orchestration.md +26 -0
  62. package/.claude/nccgs/protocols/unity-boundary.md +11 -0
  63. package/.claude/nccgs/settings.fragment.json +77 -0
  64. package/.claude/nccgs/studio.json +347 -0
  65. package/.claude/nccgs/tools/configure-models.mjs +39 -0
  66. package/.claude/nccgs/unity-skills-manifest.json +727 -0
  67. package/.claude/nccgs/workflow-catalog.json +317 -0
  68. package/.claude/rules/nccgs-canonical-docs.md +19 -0
  69. package/.claude/rules/nccgs-editor-tools.md +12 -0
  70. package/.claude/rules/nccgs-localization.md +12 -0
  71. package/.claude/rules/nccgs-networking.md +13 -0
  72. package/.claude/rules/nccgs-performance.md +14 -0
  73. package/.claude/rules/nccgs-rendering.md +16 -0
  74. package/.claude/rules/nccgs-security.md +13 -0
  75. package/.claude/rules/nccgs-tests.md +18 -0
  76. package/.claude/rules/nccgs-ui.md +14 -0
  77. package/.claude/rules/nccgs-unity-assets.md +21 -0
  78. package/.claude/rules/nccgs-unity-code.md +22 -0
  79. package/.claude/skills/accessibility-review/SKILL.md +14 -0
  80. package/.claude/skills/architecture-decision/SKILL.md +14 -0
  81. package/.claude/skills/asset-audit/SKILL.md +14 -0
  82. package/.claude/skills/audit/SKILL.md +16 -0
  83. package/.claude/skills/audit/references/dimensions.md +46 -0
  84. package/.claude/skills/balance-review/SKILL.md +14 -0
  85. package/.claude/skills/bug-triage/SKILL.md +14 -0
  86. package/.claude/skills/build-live-game/SKILL.md +317 -0
  87. package/.claude/skills/build-live-game/references/achievements.md +779 -0
  88. package/.claude/skills/build-live-game/references/apis.md +280 -0
  89. package/.claude/skills/build-live-game/references/authentication.md +437 -0
  90. package/.claude/skills/build-live-game/references/battlepass.md +860 -0
  91. package/.claude/skills/build-live-game/references/cloud-code.md +563 -0
  92. package/.claude/skills/build-live-game/references/cloud-save.md +474 -0
  93. package/.claude/skills/build-live-game/references/deployment.md +216 -0
  94. package/.claude/skills/build-live-game/references/player-account.md +813 -0
  95. package/.claude/skills/build-live-game/references/remote-config.md +96 -0
  96. package/.claude/skills/build-live-game/references/tooling.md +431 -0
  97. package/.claude/skills/closure/SKILL.md +14 -0
  98. package/.claude/skills/code-review/SKILL.md +14 -0
  99. package/.claude/skills/compatibility-review/SKILL.md +14 -0
  100. package/.claude/skills/context-pack/SKILL.md +14 -0
  101. package/.claude/skills/dependency-review/SKILL.md +14 -0
  102. package/.claude/skills/design/SKILL.md +20 -0
  103. package/.claude/skills/design-review/SKILL.md +14 -0
  104. package/.claude/skills/evidence-review/SKILL.md +14 -0
  105. package/.claude/skills/hotfix/SKILL.md +14 -0
  106. package/.claude/skills/implement-in-app-purchases/README.md +233 -0
  107. package/.claude/skills/implement-in-app-purchases/SKILL.md +158 -0
  108. package/.claude/skills/implement-in-app-purchases/references/api-notes.md +562 -0
  109. package/.claude/skills/implement-in-app-purchases/references/codeless-catalog.md +331 -0
  110. package/.claude/skills/implement-in-app-purchases/references/convert-adapty.md +268 -0
  111. package/.claude/skills/implement-in-app-purchases/references/convert-essentialkit.md +239 -0
  112. package/.claude/skills/implement-in-app-purchases/references/convert-revenuecat.md +275 -0
  113. package/.claude/skills/implement-in-app-purchases/references/convert-unipay.md +145 -0
  114. package/.claude/skills/implement-in-app-purchases/references/migration-v4-to-v5.md +204 -0
  115. package/.claude/skills/implement-in-app-purchases/references/path-add-iap-to-new-project.md +198 -0
  116. package/.claude/skills/implement-in-app-purchases/references/path-convert-native-google-billing.md +356 -0
  117. package/.claude/skills/implement-in-app-purchases/references/path-convert-native-storekit.md +446 -0
  118. package/.claude/skills/implement-in-app-purchases/references/path-implement-iap-d2c.md +680 -0
  119. package/.claude/skills/implement-in-app-purchases/references/platform-notes.md +204 -0
  120. package/.claude/skills/implement-in-app-purchases/references/pre-check.md +205 -0
  121. package/.claude/skills/incident-recovery/SKILL.md +14 -0
  122. package/.claude/skills/initialize-ai-navigation/SKILL.md +95 -0
  123. package/.claude/skills/initialize-ai-navigation/references/navigation-system.md +794 -0
  124. package/.claude/skills/levelplay-unity-integration/CHANGELOG.md +57 -0
  125. package/.claude/skills/levelplay-unity-integration/README.md +74 -0
  126. package/.claude/skills/levelplay-unity-integration/SKILL.md +1126 -0
  127. package/.claude/skills/levelplay-unity-integration/references/banner-api.md +920 -0
  128. package/.claude/skills/levelplay-unity-integration/references/best-practices.md +536 -0
  129. package/.claude/skills/levelplay-unity-integration/references/ilrd-api.md +337 -0
  130. package/.claude/skills/levelplay-unity-integration/references/initialization-api.md +630 -0
  131. package/.claude/skills/levelplay-unity-integration/references/interstitial-api.md +899 -0
  132. package/.claude/skills/levelplay-unity-integration/references/ios-setup.md +491 -0
  133. package/.claude/skills/levelplay-unity-integration/references/migration-sdk-9.md +666 -0
  134. package/.claude/skills/levelplay-unity-integration/references/privacy-settings.md +608 -0
  135. package/.claude/skills/levelplay-unity-integration/references/rewarded-api.md +902 -0
  136. package/.claude/skills/localization/SKILL.md +135 -0
  137. package/.claude/skills/localization/references/api-notes.md +76 -0
  138. package/.claude/skills/localization/resources/L10nBatchProcessor.cs +69 -0
  139. package/.claude/skills/localization/resources/LocalizedFontAsset.cs +18 -0
  140. package/.claude/skills/localize-game/SKILL.md +14 -0
  141. package/.claude/skills/migrate-project/SKILL.md +21 -0
  142. package/.claude/skills/migrate-project/references/procedure.md +63 -0
  143. package/.claude/skills/milestone-review/SKILL.md +14 -0
  144. package/.claude/skills/new-unity-project/SKILL.md +179 -0
  145. package/.claude/skills/optimize-audio/SKILL.md +199 -0
  146. package/.claude/skills/optimize-audio/resources/audio-import-api.md +146 -0
  147. package/.claude/skills/optimize-audio/resources/platform-settings.md +48 -0
  148. package/.claude/skills/optimize-text-mesh-pro/SKILL.md +182 -0
  149. package/.claude/skills/optimize-web/SKILL.md +393 -0
  150. package/.claude/skills/optimize-web/resources/WebOptimizer.cs +21 -0
  151. package/.claude/skills/optimize-web/resources/toktx-examples.sh +11 -0
  152. package/.claude/skills/performance-audit/SKILL.md +14 -0
  153. package/.claude/skills/physics-3d-collision/SKILL.md +442 -0
  154. package/.claude/skills/physics-3d-collision/references/troubleshooting.md +41 -0
  155. package/.claude/skills/physics-3d-collision/resources/CollisionDebugger.cs +33 -0
  156. package/.claude/skills/plan-feature/SKILL.md +14 -0
  157. package/.claude/skills/playtest/SKILL.md +14 -0
  158. package/.claude/skills/project-stage/SKILL.md +14 -0
  159. package/.claude/skills/prototype-feature/SKILL.md +14 -0
  160. package/.claude/skills/qa-plan/SKILL.md +14 -0
  161. package/.claude/skills/release/SKILL.md +18 -0
  162. package/.claude/skills/release-readiness/SKILL.md +14 -0
  163. package/.claude/skills/retrospective/SKILL.md +14 -0
  164. package/.claude/skills/review/SKILL.md +16 -0
  165. package/.claude/skills/security-audit/SKILL.md +14 -0
  166. package/.claude/skills/setup-multiplayer-services/SKILL.md +39 -0
  167. package/.claude/skills/setup-multiplayer-services/references/dgs-entrypoint.md +79 -0
  168. package/.claude/skills/setup-multiplayer-services/references/entrypoints.md +213 -0
  169. package/.claude/skills/setup-multiplayer-services/references/examples.md +33 -0
  170. package/.claude/skills/setup-multiplayer-services/references/implementation-fit.md +30 -0
  171. package/.claude/skills/setup-multiplayer-services/references/underlying-services.md +11 -0
  172. package/.claude/skills/setup-multiplayer-services/references/workflows-prerequisites.md +17 -0
  173. package/.claude/skills/setup-vivox-voice-chat/SKILL.md +118 -0
  174. package/.claude/skills/setup-vivox-voice-chat/evals/.env.example +6 -0
  175. package/.claude/skills/setup-vivox-voice-chat/evals/README.md +101 -0
  176. package/.claude/skills/setup-vivox-voice-chat/evals/promptfooconfig.yaml +32 -0
  177. package/.claude/skills/setup-vivox-voice-chat/evals/tests/init-and-login.yaml +76 -0
  178. package/.claude/skills/setup-vivox-voice-chat/evals/tests/text-chat.yaml +65 -0
  179. package/.claude/skills/setup-vivox-voice-chat/evals/tests/voice-channels.yaml +74 -0
  180. package/.claude/skills/setup-vivox-voice-chat/references/events-and-participants.md +79 -0
  181. package/.claude/skills/setup-vivox-voice-chat/references/init-and-login.md +92 -0
  182. package/.claude/skills/setup-vivox-voice-chat/references/text-chat.md +93 -0
  183. package/.claude/skills/setup-vivox-voice-chat/references/troubleshooting.md +47 -0
  184. package/.claude/skills/setup-vivox-voice-chat/references/voice-channels.md +90 -0
  185. package/.claude/skills/shader-graph-create-custom-node/SKILL.md +25 -0
  186. package/.claude/skills/shader-graph-create-custom-node/resources/all_hints.hlsl +182 -0
  187. package/.claude/skills/sprint-plan/SKILL.md +14 -0
  188. package/.claude/skills/sprite-editor/SKILL.md +66 -0
  189. package/.claude/skills/sprite-editor/references/api_reference.md +151 -0
  190. package/.claude/skills/sprite-editor/references/background.md +112 -0
  191. package/.claude/skills/sprite-editor/references/templates.md +72 -0
  192. package/.claude/skills/sprite-editor/scripts/AutomaticSliceTexture.cs +40 -0
  193. package/.claude/skills/sprite-editor/scripts/GenerateNewSpriteRects.cs +200 -0
  194. package/.claude/skills/sprite-editor/scripts/GetTextureSourceImageSize.cs +32 -0
  195. package/.claude/skills/sprite-editor/scripts/GetTextureToSlice.cs +55 -0
  196. package/.claude/skills/sprite-editor/scripts/GridSliceTexture.cs +40 -0
  197. package/.claude/skills/sprite-editor/scripts/IsometricSliceTexture.cs +141 -0
  198. package/.claude/skills/sprite-editor/scripts/README.md +134 -0
  199. package/.claude/skills/sprite-editor/scripts/SetPivotExample.cs +58 -0
  200. package/.claude/skills/sprite-editor/scripts/SpriteToPng.cs +88 -0
  201. package/.claude/skills/status/SKILL.md +16 -0
  202. package/.claude/skills/story-readiness/SKILL.md +14 -0
  203. package/.claude/skills/test/SKILL.md +16 -0
  204. package/.claude/skills/ui/SKILL.md +142 -0
  205. package/.claude/skills/ui-imgui/SKILL.md +186 -0
  206. package/.claude/skills/ui-imgui/references/gui-elements.md +156 -0
  207. package/.claude/skills/ui-imgui/references/templates.md +141 -0
  208. package/.claude/skills/ui-review/SKILL.md +14 -0
  209. package/.claude/skills/ui-ugui/SKILL.md +282 -0
  210. package/.claude/skills/ui-ugui/references/scrollview-setup.md +29 -0
  211. package/.claude/skills/ui-uitk/SKILL.md +235 -0
  212. package/.claude/skills/ui-uitk/references/common-issues.md +74 -0
  213. package/.claude/skills/ui-uitk/references/custom-elements.md +241 -0
  214. package/.claude/skills/ui-uitk/references/painter2d.md +282 -0
  215. package/.claude/skills/ui-uitk/references/pointermanipulator-guide.md +94 -0
  216. package/.claude/skills/ui-uitk/references/svg-icons.md +136 -0
  217. package/.claude/skills/ui-uitk/references/ui-runtime-binding.md +234 -0
  218. package/.claude/skills/ui-uitk/references/uss-guide.md +138 -0
  219. package/.claude/skills/unity-cli/CHANGELOG.md +233 -0
  220. package/.claude/skills/unity-cli/SECURITY.md +22 -0
  221. package/.claude/skills/unity-cli/SKILL.md +414 -0
  222. package/.claude/skills/unity-cli/references/auth-license-cloud.md +146 -0
  223. package/.claude/skills/unity-cli/references/build-run-test.md +349 -0
  224. package/.claude/skills/unity-cli/references/collaboration.md +472 -0
  225. package/.claude/skills/unity-cli/references/config-hub.md +103 -0
  226. package/.claude/skills/unity-cli/references/diagnostics-maintenance.md +326 -0
  227. package/.claude/skills/unity-cli/references/editors-install.md +327 -0
  228. package/.claude/skills/unity-cli/references/integration-advanced.md +472 -0
  229. package/.claude/skills/unity-cli/references/projects-templates.md +574 -0
  230. package/.claude/skills/unity-package-management/SKILL.md +304 -0
  231. package/.claude/skills/unity-package-management/references/select-packages.md +108 -0
  232. package/.claude/skills/urp-postprocessing/SKILL.md +188 -0
  233. package/.claude/skills/urp-postprocessing/references/code-templates.md +119 -0
  234. package/.claude/skills/urp-postprocessing/references/effect-reference.md +86 -0
  235. package/.claude/skills/validate-urp-render-graph-renderer-feature/SKILL.md +269 -0
  236. package/.claude/skills/work/SKILL.md +36 -0
  237. package/.claude/skills/work/references/classification.md +41 -0
  238. package/.claude/skills/work/references/closure.md +50 -0
  239. package/.claude/skills/work/references/feature-contracts.md +32 -0
  240. package/.claude/skills/work/references/verification.md +26 -0
  241. package/CLAUDE.md +6 -0
  242. package/LICENSE +21 -0
  243. package/README.md +162 -0
  244. package/THIRD_PARTY_NOTICES.md +23 -0
  245. package/UPGRADING.md +32 -0
  246. package/VERSION +1 -0
  247. package/docs/ARCHITECTURE.md +73 -0
  248. package/docs/HUONG-DAN-MIGRATE-VA-SU-DUNG.md +324 -0
  249. package/docs/MIGRATION-MATRIX.md +23 -0
  250. package/docs/PROJECT-POLICY.md +67 -0
  251. package/docs/WORKFLOWS.md +61 -0
  252. package/package-assets/setup-vivox-voice-chat-evals.gitignore +7 -0
  253. package/package.json +41 -0
  254. package/scaffold/.nccgs/bugs/.gitkeep +1 -0
  255. package/scaffold/.nccgs/closures/.gitkeep +1 -0
  256. package/scaffold/.nccgs/context/.gitkeep +1 -0
  257. package/scaffold/.nccgs/decisions/.gitkeep +1 -0
  258. package/scaffold/.nccgs/evidence/.gitkeep +1 -0
  259. package/scaffold/.nccgs/features/.gitkeep +1 -0
  260. package/scaffold/.nccgs/migrations/.gitkeep +1 -0
  261. package/scaffold/.nccgs/playtests/.gitkeep +1 -0
  262. package/scaffold/.nccgs/project.yaml +103 -0
  263. package/scaffold/.nccgs/requirements.yaml +10 -0
  264. package/scaffold/.nccgs/reviews/.gitkeep +1 -0
  265. package/scaffold/.nccgs/state.md +40 -0
  266. package/scaffold/.nccgs/templates/agent-handoff.md +25 -0
  267. package/scaffold/.nccgs/templates/architecture-decision.md +27 -0
  268. package/scaffold/.nccgs/templates/closure-record.md +51 -0
  269. package/scaffold/.nccgs/templates/context-packet.yaml +17 -0
  270. package/scaffold/.nccgs/templates/evidence-record.md +23 -0
  271. package/scaffold/.nccgs/templates/feature-contract.md +35 -0
  272. package/scaffold/.nccgs/templates/migration-plan.md +40 -0
  273. package/scaffold/.nccgs/templates/waiver.md +11 -0
  274. package/scripts/cli.mjs +56 -0
  275. package/scripts/install.mjs +267 -0
  276. package/scripts/sync-unity-skills.mjs +126 -0
  277. package/scripts/validate.mjs +205 -0
  278. 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)