Skip to content

More of Us Module

The More of Us module promotes cross-game discovery by showcasing other games from your portfolio within the SDK.


Overview

Namespace IntelliVerseX.MoreOfUs
Assembly IntelliVerseX.MoreOfUs
Purpose Cross-promotion of portfolio games

Features

  • Game Showcase - Display other games in your portfolio
  • Deep Linking - Direct links to app stores
  • Analytics - Track cross-game traffic
  • Remote Config - Update game list without app update

Key Classes

Class Purpose
IVXMoreOfUsManager Main manager for game list
IVXGameInfo Game information model
IVXMoreOfUsPanel Pre-built UI panel

IVXMoreOfUsManager

public static class IVXMoreOfUsManager
{
    // Data
    public static List<IVXGameInfo> Games { get; }
    public static bool IsLoaded { get; }

    // Events
    public static event Action OnGamesLoaded;
    public static event Action<string> OnGameClicked;

    // Load games
    public static async Task LoadGamesAsync();

    // Open store
    public static void OpenGame(IVXGameInfo game);
    public static void OpenGame(string gameId);

    // Filter
    public static List<IVXGameInfo> GetGamesByPlatform(RuntimePlatform platform);
    public static List<IVXGameInfo> GetGamesByCategory(string category);
}

IVXGameInfo

public class IVXGameInfo
{
    public string Id { get; }
    public string Name { get; }
    public string Description { get; }

    public string IconUrl { get; }
    public string BannerUrl { get; }
    public string[] ScreenshotUrls { get; }

    public string Category { get; }
    public string[] Tags { get; }

    // Store links
    public string AndroidPackageId { get; }
    public string IOSAppId { get; }
    public string WebUrl { get; }

    // Metadata
    public float Rating { get; }
    public int Downloads { get; }
    public bool IsNew { get; }
    public bool IsFeatured { get; }

    // Platform availability
    public bool IsAvailableOnAndroid { get; }
    public bool IsAvailableOnIOS { get; }
    public bool IsAvailableOnWebGL { get; }
}

Usage

Load and Display Games

using IntelliVerseX.MoreOfUs;

public class MoreOfUsUI : MonoBehaviour
{
    [SerializeField] private Transform gameListContainer;
    [SerializeField] private GameCard gameCardPrefab;

    async void Start()
    {
        // Load games from backend
        await IVXMoreOfUsManager.LoadGamesAsync();

        // Display games
        foreach (var game in IVXMoreOfUsManager.Games)
        {
            // Skip current game
            if (game.AndroidPackageId == Application.identifier)
                continue;

            // Only show games for current platform
            #if UNITY_ANDROID
            if (!game.IsAvailableOnAndroid) continue;
            #elif UNITY_IOS
            if (!game.IsAvailableOnIOS) continue;
            #endif

            var card = Instantiate(gameCardPrefab, gameListContainer);
            card.SetGame(game);
            card.OnClick += () => IVXMoreOfUsManager.OpenGame(game);
        }
    }
}

Game Card Component

public class GameCard : MonoBehaviour
{
    [SerializeField] private RawImage iconImage;
    [SerializeField] private TMP_Text nameText;
    [SerializeField] private TMP_Text descriptionText;
    [SerializeField] private Image ratingStars;
    [SerializeField] private GameObject newBadge;
    [SerializeField] private GameObject featuredBadge;
    [SerializeField] private Button button;

    public event Action OnClick;

    public async void SetGame(IVXGameInfo game)
    {
        nameText.text = game.Name;
        descriptionText.text = game.Description;

        // Load icon
        iconImage.texture = await LoadTextureAsync(game.IconUrl);

        // Set rating
        ratingStars.fillAmount = game.Rating / 5f;

        // Badges
        newBadge.SetActive(game.IsNew);
        featuredBadge.SetActive(game.IsFeatured);

        // Click handler
        button.onClick.AddListener(() => OnClick?.Invoke());
    }
}

Pre-built UI

IVXMoreOfUsPanel

Ready-to-use panel prefab.

// Simply add the prefab to your scene
// Configure in inspector:
// - Number of games to show
// - Layout (grid/list)
// - Filter by category
// - Show featured first

Inspector Properties:

Property Description
Max Games Maximum games to display
Layout Type Grid or List layout
Filter Category Filter by game category
Sort Order Rating, Downloads, Name, Featured
Show Current Game Include current game in list

Configuration

Games are configured on the Nakama backend:

{
  "games": [
    {
      "id": "puzzle_master",
      "name": "Puzzle Master",
      "description": "Brain-teasing puzzles for all ages",
      "icon_url": "https://cdn.example.com/puzzle_master_icon.png",
      "banner_url": "https://cdn.example.com/puzzle_master_banner.png",
      "category": "puzzle",
      "tags": ["puzzle", "brain", "casual"],
      "android_package": "com.studio.puzzlemaster",
      "ios_app_id": "1234567890",
      "rating": 4.5,
      "is_featured": true
    },
    {
      "id": "space_shooter",
      "name": "Space Shooter X",
      "description": "Epic space battles await!",
      "icon_url": "https://cdn.example.com/space_shooter_icon.png",
      "category": "action",
      "android_package": "com.studio.spaceshooter",
      "ios_app_id": "0987654321",
      "rating": 4.2
    }
  ]
}

Store Opening

The SDK handles platform-specific store opening:

// Android - Opens Play Store
// iOS - Opens App Store
// WebGL - Opens web URL

IVXMoreOfUsManager.OpenGame(game);

// Or by ID
IVXMoreOfUsManager.OpenGame("puzzle_master");

Platform Behavior

Platform Behavior
Android market://details?id=com.example.app → Play Store
iOS itms-apps://itunes.apple.com/app/id123 → App Store
WebGL Opens web URL in new tab
Editor Logs URL to console

Analytics

Cross-promotion analytics are tracked automatically:

// Tracked events:
// - more_of_us_opened (panel viewed)
// - more_of_us_game_clicked (game tapped)
// - more_of_us_game_installed (if user returns after install)

// Custom tracking
IVXMoreOfUsManager.OnGameClicked += (gameId) =>
{
    IVXAnalyticsManager.LogEvent("cross_promo_click", new Dictionary<string, object>
    {
        { "game_id", gameId },
        { "source_game", Application.productName }
    });
};

Best Practices

1. Placement

// Good placements for "More Games":
// - Main menu
// - Settings screen
// - Post-level completion
// - Game over screen

// Avoid:
// - Mid-gameplay
// - During critical actions

2. Filtering

// Show relevant games based on context
var puzzleGames = IVXMoreOfUsManager.GetGamesByCategory("puzzle");
var actionGames = IVXMoreOfUsManager.GetGamesByCategory("action");

// Or filter by tags
var casualGames = IVXMoreOfUsManager.Games
    .Where(g => g.Tags.Contains("casual"))
    .ToList();
// Highlight featured games
var featured = IVXMoreOfUsManager.Games
    .Where(g => g.IsFeatured)
    .OrderByDescending(g => g.Rating)
    .ToList();

4. Caching

// Games list is cached locally
// Refreshes periodically from backend
// Works offline with cached data

// Force refresh
await IVXMoreOfUsManager.LoadGamesAsync(forceRefresh: true);

Localization

Game names and descriptions can be localized:

// Backend returns localized content based on device language
// Automatic language detection

// Or specify language
await IVXMoreOfUsManager.LoadGamesAsync(language: "es");