You can follow these docs to create an integration with Player Zero, integrate Player Zero avatars into your games, and eventually submit your game to the Player Zero Games Catalog.
Sample Avatar Loader component.Assets/Samples/Player Zero SDK/<version>/QuickStart/


A step by step guide to integrate Player Zero into your game via our APIs
```
GET https://api.readyplayer.me/v1/characters/:avatarId
```
Example Response:
{
"data": {
"id": "avatarId",
"userId": "userId",
"applicationId": "applicationId",
"blueprintId": "blueprintId",
"assets": {
"iris": [
"irisId"
],
"sclera": [
"scleraId"
],
"hair": [
"hairId"
],
"eyebrows": [
"eyebrowsId"
],
"lipshape": [
"lipshapeId"
],
"eyeshape": [
"eyeshapeId
],
"faceshape": [
"faceshapeId"
],
"top": [
"topId"
],
"bottom": [
"bottomId"
],
"footwear": [
"footwearId"
],
"piercing": [],
"tattoo": [],
"eyeliner": [],
"blemish": [],
"scar": [],
"foundation": [],
"lipstick": [],
"blush": [],
"eyeshadow": [],
"sticker": [],
"cloth": [],
"freckles": [],
"sunburn": [],
"vitiligo": [],
"teeth": [],
"attachment": []
},
"colors": {
"skin": "#B06B45",
"lips": "#C97B7B",
"hair": {
"primary": "#191919",
"secondary": "#583C2F"
},
"beard": {
"primary": "#2e201a",
"secondary": "#543f36"
},
"eyebrows": {
"primary": "#4B3329",
"secondary": "#715447"
},
"eye": "#9d6937",
"eyeshadow": {
"primary": "#0c0804"
}
},
"createdAt": "2025-02-22T13:32:59.906Z",
"updatedAt": "2025-02-22T13:32:59.906Z",
"username": "anonymous",
"modelUrl": "https://avatars.readyplayer.me/:avatarId.glb",
"iconUrl": "https://avatars.readyplayer.me/:avatarId.png"
}
}```
GET https://avatars.readyplayer.me/:avatarId.glb?targetBlueprintId=:blueprintId
```
Example Response:
.GLB file download responsehttps://playerzero.readyplayer.me/games/my-great-game?avatarId=AVATAR_ID_HERE```
POST https://api.readyplayer.me/v1/public/events
```
Example Payload:
{
"data": {
"event": "avatar_session_ended",
"properties": {
"avatar_session_id": "AVATAR_SESSION_ID"
}
}
}
Example Response:
{
"data": {
"event": "avatar_session_ended",
"properties": {
"avatar_session_id": "AVATAR_SESSION_ID"
}
}
}A step by step guide to integrate the Player Zero SDK into your game
Assets/Plugins/Android




<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="playerzero0000" android:host="playerzero" />
</intent-filter> public class DeepLinkingSample : MonoBehaviour {
public async Task LoadAvatar(string avatarId)
{
var response = await PlayerZeroSdk.GetAvatarMetadataAsync(avatarId);
var characterRequestConfig = new CharacterRequestConfig()
{
AvatarId = avatarId,
AvatarUrl = response.ModelUrl,
BlueprintId = response.BlueprintId,
Parent = transform
};
var avatarGameObject = await PlayerZeroSdk.InstantiateAvatarAsync(characterRequestConfig);
}
}public void LoadHotLoadedAvatar()
{
LoadAvatar(PlayerZeroSdk.GetHotLoadedAvatarId());
}private void Awake()
{
PlayerZeroSdk.OnHotLoadedAvatarIdChanged += OnHotLoadedAvatarIdChanged;
}
private void OnHotLoadedAvatarIdChanged(string avatarId)
{
LoadAvatar(avatarId);
}private void OnDestroy()
{
PlayerZeroSdk.OnHotLoadedAvatarIdChanged -= OnHotLoadedAvatarIdChanged
}using System.Threading.Tasks;
using PlayerZero.Runtime.Sdk;
using UnityEngine;
public class DeepLinkingSample : MonoBehaviour
{
private void Awake()
{
PlayerZeroSdk.OnHotLoadedAvatarIdChanged += OnHotLoadedAvatarIdChanged;
}
private void OnDestroy()
{
PlayerZeroSdk.OnHotLoadedAvatarIdChanged -= OnHotLoadedAvatarIdChanged;
}
private void OnHotLoadedAvatarIdChanged(string avatarId)
{
LoadAvatar(avatarId);
}
public void LoadHotLoadedAvatar()
{
LoadAvatar(PlayerZeroSdk.GetHotLoadedAvatarId());
}
public async Task LoadAvatar(string avatarId)
{
var response = await PlayerZeroSdk.GetAvatarMetadataAsync(avatarId);
var characterRequestConfig = new CharacterRequestConfig()
{
AvatarId = avatarId,
AvatarUrl = response.ModelUrl,
BlueprintId = response.BlueprintId,
Parent = transform
};
var avatarGameObject = await PlayerZeroSdk.InstantiateAvatarAsync(characterRequestConfig);
}
}using PlayerZero.Runtime.Sdk;
using UnityEngine;
public class TestScript : MonoBehaviour
{
// Start is called before the first frame update
private async void Start()
{
var avatar = await PlayerZeroSdk.InstantiateAvatarAsync(
new CharacterRequestConfig()
{
AvatarId = "AVATAR_ID_HERE"
}
);
}
}using PlayerZero.Runtime.Sdk;
using PlayerZero.Runtime.MeshTransfer;
using UnityEngine;
public class MeshTransferExample : MonoBehaviour
{
public GameObject existingCharacter; // This should be your in-scene character prefab with a SkinnedMeshRenderer setup.
private async void Start()
{
var avatar = await PlayerZeroSdk.InstantiateAvatarAsync(new CharacterRequestConfig
{
AvatarId = "AVATAR_ID_HERE",
BlueprintId = "BLUEPRINT_ID_HERE"
});
var meshTransfer = new MeshTransfer();
// Perform the transfer from the new avatar to your existing character
meshTransfer.Transfer(avatar, existingCharacter);
}
}using PlayerZero.Runtime.Sdk;
using UnityEngine;
public class TestScript : MonoBehaviour
{
// Start is called before the first frame update
private async void Start()
{
var avatar = await PlayerZeroSdk.InstantiateAvatarAsync(
new CharacterRequestConfig()
{
AvatarId = "AVATAR_ID_HERE",
BlueprintId = "BLUEPRINT_ID_HERE"
}
);
}
}using PlayerZero.Runtime.Sdk;
using UnityEngine;
public class TestScript : MonoBehaviour
{
// Start is called before the first frame update
private async void Start()
{
var avatarId = PlayerZeroSdk.GetHotLoadedAvatarId();
var avatar = await PlayerZeroSdk.InstantiateAvatarAsync(
new CharacterRequestConfig()
{
AvatarId = avatarId,
BlueprintId = "BLUEPRINT_ID_HERE"
});
}
}using PlayerZero.Api.V1;
using PlayerZero.Runtime.Sdk;
using UnityEngine;
public class TestScript : MonoBehaviour
{
// Start is called before the first frame update
private void Start()
{
var avatarId = PlayerZeroSdk.GetHotLoadedAvatarId();
PlayerZeroSdk.StartEventSession<GameSessionStartedEvent, GameSessionStartedProperties>(
new GameSessionStartedEvent()
{
Properties = new GameSessionStartedProperties()
{
AvatarId = avatarId,
}
});
}
}using PlayerZero.Runtime;
public class NetworkManager
{
private void Start()
{
if(LobbyQueryHandler.CheckForLobby())
{
//Lobby parameters found, setup in game network room or lobby
}
}
}PhotonNetwork.JoinOrCreateRoom(LobbyQueryHandler.LobbyId, new RoomOptions(), TypedLobby.Default);if (LobbyQueryHandler.IsHost) //host will create room while others will join room
{
PhotonNetwork.CreateRoom(LobbyQueryHandler.LobbyId, new RoomOptions(), TypedLobby.Default);
}
else
{
PhotonNetwork.JoinRoom(LobbyQueryHandler.LobbyId);
}PhotonNetwork.PhotonServerSettings.AppSettings.FixedRegion = LobbyQueryHandler.HostRegion;
PhotonNetwork.ConnectUsingSettings();// playerScore is an int value that represents the players score.
// the score is used to determine which member of the lobby is the "winner" of the game
// if score is not applicable to your game then you can just send 0
PlayerZeroSDK.SendBackToPlayerZero(playerScore);