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,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)
|