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,337 @@
1
+ # Impression Level Revenue (ILR) Integration
2
+
3
+ ## Contents
4
+ - [Overview](#overview)
5
+ - [Prerequisites](#prerequisites)
6
+ - [Key Characteristics](#key-characteristics)
7
+ - [Implementation](#implementation)
8
+ - [API Reference](#api-reference)
9
+ - [Thread Safety](#thread-safety)
10
+ - [Integration with Third-Party Analytics](#integration-with-third-party-analytics)
11
+ - [Best Practices](#best-practices)
12
+ - [Common Issues](#common-issues)
13
+ - [Testing Checklist](#testing-checklist)
14
+
15
+ ## Overview
16
+
17
+ Use the Impression Level Revenue (ILR) solution to track ad revenue at both device and impression levels, integrating with third-party analytics tools for deeper insights.
18
+
19
+ ## Prerequisites
20
+
21
+ - LevelPlay SDK 7.0.3+ correctly integrated
22
+ - Refer to Unity Package integration guide
23
+
24
+ For more information about the Impression Level Revenue (ILR) SDK feature and pre-requisites, refer to the Impression-level revenue server-side API documentation.
25
+
26
+ ## Key Characteristics
27
+
28
+ - **Real-time data**: Fires postbacks to inform you about displayed ads
29
+ - **Background thread**: Callback runs on a background thread, not the Unity main thread
30
+ - **Optional listener**: Provides information about all ad units
31
+ - **All ad formats**: Works with Rewarded, Interstitial, and Banner ads
32
+
33
+ ## Implementation
34
+
35
+ ILRD is delivered differently depending on your SDK version. Check your version in **Ads Mediation > Network Manager**.
36
+
37
+ | SDK version | ILRD delivery | Where you subscribe |
38
+ |-------------|---------------|---------------------|
39
+ | **9.5.0+ (current)** | Per ad instance — `OnAdImpressionDataReady` on each ad object (`LevelPlayRewardedAd`, `LevelPlayInterstitialAd`, `LevelPlayBannerAd`) | When you create each ad |
40
+ | **9.4.x and earlier** | Single global event — `LevelPlay.OnImpressionDataReady` | Once, before `LevelPlay.Init()` |
41
+
42
+ On SDK 9.5.0+, the global `LevelPlay.OnImpressionDataReady` still exists but is **deprecated and generates a compiler warning** — use the per-instance `OnAdImpressionDataReady` event instead.
43
+
44
+ ### SDK 9.5.0+ (current): Per-Instance Setup
45
+
46
+ Subscribe to `OnAdImpressionDataReady` on each ad object right after you create it, before you load or show it, so no impression is missed — typically inside the ad manager classes from `rewarded-api.md` / `interstitial-api.md` / `banner-api.md`. There is no "before Init" ordering concern with the per-instance event; you subscribe when the ad is created.
47
+
48
+ ```csharp
49
+ using UnityEngine;
50
+ using Unity.Services.LevelPlay;
51
+
52
+ public class RewardedAdManager : MonoBehaviour
53
+ {
54
+ private LevelPlayRewardedAd rewardedAd;
55
+ private string adUnitId = "YOUR_REWARDED_AD_UNIT_ID";
56
+
57
+ void Start()
58
+ {
59
+ rewardedAd = new LevelPlayRewardedAd(adUnitId);
60
+
61
+ // ILRD (SDK 9.5.0+): subscribe per ad instance.
62
+ // Fires on a BACKGROUND thread — do not call Unity APIs directly here.
63
+ rewardedAd.OnAdImpressionDataReady += OnImpressionDataReady;
64
+
65
+ // ... register other event listeners and call LoadAd() as usual
66
+ }
67
+
68
+ void OnDestroy()
69
+ {
70
+ if (rewardedAd != null)
71
+ {
72
+ rewardedAd.OnAdImpressionDataReady -= OnImpressionDataReady;
73
+ // ... unsubscribe other events
74
+ }
75
+ }
76
+
77
+ private void OnImpressionDataReady(LevelPlayImpressionData impressionData)
78
+ {
79
+ // Runs on a background thread — see "Integration with Third-Party Analytics".
80
+ if (impressionData == null) return;
81
+ Debug.Log($"ILRD - {impressionData.AdNetwork} / {impressionData.AdFormat} / ${impressionData.Revenue}");
82
+ }
83
+ }
84
+ ```
85
+
86
+ Repeat the same `OnAdImpressionDataReady` subscription on your interstitial and banner ad objects. Every ad format reports its own impressions through its own instance event.
87
+
88
+ ### SDK 9.4.x and earlier (legacy): Global Event Setup
89
+
90
+ On older SDKs, use the single global `LevelPlay.OnImpressionDataReady` event, registered **before** `LevelPlay.Init()`:
91
+
92
+ ```csharp
93
+ using UnityEngine;
94
+ using Unity.Services.LevelPlay;
95
+
96
+ public class ImpressionRevenueManager : MonoBehaviour
97
+ {
98
+ void Start()
99
+ {
100
+ // Register impression data callback BEFORE SDK initialization
101
+ // This event is triggered on a background thread, not the Unity main thread.
102
+ LevelPlay.OnImpressionDataReady += ImpressionDataReadyEvent;
103
+
104
+ // Register initialization callbacks
105
+ LevelPlay.OnInitSuccess += OnInitSuccess;
106
+ LevelPlay.OnInitFailed += OnInitFailed;
107
+
108
+ // Initialize SDK
109
+ LevelPlay.Init("YOUR_APP_KEY");
110
+ }
111
+
112
+ void OnDestroy()
113
+ {
114
+ // Unregister callbacks
115
+ LevelPlay.OnImpressionDataReady -= ImpressionDataReadyEvent;
116
+ LevelPlay.OnInitSuccess -= OnInitSuccess;
117
+ LevelPlay.OnInitFailed -= OnInitFailed;
118
+ }
119
+
120
+ private void ImpressionDataReadyEvent(LevelPlayImpressionData impressionData)
121
+ {
122
+ // IMPORTANT: This runs on a background thread, not the main thread
123
+ // Do not call Unity APIs directly from here
124
+ Debug.Log($"ILR - Ad Network: {impressionData.AdNetwork}");
125
+ Debug.Log($"ILR - Revenue: ${impressionData.Revenue}");
126
+ }
127
+
128
+ private void OnInitSuccess(LevelPlayConfiguration config)
129
+ {
130
+ Debug.Log("LevelPlay initialized");
131
+ }
132
+
133
+ private void OnInitFailed(LevelPlayInitError error)
134
+ {
135
+ Debug.LogError($"Init failed: {error.ErrorMessage}");
136
+ }
137
+ }
138
+ ```
139
+
140
+ **Key points (global event — SDK 9.4.x and earlier only):**
141
+ - Declare the listener **BEFORE** initializing the LevelPlay SDK to avoid any loss of information
142
+ - Callback runs on a **background thread**
143
+ - Don't call Unity APIs directly in the callback
144
+ - On SDK 9.5.0+ this global event is deprecated — use the per-instance `OnAdImpressionDataReady` shown above instead
145
+
146
+ ### Accessing Impression Data
147
+
148
+ You can refer to each field separately or get all information by using the AllData property:
149
+
150
+ ```csharp
151
+ private void ImpressionDataReadyEvent(LevelPlayImpressionData impressionData)
152
+ {
153
+ string allData = impressionData.AllData;
154
+ string adNetwork = impressionData.AdNetwork;
155
+ double? revenue = impressionData.Revenue;
156
+ }
157
+ ```
158
+
159
+ **Important:** The returned data might include null values. To avoid potential crashes, ensure that you add protections before assigning the data.
160
+
161
+ ## API Reference
162
+
163
+ ### Events
164
+
165
+ #### `adObject.OnAdImpressionDataReady` (SDK 9.5.0+ — current)
166
+
167
+ Per-instance event on each ad object (`LevelPlayRewardedAd`, `LevelPlayInterstitialAd`, `LevelPlayBannerAd`). Fired when that ad reports an impression with revenue data.
168
+
169
+ **Signature:** `event Action<LevelPlayImpressionData>`
170
+
171
+ **Usage:**
172
+ ```csharp
173
+ // Subscribe after creating the ad object. Fires on a background thread.
174
+ rewardedAd.OnAdImpressionDataReady += ImpressionDataReadyEvent;
175
+ ```
176
+
177
+ **Important:**
178
+ - Subscribe when you create the ad object; unsubscribe in `OnDestroy()`
179
+ - Callback runs on **background thread**
180
+ - Each ad format reports through its own instance event
181
+
182
+ #### `LevelPlay.OnImpressionDataReady` (SDK 9.4.x and earlier — deprecated in 9.5.0+)
183
+
184
+ Single global event. Fired when any impression occurs and revenue data is available.
185
+
186
+ **Signature:** `static event Action<LevelPlayImpressionData>`
187
+
188
+ **Usage:**
189
+ ```csharp
190
+ // This event is triggered on a background thread, not the Unity main thread.
191
+ LevelPlay.OnImpressionDataReady += ImpressionDataReadyEvent;
192
+ ```
193
+
194
+ **Important:**
195
+ - Register **BEFORE** `LevelPlay.Init()`
196
+ - Callback runs on **background thread**
197
+ - Fires for all ad formats (Rewarded, Interstitial, Banner)
198
+ - **Deprecated in SDK 9.5.0+** (generates a compiler warning) — use the per-instance event above instead
199
+
200
+ ### Data Type
201
+
202
+ #### `LevelPlayImpressionData`
203
+
204
+ Contains detailed information about an ad impression.
205
+
206
+ **Properties:**
207
+
208
+ | Property | Type | Description |
209
+ |----------|------|-------------|
210
+ | `AllData` | string/dictionary | All impression data as a structured object |
211
+ | `AuctionId` | string | Unique auction identifier |
212
+ | `MediationAdUnitName` | string | Mediation ad unit name |
213
+ | `MediationAdUnitId` | string | Mediation ad unit identifier |
214
+ | `AdFormat` | string | Ad format (e.g., "REWARDED", "INTERSTITIAL", "BANNER") |
215
+ | `AdNetwork` | string | Ad network that served the ad |
216
+ | `InstanceName` | string | Ad network instance name |
217
+ | `InstanceId` | string | Ad network instance identifier |
218
+ | `Country` | string | User's country code |
219
+ | `Placement` | string | Placement name where ad was shown |
220
+ | `Revenue` | double? | Estimated revenue in USD (nullable - check for null) |
221
+ | `Precision` | string | Revenue precision level |
222
+ | `Ab` | string | A/B test segment identifier |
223
+ | `SegmentName` | string | User segment name |
224
+ | `EncryptedCpm` | string | Encrypted CPM value |
225
+ | `ConversionValue` | number? | iOS SKAdNetwork conversion value (iOS only) |
226
+ | `CreativeId` | string | Creative identifier |
227
+
228
+ **Example:**
229
+ ```csharp
230
+ private void ImpressionDataReadyEvent(LevelPlayImpressionData impressionData)
231
+ {
232
+ string allData = impressionData.AllData;
233
+ string adNetwork = impressionData.AdNetwork;
234
+ double? revenue = impressionData.Revenue;
235
+ }
236
+ ```
237
+
238
+ **Note:** For the full list of available ILR data, including field description and types, refer to Impression-level revenue server-side API documentation.
239
+
240
+ ## Thread Safety
241
+
242
+ **CRITICAL:** the ILRD callback (`OnAdImpressionDataReady` on 9.5.0+, or `OnImpressionDataReady` on 9.4.x and earlier) runs on a background thread. This means:
243
+
244
+ **❌ DO NOT:**
245
+ - Call Unity APIs directly (e.g., `GameObject.Find()`, `transform.position`)
246
+ - Access Unity components or game objects
247
+ - Update UI elements directly
248
+ - Call coroutines
249
+
250
+ **✅ DO:**
251
+ - Queue data for processing on main thread
252
+ - Use thread-safe operations
253
+ - Check for null values before using data
254
+
255
+ ## Integration with Third-Party Analytics
256
+
257
+ ### Firebase Analytics Example
258
+
259
+ The following example details how to integrate the Impression Level Revenue SDK API data with Google Analytics for Firebase. You can use it as-is or make any required changes to integrate with third-party reporting tools or your own proprietary optimization tools and databases.
260
+
261
+ **Important:** Ensure that the inside parameters aren't null.
262
+
263
+ ```csharp
264
+ private void ImpressionDataReadyEvent(LevelPlayImpressionData impressionData)
265
+ {
266
+ Debug.Log("unity-script: ImpressionDataReadyEvent impressionData = " + impressionData);
267
+
268
+ if (impressionData != null)
269
+ {
270
+ Firebase.Analytics.Parameter[] AdParameters = {
271
+ new Firebase.Analytics.Parameter("ad_platform", "LevelPlay"),
272
+ new Firebase.Analytics.Parameter("ad_source", impressionData.AdNetwork),
273
+ new Firebase.Analytics.Parameter("ad_format", impressionData.AdFormat),
274
+ new Firebase.Analytics.Parameter("ad_unit_name", impressionData.InstanceName),
275
+ new Firebase.Analytics.Parameter("currency", "USD"),
276
+ new Firebase.Analytics.Parameter("value", impressionData.Revenue ?? 0) // Add protection for null values
277
+ };
278
+
279
+ Firebase.Analytics.FirebaseAnalytics.LogEvent("custom_ad_impression", AdParameters);
280
+ }
281
+ }
282
+ ```
283
+
284
+ ### Integration with Other Tools
285
+
286
+ After you implement the ImpressionDataListener, you can send the impression data to:
287
+ - Your own proprietary BI tools and data warehouses
288
+ - Third-party analytics platforms
289
+ - Attribution providers
290
+ - Custom backend services
291
+
292
+ ## Best Practices
293
+
294
+ 1. **Subscribe correctly for your SDK version**: On SDK 9.5.0+, subscribe to each ad's `OnAdImpressionDataReady` when you create the ad. On SDK 9.4.x and earlier, register the global `LevelPlay.OnImpressionDataReady` before calling `LevelPlay.Init()`
295
+ 2. **Handle background thread**: Don't call Unity APIs directly in the callback
296
+ 3. **Check for null values**: Revenue and other properties may be null - always check before using
297
+ 4. **Protect against crashes**: Add null checks to avoid potential crashes
298
+ 5. **Unregister on destroy**: Prevent memory leaks by unregistering in `OnDestroy()`
299
+
300
+ ## Common Issues
301
+
302
+ ### Issue: Callback never fires
303
+
304
+ **Possible causes:**
305
+ - **SDK 9.5.0+:** not subscribed to the ad instance's `OnAdImpressionDataReady`, or subscribed to a different ad object than the one shown
306
+ - **SDK 9.4.x and earlier:** global `LevelPlay.OnImpressionDataReady` not registered before `LevelPlay.Init()`
307
+ - SDK not initialized successfully
308
+ - No ads shown yet
309
+
310
+ **Solutions:**
311
+ - On 9.5.0+, subscribe to `OnAdImpressionDataReady` on the same ad object you load/show
312
+ - On 9.4.x and earlier, register the global callback before calling `Init()`
313
+ - Verify `OnInitSuccess` fires
314
+ - Show an ad and check if callback fires
315
+
316
+ ### Issue: Unity APIs crash in callback
317
+
318
+ **Cause:** Calling Unity APIs from background thread
319
+
320
+ **Solution:** Don't call Unity APIs directly in the callback. Queue data for main thread processing if needed.
321
+
322
+ ### Issue: Revenue is null
323
+
324
+ **Cause:** Some ad networks don't provide revenue data
325
+
326
+ **Solution:** Always check `impressionData.Revenue.HasValue` or use `impressionData.Revenue ?? 0` to provide a default value
327
+
328
+ ## Testing Checklist
329
+
330
+ - [ ] Subscribed correctly for your SDK version (9.5.0+: per-instance `OnAdImpressionDataReady`; 9.4.x and earlier: global `OnImpressionDataReady` before `Init()`)
331
+ - [ ] Callback fires when ads are shown
332
+ - [ ] Revenue data is received (check for null)
333
+ - [ ] Null checks added to prevent crashes
334
+ - [ ] Analytics/backend integration works correctly
335
+ - [ ] No crashes from Unity API calls in callback
336
+ - [ ] Callback unregistered in `OnDestroy()`
337
+ - [ ] Tested with all ad formats (Rewarded, Interstitial, Banner)