CharacterSelector
A pre-built character discovery component that surfaces a roster of characters users can play mini-games with. Pass in your own platform characters or omit characters to use Simula's default roster.

Passing Your Characters
If your app has its own characters, map them to CharacterData and pass them via the characters parameter. The selector displays up to 4 -- any remaining slots are backfilled from Simula's default roster.
swift
let recentCharacters = [
CharacterData(id: "reze-01", name: "Reze", imageUrl: "https://cdn.example.com/avatars/reze.png", description: "The Bomb Devil from Chainsaw Man"),
CharacterData(id: "power-02", name: "Power", imageUrl: "https://cdn.example.com/avatars/power.png", description: "The Blood Fiend from Chainsaw Man"),
]Basic Usage
swift
import SimulaAdSDK
struct RewardFlow: View {
let recentCharacters: [CharacterData]
@State private var selectorOpen = false
@StateObject private var vm = RewardFlowViewModel()
var body: some View {
Button("Earn free credits") {
selectorOpen = true
}
CharacterSelector(
isOpen: selectorOpen,
onClose: { selectorOpen = false },
onCharacterSelected: { character in
selectorOpen = false
vm.loadAd(for: character)
},
characters: recentCharacters,
ctaText: "Launch Game"
)
}
}
class RewardFlowViewModel: ObservableObject, SimulaRewardedAdDelegate {
private let rewarded = SimulaRewardedAd(adUnitId: "SIM-RWD-XXXXXXXX")
init() {
rewarded.delegate = self
}
func loadAd(for character: CharacterData) {
rewarded.load(
charId: character.id,
charName: character.name,
charImage: character.imageUrl,
charDesc: character.description
)
}
func rewardedDidLoad(_ ad: SimulaRewardedAd) {
ad.show()
}
func rewardedDidVerifyReward(_ ad: SimulaRewardedAd, token: String?) {
grantReward(token: token)
}
}Required Parameters
| Parameter | Type | Description |
|---|---|---|
isOpen | Bool | Controls selector visibility |
onClose | () -> Void | Called when the user dismisses without selecting |
onCharacterSelected | (CharacterData) -> Void | Called with the selected character. Pass fields to .load() |
Optional Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
characters | [CharacterData]? | nil | Your platform's characters. Omit to use Simula's default roster |
ctaText | String | "Launch Game" | CTA button label |
title | String | "Select Your Game Partner" | Selector title text |
theme | CharacterSelectorTheme | CharacterSelectorTheme() | Theme configuration |
onCharacterPreview | ((CharacterData) -> Void)? | nil | Called when a user previews a character before confirming |
CharacterData
swift
public struct CharacterData {
public let id: String
public let name: String
public let imageUrl: String
public let description: String
}Theme
| Field | Type | Default | Description |
|---|---|---|---|
backgroundColor | String? | "#000000" | Selector background |
titleFontColor | String? | "#FFFFFF" | Title text color |
secondaryFontColor | String? | "#FFFFFF" | Character name label color |
accentColor | String? | "#3D9A66" | Selection highlight and CTA color |
ctaFontColor | String? | "#FFFFFF" | CTA button text color |
cardBackgroundColor | String? | "#14161A" | Character card background |
cardBorderColor | String? | "#343A42" | Character card border |
cardCornerRadius | CGFloat? | 18 | Card corner radius (pt) |
fontFamily | String? | System default | Font family |
