Skip to main content

Genies SDK Avatar v3.8.4

Updated: April 10, 2026

Breaking Changes

  • Updating to this version requires a clean import or else it will break projects. See the Update the SDK page for instructions.
  • Built-in Avatar Editor extracted to separate package - The Avatar Editor is now a standalone package. All editor methods on AvatarSdk (e.g., OpenAvatarEditorAsync, CloseAvatarEditorAsync, SetEditorSave*) now log errors and no-op. To restore editor functionality, see the Legacy Avatar Editor page for instructions.
  • Cinemachine dependency removed - Cinemachine is no longer included as an SDK dependency. If your project relies on Cinemachine, add it as a direct dependency in your project's manifest.
  • Several wearable and color methods deprecated - See the [Deprecations] section below for more details.
  • Feature stat methods renamed to async - Three methods have been renamed and now return UniTask:
Old MethodNew Method
ModifyAvatarFeatureStat(...)ModifyAvatarFeatureStatAsync(...) returns UniTask<bool>
ModifyAvatarFeatureStats(...)ModifyAvatarFeatureStatsAsync(...) returns UniTask<bool>
GetAvatarFeatureStats(...)GetAvatarFeatureStatsAsync(...) returns UniTask<Dictionary<AvatarFeatureStat, float>>
  • Parameter order changed on wearable query methods - forceFetch and cancellationToken positions have been swapped:
MethodOld SignatureNew Signature
GetDefaultWearablesByCategoryAsync(category, cancellationToken, forceFetch)(category, forceFetch, cancellationToken)
GetUserWearablesByCategoryAsync(category, cancellationToken, forceFetch)(category, forceFetch, cancellationToken)

What's New

  • Progressive Avatar Loading: Avatars now load progressively for a faster time-to-screen experience. A lightweight silhouette appears immediately, followed by low-resolution assets, then the full-fidelity avatar - so users see something on screen almost instantly while higher-quality assets stream in behind the scenes. This is enabled by default.
    • Configurable LODs - Choose target quality via AvatarLods: High (2048), Medium (1024), or Low (512). All load methods accept an optional AvatarLods[] parameter to control resolution.
    • ManagedAvatar.LoadingComplete event - Fires when the full-fidelity avatar is ready. Use this to trigger UI transitions or gameplay logic that depends on the avatar being fully loaded.
    • Note: Async load methods (e.g., LoadUserAvatarAsync) now return when the silhouette is ready, before the full avatar has rendered. Use LoadingComplete or the OnLoadingComplete callback in LoadAvatarOptions to detect when loading is fully complete.
  • The built-in Avatar Editor has been removed from the SDK and extracted to a standalone package. See the Legacy Avatar Editor page for more information.
    • It's recommended to use the Custom Avatar Editor sample which demonstrates how you can create your own Avatar Editor using API endpoints.
  • New LoadAvatarAsync<T> API: A new unified method for loading avatars with structured options:
    • AvatarSdk.LoadAvatarAsync<T>(T options) - a single entry point supporting four load paths:
      • LoadAvatarOptions.User - loads the authenticated user's avatar
      • LoadAvatarOptions.ByDefinition - loads from a JSON definition string
      • LoadAvatarOptions.Default - loads a default fallback avatar
      • LoadAvatarOptions.Test - loads a test avatar
    • Explicit load methods like LoadUserAvatarAsync are considered legacy. Opt to use the generic method instead.
  • Avatar Screenshot API: New AvatarSdk.CreateAvatarScreenshotAsync() method captures a headshot PNG of any avatar:
    • Configurable resolution (default 512x512), transparency, MSAA, FOV, and framing
    • Returns byte[] PNG data; optionally saves to a file path on device
  • Custom Colors & Facial Hair
    • User custom color management - Create, update, and delete custom color presets for hair, eyebrows, and eyelashes via CreateUserColorAsync, UpdateUserColorAsync, and DeleteUserColorAsync
    • Facial hair customization - Facial hair is now a distinct hair type that can be equipped and colored independently. Use CreateFacialHairColor() to create colors for use with SetColorAsync
  • New Wearable & Feature Categories
    • Jacket and Hoodies added as distinct wearable slots as opposed to being grouped together as Outerwear.
    • User categories were added for jackets, dress, skirt, and shoes to match what Genies Art Forge offers.
    • .All value added to AvatarFeatureCategory, AvatarMakeupCategory, WearablesCategory, UserWearablesCategory, HairType, and ColorType for querying all items at once.
  • Samples Scenes Update: With the removal of the built-in Avatar Editor, the sample scenes needed to be updated to remove it.
    • Creating an Avatar Editor - Full-featured replacement for the removed built-in Avatar Editor. It has improved UI and functionality from the previous version.
    • Avatar Starter - Simplified to focus on basic avatar loading. Removed Avatar Editor and Cinemachine integration.
    • Using Multiple Avatars - Now demonstrates 4 avatars (up from 2) and showcases LoadAvatarByDefinitionAsync for loading avatars from JSON definitions.

What's Fixed

  • Fixes crash from a race condition when an avatar load is interrupted mid-stream.
  • Fixes hair particles flying across the screen when changing hairstyles.
  • Fixes incorrect tattoo category enum mapping.
  • Fixes crashes related to native material handling.

Improvements

  • Inventory caching - Wearable and default inventory data is cached more aggressively, reducing redundant server calls when browsing categories.
  • Dynamics scale tolerance - Hair and clothing physics now correctly handle scale changes on the avatar root, fixing artifacts when avatars are resized.
  • Reduced GC overhead - Removed unnecessary garbage collection calls, reducing GC spikes during avatar animation.

Deprecations

  • Several wearable and color methods deprecated - The following methods are deprecated and will be removed in a future version. Use the replacement instead:
Deprecated MethodReplacement
GetWearableAssetInfoListAsync()GetDefaultWearablesByCategoryAsync() or GetUserWearablesByCategoryAsync()
EquipOutfitAsync()EquipWearableByWearableIdAsync()
UnEquipOutfitAsync()UnEquipWearableByWearableIdAsync()
SetSkinColorAsync()SetColorAsync() with CreateSkinColor()
GetUsersAssetsAsync()GetUserWearablesByCategoryAsync()