- An onboarding carousel explaining how rewards work
- A reminder when a player has an unclaimed balance
- A seasonal or promotional announcement
- A/B testing two versions of the same message
Requires Unity SDK v1.1.7 or above.
Quick start
Init() and preloads their images, so the modal appears instantly.
To react to what the player did:
Setting up a creative
Tell your account manager the following, and send them your images:
Two further properties are set on the ZBD side and worth knowing about:
Pages and navigation
Each page needs at least one image — portrait, landscape, or both. The SDK picks whichever matches the device’s current orientation, and swaps automatically when the player rotates. If you supply only one, it’s used in both orientations.Portrait art is not required. If your game is landscape-only, send landscape art alone — there’s no need to supply portrait images that would never be shown. The same applies in reverse for portrait-only games.
- Tap the image to advance to the next page
- Swipe left or right to move between pages
- Use the next arrow (hidden on the last page)
- See their position via page dots
Image requirements
Maximum 5 pages per creative. Every page is downloaded before the modal appears, so keep image dimensions reasonable — target the device resolution you actually need, not the largest possible.Localization
The Locale field controls who sees a creative:- Not set — served to everyone. This is what you want for most creatives.
- Set (e.g.
en,en-GB,pt-BR) — served only to players whose locale matches.
API reference
All methods are onZBDController.Instance.
ShowCreative
shown == false, if it couldn’t be shown.
Your game decides when a creative appears. The SDK does no scheduling or frequency capping, so you’re free to build your own rules (once per session, after level 3, only when a balance is unclaimed, and so on). See Best practices.
CloseCreative
ShowCreative callback fires with dismissReason == "programmatic".
The result object
ZBDCreativeResult, passed to your ShowCreative callback:
Dismiss reasons
Together,
lastPage and pageCount give you a drop-off funnel: you can tell whether a player read all three pages and tapped through, or bailed on page one.
When shown is false
Every one of these is a clean no-op from the player’s perspective: nothing renders and your callback runs, so it’s safe to call
ShowCreative optimistically.
Best practices
Show a short tutorial on first launch
A one- to three-page tutorial explaining how rewards work is the highest-value creative you can ship. Show it once, at a natural moment afterInit() succeeds — not mid-gameplay.
Use PlayerPrefs so it only ever shows once:
Set your “already shown” flag inside the callback and only when
result.shown is true. If you set it before calling ShowCreative, a network or image failure would permanently prevent the player from ever seeing the tutorial.Nudge players who have an unclaimed balance
A creative that reflects the player’s actual progress converts far better than a generic announcement. CallGetBalance first, and if the player has something to withdraw, show a creative along the lines of “You’ve earned rewards — tap to withdraw.”
Ask your account manager to enable Tap opens rewards on this creative, so tapping it opens the rewards interface directly.
Styling
The SDK draws its own close button, next arrow, and page dots. Any of them can be replaced with your own art or hidden entirely, so the modal fits your game. You don’t need to callSetCreativeStyle at all — the SDK’s built-in defaults apply automatically. Only call it if you want to change something:
Init(), before your first ShowCreative.
null to reset to defaults.
Sizes and offsets are in the overlay’s reference space (1080×1920, scaled to fit), not raw pixels, so they stay consistent across devices.
If you set
showCloseButton = false on a creative that also has Backdrop dismisses turned off, the SDK re-enables the close button anyway — otherwise the player would have no way to close the modal.Refreshing the creative list
Init(), and ShowCreative fetches lazily if needed, so most games never call this.
Behavior notes
Preloading. Creatives and their images are fetched duringInit() so the first ShowCreative is instant. If the fetch fails (no network, for example), Init() still completes normally — creatives simply retry on the next attempt.
One at a time. Calling ShowCreative while another creative is showing or loading returns shown = false rather than stacking modals.
Rotation. The modal handles rotation while visible, swapping to the other orientation’s artwork where one is provided.
Input. While a creative is visible, its backdrop absorbs taps so the game underneath doesn’t receive them.
A/B testing. Ask for two creatives with different keys, assign players to a variant in your own code, and call ShowCreative with the matching key. Your game keeps full control of the split.
Troubleshooting
“Creative not found” but it was just set up. Confirm the creative key spelling with your account manager, check that it’s been made active, and make sure your build is pointed at the same environment it was configured in. The App ID must match your game’s token exactly — it’s case-sensitive. The modal doesn’t appear and I get “Creative images could not be loaded”. Almost always the image: confirm it’s HTTPS, PNG or JPEG, and served with an imageContent-Type and no Content-Encoding header. A browser preview succeeding does not guarantee the device can decode it.
Nothing shows for some players only. Check the locale — a creative with a locale set is only served to matching players. Ask for a version with no locale as a fallback.
A newly updated creative isn’t picked up. The creative list is cached for the session. Restart the app, or call FetchCreatives() to refresh.