Docs/SDKs/Unity SDK

Unity SDK

Complete Unity integration guide for Ilara. Supports Unity 2020.3+ with C# API.

15 min read
Requirements
  • Unity 2020.3 LTS or newer
  • Mono or IL2CPP scripting backend
  • iOS, Android, Windows, macOS, Linux, or WebGL

Installation

Unity Package Manager (Recommended)

Add the package via git URL in your manifest.json:

Packages/manifest.json
json
{
class="code-string">"dependencies": {
class="code-string">"com.ilara.sdk": class="code-string">"https:class="code-commentclass="code-string">">//github.com/ilara/unity-sdk.git"
}
}

Or via the UI: Window → Package Manager → + → Add package from git URL

Manual Installation

  1. Download the latest release from GitHub
  2. Import the .unitypackage into your project
  3. The SDK will be installed at Assets/Ilara/

Configuration

Create a configuration asset: Assets → Create → Ilara → Config

Configure in the Inspector or via code:

PropertyDefaultDescription
apiKey(required)Your Ilara API key
baseUrlhttps://api.ilara.aiAPI base URL
debugModefalseEnable debug logging
cacheFlagstrueCache feature flags locally
flagCacheDuration300Flag cache TTL in seconds
autoTrackSessionstrueAuto-track session events
eventBatchSize10Events per batch
eventFlushInterval30Seconds between auto-flush

Quick Start

GameManager.cs
csharp
using Ilara;
using UnityEngine;
 
public class GameManager : MonoBehaviour
{
async void Start()
{
class=class="code-string">"code-comment">// Initialize from config in Resources folder
await IlaraClient.Instance.Initialize();
 
class=class="code-string">"code-comment">// Or with explicit config
var config = Resources.Load(class="code-string">"MyConfig");
await IlaraClient.Instance.Initialize(config);
 
class=class="code-string">"code-comment">// Identify the player
var player = await IlaraClient.Instance.IdentifyPlayer(class="code-string">"player_123");
Debug.Log($class="code-string">"Player stage: {player.lifecycle_stage}");
}
}

Player Management

Identify Players
csharp
class=class="code-string">"code-comment">// Basic identification
var player = await IlaraClient.Instance.IdentifyPlayer(class="code-string">"player_123");
 
class=class="code-string">"code-comment">// With attributes
var player = await IlaraClient.Instance.IdentifyPlayer(
externalId: class="code-string">"player_123",
attributes: new Dictionary<string, object> {
{ class="code-string">"level", 45 },
{ class="code-string">"country", class="code-string">"US" },
{ class="code-string">"vip_tier", class="code-string">"gold" }
},
deviceId: SystemInfo.deviceUniqueIdentifier,
email: class="code-string">"[email protected]"
);
 
class=class="code-string">"code-comment">// Access player data
Debug.Log($class="code-string">"Ilara ID: {player.Id}");
Debug.Log($class="code-string">"Lifecycle: {player.LifecycleStage}");
Debug.Log($class="code-string">"Sessions: {player.SessionCount}");
Debug.Log($class="code-string">"Revenue: ${player.TotalRevenue}");
Update Attributes
csharp
class=class="code-string">"code-comment">// Update player attributes
await IlaraClient.Instance.UpdatePlayerAttributes(new {
level = 46,
last_level_completed = class="code-string">"5-3"
});
 
class=class="code-string">"code-comment">// Increment numeric attributes
await IlaraClient.Instance.IncrementAttribute(class="code-string">"games_played", 1);

Event Tracking

Track Events
csharp
class=class="code-string">"code-comment">// Track custom event
IlaraClient.Instance.TrackEvent(class="code-string">"level_complete", new {
level = 5,
score = 1500,
time_seconds = 120,
stars_earned = 3
});
 
class=class="code-string">"code-comment">// Track purchase
IlaraClient.Instance.TrackPurchase(
productId: class="code-string">"gem_pack_100",
amount: 4.99m,
currency: class="code-string">"USD"
);
 
class=class="code-string">"code-comment">// Track with session ID
IlaraClient.Instance.TrackEvent(class="code-string">"boss_defeated", new {
boss_name = class="code-string">"Dragon King",
attempts = 3
}, sessionId: class="code-string">"session_abc123");
 
class=class="code-string">"code-comment">// Force flush pending events
await IlaraClient.Instance.FlushEvents();

Feature Flags

Check Flags
csharp
class=class="code-string">"code-comment">// Check boolean flag
if (IlaraClient.Instance.IsFlagEnabled(class="code-string">"new_tutorial"))
{
ShowNewTutorial();
}
 
class=class="code-string">"code-comment">// Get typed flag value with default
int maxLevel = IlaraClient.Instance.GetFlag(class="code-string">"max_level", 10);
string welcomeMsg = IlaraClient.Instance.GetFlag(class="code-string">"welcome_message", class="code-string">"Hello!");
float xpMultiplier = IlaraClient.Instance.GetFlag(class="code-string">"xp_multiplier", 1.0f);
 
class=class="code-string">"code-comment">// Evaluate multivariate flag
var result = await IlaraClient.Instance.EvaluateFlag(class="code-string">"checkout_variant");
switch (result.VariantKey)
{
case class="code-string">"control":
ShowOriginalCheckout();
break;
case class="code-string">"variant_a":
ShowSimplifiedCheckout();
break;
}
 
class=class="code-string">"code-comment">// Refresh flags from server
await IlaraClient.Instance.RefreshFlags();

Player Segments

Check Segments
csharp
class=class="code-string">"code-comment">// Check segment membership
bool isWhale = await IlaraClient.Instance.IsInSegment(class="code-string">"whales");
 
if (isWhale)
{
ShowVIPOffer();
}
 
class=class="code-string">"code-comment">// Get all segments for player
string[] segments = await IlaraClient.Instance.GetPlayerSegments();
 
foreach(string segment in segments)
{
Debug.Log($class="code-string">"Player is in segment: {segment}");
}

Churn Prediction

Get Churn Risk
csharp
var churnRisk = await IlaraClient.Instance.GetChurnRisk();
 
Debug.Log($class="code-string">"Risk Score: {churnRisk.RiskScore}"); class=class="code-string">"code-comment">// 0.0 - 1.0
Debug.Log($class="code-string">"Risk Level: {churnRisk.RiskLevel}"); class=class="code-string">"code-comment">// Low, Medium, High
Debug.Log($class="code-string">"Factors: {string.Join(", class="code-string">", churnRisk.Factors)}");
 
if (churnRisk.IsAtRisk)
{
ShowRetentionOffer();
}

Offline Support

The SDK automatically queues events when offline and sends them when connectivity is restored.

Configure Offline Queue
csharp
class=class="code-string">"code-comment">// Enable in config
config.enableOfflineQueue = true;
config.maxOfflineQueueSize = 1000; class=class="code-string">"code-comment">// Max events to queue

API Reference

MethodDescription
Initialize(config)Initialize SDK with configuration
IdentifyPlayer(id, attributes)Identify the current player
GetFlag<T>(key, default)Get feature flag value
IsFlagEnabled(key)Check if boolean flag is enabled
EvaluateFlag(key)Get full flag evaluation result
TrackEvent(name, properties)Track analytics event
TrackPurchase(productId, amount, currency)Track purchase
GetPlayerSegments()Get player's segment memberships
IsInSegment(slug)Check if player is in segment
GetChurnRisk()Get churn risk prediction
FlushEvents()Immediately flush pending events
RefreshFlags()Refresh flags from server

Best Practices

  • Initialize early: Call Initialize() in your first scene's Awake() or Start()
  • Identify players: Always call IdentifyPlayer() before tracking events
  • Use typed flags: Use GetFlag<T>() with appropriate types
  • Batch events: Let the SDK batch events for efficiency
  • Handle errors: Wrap async calls in try-catch for robustness

Support