add ready player me POC
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 22cf0662ba294338ba45378a3d307b35
|
||||
timeCreated: 1669378247
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
using ReadyPlayerMe.Core;
|
||||
using UnityEngine;
|
||||
|
||||
namespace ReadyPlayerMe.Samples.AvatarLoading
|
||||
{
|
||||
/// <summary>
|
||||
/// This class is a simple <see cref="Monobehaviour"/> to serve as an example on how to load Ready Player Me avatars and spawn as a <see cref="GameObject"/> into the scene.
|
||||
/// </summary>
|
||||
public class AvatarLoadingExample : MonoBehaviour
|
||||
{
|
||||
[SerializeField] [Tooltip("Set this to the URL or shortcode of the Ready Player Me Avatar you want to load.")]
|
||||
private string avatarUrl = "https://models.readyplayer.me/638df693d72bffc6fa17943c.glb";
|
||||
|
||||
private GameObject avatar;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
ApplicationData.Log();
|
||||
var avatarLoader = new AvatarObjectLoader();
|
||||
// use the OnCompleted event to set the avatar and setup animator
|
||||
avatarLoader.OnCompleted += (_, args) =>
|
||||
{
|
||||
avatar = args.Avatar;
|
||||
AvatarAnimationHelper.SetupAnimator(args.Metadata, args.Avatar);
|
||||
};
|
||||
avatarLoader.LoadAvatar(avatarUrl);
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
if (avatar != null) Destroy(avatar);
|
||||
}
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5ec678a30bb724ed9999a22a9e41d8af
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 259814
|
||||
packageName: Ready Player Me Avatar and Character Creator
|
||||
packageVersion: 7.3.1
|
||||
assetPath: Assets/Ready Player Me/Core/Samples/AvatarLoadingSamples/AvatarLoading/AvatarLoadingExample.cs
|
||||
uploadId: 704624
|
||||
+2150
File diff suppressed because it is too large
Load Diff
+14
@@ -0,0 +1,14 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bb69c446634b2d94585694a1dfcffd7e
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 259814
|
||||
packageName: Ready Player Me Avatar and Character Creator
|
||||
packageVersion: 7.3.1
|
||||
assetPath: Assets/Ready Player Me/Core/Samples/AvatarLoadingSamples/AvatarLoading/AvatarLoadingExample.unity
|
||||
uploadId: 704624
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c691bdeea722e4b5b90a0a98b36a1c39
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 3663d6a9358ae4149aad3496e56d4601, type: 3}
|
||||
m_Name: Avatar Configuration LOD0
|
||||
m_EditorClassIdentifier:
|
||||
MeshLod: 0
|
||||
Pose: 0
|
||||
TextureAtlas: 1
|
||||
TextureSizeLimit: 1024
|
||||
UseHands: 0
|
||||
MorphTargets: []
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 99552ccf737554f2fab58e864f9416e4
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 259814
|
||||
packageName: Ready Player Me Avatar and Character Creator
|
||||
packageVersion: 7.3.1
|
||||
assetPath: Assets/Ready Player Me/Core/Samples/AvatarLoadingSamples/AvatarLod/Avatar
|
||||
Configuration LOD0.asset
|
||||
uploadId: 704624
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 3663d6a9358ae4149aad3496e56d4601, type: 3}
|
||||
m_Name: Avatar Configuration LOD1
|
||||
m_EditorClassIdentifier:
|
||||
MeshLod: 1
|
||||
Pose: 0
|
||||
TextureAtlas: 2
|
||||
TextureSizeLimit: 512
|
||||
UseHands: 0
|
||||
MorphTargets: []
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1d2a8b01037e24f54b99b6aa9a51f0db
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 259814
|
||||
packageName: Ready Player Me Avatar and Character Creator
|
||||
packageVersion: 7.3.1
|
||||
assetPath: Assets/Ready Player Me/Core/Samples/AvatarLoadingSamples/AvatarLod/Avatar
|
||||
Configuration LOD1.asset
|
||||
uploadId: 704624
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 3663d6a9358ae4149aad3496e56d4601, type: 3}
|
||||
m_Name: Avatar Configuration LOD2
|
||||
m_EditorClassIdentifier:
|
||||
MeshLod: 2
|
||||
Pose: 0
|
||||
TextureAtlas: 3
|
||||
TextureSizeLimit: 256
|
||||
UseHands: 0
|
||||
MorphTargets:
|
||||
- none
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5fba8af1affda4895895126e539c6165
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 259814
|
||||
packageName: Ready Player Me Avatar and Character Creator
|
||||
packageVersion: 7.3.1
|
||||
assetPath: Assets/Ready Player Me/Core/Samples/AvatarLoadingSamples/AvatarLod/Avatar
|
||||
Configuration LOD2.asset
|
||||
uploadId: 704624
|
||||
+122
@@ -0,0 +1,122 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using ReadyPlayerMe.Core;
|
||||
using UnityEngine;
|
||||
|
||||
namespace ReadyPlayerMe.Samples.AvatarLoading
|
||||
{
|
||||
/// <summary>
|
||||
/// This class is a simple <see cref="Monobehaviour"/> to serve as an example on how to load a Ready Player Me avatar with multiple LOD's (level of detail) and spawn as a <see cref="GameObject"/> into the scene at runtime.
|
||||
/// </summary>
|
||||
public class AvatarLodExample : MonoBehaviour
|
||||
{
|
||||
private const string LOD_MESH_SUFFIX = "_LOD";
|
||||
private const float CULL_TRANSITION = 0.05f;
|
||||
|
||||
[SerializeField]
|
||||
private AvatarLodExampleUI lodExampleUI;
|
||||
[SerializeField] [Tooltip("Set this to the URL or shortcode of the Ready Player Me Avatar you want to load.")]
|
||||
private string avatarUrl;
|
||||
[SerializeField]
|
||||
private AvatarConfig[] lodConfigs;
|
||||
|
||||
private LODGroup lodGroup;
|
||||
private bool loading;
|
||||
private GameObject mainAvatar;
|
||||
private SkinnedMeshRenderer mainMeshRenderer;
|
||||
private readonly List<SkinnedMeshRenderer> meshRenderersList = new List<SkinnedMeshRenderer>();
|
||||
|
||||
private void Start()
|
||||
{
|
||||
ApplicationData.Log();
|
||||
if (lodExampleUI) lodExampleUI.Init();
|
||||
LoadLodAvatar();
|
||||
}
|
||||
|
||||
/// Loads all the avatar LOD's as per the lodConfigs length and configuration
|
||||
private async void LoadLodAvatar()
|
||||
{
|
||||
var avatarMetadata = new AvatarMetadata();
|
||||
|
||||
foreach (var config in lodConfigs)
|
||||
{
|
||||
var lodLevel = (int) config.Lod;
|
||||
|
||||
var loader = new AvatarObjectLoader();
|
||||
loader.AvatarConfig = config;
|
||||
loader.LoadAvatar(avatarUrl);
|
||||
// use the OnCompleted event to setup the mesh renderers
|
||||
loader.OnCompleted += (sender, args) =>
|
||||
{
|
||||
if (mainAvatar == null)
|
||||
{
|
||||
avatarMetadata = args.Metadata;
|
||||
mainAvatar = Instantiate(args.Avatar);
|
||||
mainAvatar.name = args.Avatar.name + LOD_MESH_SUFFIX;
|
||||
|
||||
mainMeshRenderer = mainAvatar.GetComponentInChildren<SkinnedMeshRenderer>();
|
||||
var meshTransform = mainMeshRenderer.transform;
|
||||
meshTransform.name = meshTransform.name += $"{LOD_MESH_SUFFIX}{lodLevel}";
|
||||
mainMeshRenderer.enabled = false;
|
||||
meshRenderersList.Add(mainMeshRenderer);
|
||||
}
|
||||
else
|
||||
{
|
||||
var lodSkinnedMeshRenderer = args.Avatar.GetComponentInChildren<SkinnedMeshRenderer>();
|
||||
lodSkinnedMeshRenderer.rootBone = mainMeshRenderer.rootBone;
|
||||
lodSkinnedMeshRenderer.bones = mainMeshRenderer.bones;
|
||||
lodSkinnedMeshRenderer.transform.name += $"{LOD_MESH_SUFFIX}{lodLevel}";
|
||||
lodSkinnedMeshRenderer.transform.SetParent(mainAvatar.transform);
|
||||
lodSkinnedMeshRenderer.transform.SetSiblingIndex(lodLevel);
|
||||
lodSkinnedMeshRenderer.enabled = false;
|
||||
meshRenderersList.Add(lodSkinnedMeshRenderer);
|
||||
}
|
||||
|
||||
Destroy(args.Avatar);
|
||||
|
||||
loading = false;
|
||||
};
|
||||
loading = true;
|
||||
|
||||
while (loading)
|
||||
{
|
||||
await Task.Yield();
|
||||
}
|
||||
}
|
||||
|
||||
AddLodGroup();
|
||||
AvatarAnimationHelper.SetupAnimator(avatarMetadata, mainAvatar);
|
||||
if (lodExampleUI) lodExampleUI.Show();
|
||||
}
|
||||
|
||||
/// Adds and configures the LODGroup component
|
||||
private void AddLodGroup()
|
||||
{
|
||||
lodGroup = mainAvatar.AddComponent<LODGroup>();
|
||||
var lods = new LOD[lodConfigs.Length];
|
||||
for (var i = 0; i < lodConfigs.Length; i++)
|
||||
{
|
||||
meshRenderersList[i].enabled = true;
|
||||
lods[i] = new LOD(CalculateTransitionHeight(i), new Renderer[] { meshRenderersList[i] });
|
||||
}
|
||||
lodGroup.SetLODs(lods);
|
||||
lodGroup.RecalculateBounds();
|
||||
|
||||
lodExampleUI.LodGroup = lodGroup;
|
||||
}
|
||||
|
||||
private float CalculateTransitionHeight(int lodConfig)
|
||||
{
|
||||
var lodTransition = (lodConfig + 1f) / lodConfigs.Length;
|
||||
return (1 - lodTransition + CULL_TRANSITION);
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
if (mainAvatar != null)
|
||||
{
|
||||
Destroy(mainAvatar);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 707cd498ac29848c587fbf68dc32aa85
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 259814
|
||||
packageName: Ready Player Me Avatar and Character Creator
|
||||
packageVersion: 7.3.1
|
||||
assetPath: Assets/Ready Player Me/Core/Samples/AvatarLoadingSamples/AvatarLod/AvatarLodExample.cs
|
||||
uploadId: 704624
|
||||
+2751
File diff suppressed because it is too large
Load Diff
+14
@@ -0,0 +1,14 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 70100edf1a7db4b519c15b52da0e13f2
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 259814
|
||||
packageName: Ready Player Me Avatar and Character Creator
|
||||
packageVersion: 7.3.1
|
||||
assetPath: Assets/Ready Player Me/Core/Samples/AvatarLoadingSamples/AvatarLod/AvatarLodExample.unity
|
||||
uploadId: 704624
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace ReadyPlayerMe.Samples.AvatarLoading
|
||||
{
|
||||
public class AvatarLodExampleUI : MonoBehaviour
|
||||
{
|
||||
private Slider uiSlider;
|
||||
private Vector3 cameraStartPos;
|
||||
private Text lodInfoText;
|
||||
|
||||
[SerializeField] private Camera mainCamera;
|
||||
|
||||
public LODGroup LodGroup { set; get; }
|
||||
|
||||
public void Init()
|
||||
{
|
||||
QualitySettings.lodBias = 1f;
|
||||
lodInfoText = GetComponentInChildren<Text>();
|
||||
uiSlider = GetComponentInChildren<Slider>();
|
||||
cameraStartPos = mainCamera ? mainCamera.transform.position : Vector3.zero;
|
||||
uiSlider.onValueChanged.AddListener(UpdatePosition);
|
||||
}
|
||||
|
||||
public void Show()
|
||||
{
|
||||
GetComponent<Canvas>().enabled = true;
|
||||
}
|
||||
|
||||
private void UpdatePosition(float value)
|
||||
{
|
||||
mainCamera.transform.position = new Vector3(cameraStartPos.x, cameraStartPos.y, cameraStartPos.z + value);
|
||||
Invoke(nameof(UpdateCurrentLod), 0.1f);
|
||||
}
|
||||
|
||||
private void UpdateCurrentLod()
|
||||
{
|
||||
if (LodGroup != null)
|
||||
{
|
||||
Transform lodTransform = LodGroup.transform;
|
||||
foreach (Transform child in lodTransform)
|
||||
{
|
||||
var thisRenderer = child.GetComponent<SkinnedMeshRenderer>();
|
||||
if (thisRenderer != null && thisRenderer.isVisible)
|
||||
{
|
||||
var currentLod = child.name.Split('_').Last();
|
||||
var vertexCount = thisRenderer.sharedMesh.vertexCount;
|
||||
var textureSize = thisRenderer.sharedMaterial.mainTexture.height;
|
||||
var morphTargetCount = thisRenderer.sharedMesh.blendShapeCount;
|
||||
UpdateLodInfoPanel(currentLod, vertexCount, textureSize, morphTargetCount);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateLodInfoPanel(string currentLod, int vertexCount, int textureSize, int morphTargetCount)
|
||||
{
|
||||
lodInfoText.text = "Current LOD\n" + currentLod + "\n" +
|
||||
"Vertex Count\n" + vertexCount + "\n" +
|
||||
"Texture Size\n" + textureSize + "\n" +
|
||||
"Blend Shapes\n" + morphTargetCount;
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
uiSlider.onValueChanged.RemoveAllListeners();
|
||||
}
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 260ad8794b02546e5b200807e952ba36
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 259814
|
||||
packageName: Ready Player Me Avatar and Character Creator
|
||||
packageVersion: 7.3.1
|
||||
assetPath: Assets/Ready Player Me/Core/Samples/AvatarLoadingSamples/AvatarLod/AvatarLodExampleUI.cs
|
||||
uploadId: 704624
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 69dcfd12ccd44feb865f4afe67dc5f41
|
||||
timeCreated: 1669378324
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using ReadyPlayerMe.Core;
|
||||
using UnityEngine;
|
||||
|
||||
namespace ReadyPlayerMe.Samples.AvatarLoading
|
||||
{
|
||||
/// <summary>
|
||||
/// This class is a simple <see cref="Monobehaviour"/> to serve as an example on how to load Ready Player Me avatars and spawn as a <see cref="GameObject"/> into the scene.
|
||||
/// </summary>
|
||||
public class MultipleAvatarLoadingExample : MonoBehaviour
|
||||
{
|
||||
private const int RADIUS = 1;
|
||||
[SerializeField] [Tooltip("Set this to the URL or shortcodes of the Ready Player Me Avatar you want to load.")]
|
||||
private string[] avatarUrls =
|
||||
{
|
||||
"https://models.readyplayer.me/638df5fc5a7d322604bb3a58.glb",
|
||||
"https://models.readyplayer.me/638df70ed72bffc6fa179596.glb",
|
||||
"https://models.readyplayer.me/638df75e5a7d322604bb3dcd.glb",
|
||||
"https://models.readyplayer.me/638df7d1d72bffc6fa179763.glb"
|
||||
};
|
||||
private List<GameObject> avatarList;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
ApplicationData.Log();
|
||||
|
||||
avatarList = new List<GameObject>();
|
||||
var urlSet = new HashSet<string>(avatarUrls);
|
||||
|
||||
StartCoroutine(LoadAvatars(urlSet));
|
||||
}
|
||||
|
||||
/// This method is used to cleanup/destroy avatar <c>GameObject</c>'s when they are no longer needed.
|
||||
private void OnDestroy()
|
||||
{
|
||||
StopAllCoroutines();
|
||||
if (avatarList != null)
|
||||
{
|
||||
foreach (GameObject avatar in avatarList)
|
||||
{
|
||||
Destroy(avatar);
|
||||
}
|
||||
avatarList.Clear();
|
||||
avatarList = null;
|
||||
}
|
||||
}
|
||||
|
||||
/// Loops through all the avatar urls in the <paramref name="urlSet"/> and loads them one after the other.
|
||||
private IEnumerator LoadAvatars(HashSet<string> urlSet)
|
||||
{
|
||||
var loading = false;
|
||||
|
||||
foreach (var url in urlSet)
|
||||
{
|
||||
loading = true;
|
||||
var loader = new AvatarObjectLoader();
|
||||
// use the OnCompleted event setup the animator and run the OnAvatarLoaded method
|
||||
loader.OnCompleted += (sender, args) =>
|
||||
{
|
||||
loading = false;
|
||||
AvatarAnimationHelper.SetupAnimator(args.Metadata, args.Avatar);
|
||||
OnAvatarLoaded(args.Avatar);
|
||||
};
|
||||
loader.LoadAvatar(url);
|
||||
|
||||
yield return new WaitUntil(() => !loading);
|
||||
}
|
||||
}
|
||||
|
||||
/// This method is called after the avatar has been loadded and setup in the scene and is used to set the position of the <c>GameObject</c> in the scene.
|
||||
private void OnAvatarLoaded(GameObject avatar)
|
||||
{
|
||||
if (avatarList != null)
|
||||
{
|
||||
avatarList.Add(avatar);
|
||||
avatar.transform.position = Quaternion.Euler(90, 0, 0) * Random.insideUnitCircle * RADIUS;
|
||||
}
|
||||
else
|
||||
{
|
||||
Destroy(avatar);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dc96293c4d89eff4fa7b1ad7dc22deb0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 259814
|
||||
packageName: Ready Player Me Avatar and Character Creator
|
||||
packageVersion: 7.3.1
|
||||
assetPath: Assets/Ready Player Me/Core/Samples/AvatarLoadingSamples/MultipleAvatarLoading/MultipleAvatarLoadingExample.cs
|
||||
uploadId: 704624
|
||||
+2094
File diff suppressed because it is too large
Load Diff
+14
@@ -0,0 +1,14 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8e059d38b1a8d8343b2a3631d7ae5f18
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 259814
|
||||
packageName: Ready Player Me Avatar and Character Creator
|
||||
packageVersion: 7.3.1
|
||||
assetPath: Assets/Ready Player Me/Core/Samples/AvatarLoadingSamples/MultipleAvatarLoading/MultipleAvatarLoadingExample.unity
|
||||
uploadId: 704624
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 87509d667496b6f4b9316ad1cbedf5b2
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using ReadyPlayerMe.Core;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace ReadyPlayerMe.Samples.AvatarLoading
|
||||
{
|
||||
public class MultipleQualityAvatarLoadingExample : MonoBehaviour
|
||||
{
|
||||
|
||||
[SerializeField]
|
||||
private string avatarUrl = "https://models.readyplayer.me/638df75e5a7d322604bb3dcd.glb";
|
||||
[SerializeField]
|
||||
private Transform qualityContainerPrefab;
|
||||
[SerializeField]
|
||||
private AvatarConfigData[] avatarConfigs;
|
||||
|
||||
private List<GameObject> avatarList;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
ApplicationData.Log();
|
||||
avatarList = new List<GameObject>();
|
||||
StartCoroutine(LoadAvatars());
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
StopAllCoroutines();
|
||||
if (avatarList != null)
|
||||
{
|
||||
foreach (GameObject avatar in avatarList)
|
||||
{
|
||||
Destroy(avatar);
|
||||
}
|
||||
avatarList.Clear();
|
||||
avatarList = null;
|
||||
}
|
||||
}
|
||||
|
||||
private IEnumerator LoadAvatars()
|
||||
{
|
||||
var loading = false;
|
||||
|
||||
foreach (AvatarConfigData config in avatarConfigs)
|
||||
{
|
||||
loading = true;
|
||||
var loader = new AvatarObjectLoader();
|
||||
loader.OnCompleted += (sender, args) =>
|
||||
{
|
||||
loading = false;
|
||||
AvatarAnimationHelper.SetupAnimator(args.Metadata, args.Avatar);
|
||||
OnAvatarLoaded(args.Avatar, config);
|
||||
};
|
||||
loader.AvatarConfig = config.Config;
|
||||
loader.LoadAvatar(avatarUrl);
|
||||
|
||||
yield return new WaitUntil(() => !loading);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnAvatarLoaded(GameObject avatar, AvatarConfigData data)
|
||||
{
|
||||
if (avatarList != null)
|
||||
{
|
||||
var quality = data.Config.name.Substring("Avatar Config".Length);
|
||||
Transform container = Instantiate(qualityContainerPrefab);
|
||||
container.name = quality;
|
||||
container.position = new Vector3(data.PosX, 0, 0);
|
||||
container.GetComponentInChildren<Text>().text = "<b>" + quality + "</b>\n" +
|
||||
"MeshLoad: " + data.Config.Lod + "\n" +
|
||||
"Texture: " + data.Config.TextureAtlas;
|
||||
avatar.name = "Avatar";
|
||||
avatar.transform.SetParent(container, false);
|
||||
avatarList.Add(container.gameObject);
|
||||
}
|
||||
else
|
||||
{
|
||||
Destroy(avatar);
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
private struct AvatarConfigData
|
||||
{
|
||||
public AvatarConfig Config;
|
||||
public float PosX;
|
||||
|
||||
// TODO Find a fix for ignoring warning
|
||||
// Had to add this constructor because of "Field is never assigned" warning
|
||||
public AvatarConfigData(AvatarConfig config, float posX)
|
||||
{
|
||||
Config = config;
|
||||
PosX = posX;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 224f12c77efd85442b0ee207215e2259
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 259814
|
||||
packageName: Ready Player Me Avatar and Character Creator
|
||||
packageVersion: 7.3.1
|
||||
assetPath: Assets/Ready Player Me/Core/Samples/AvatarLoadingSamples/MultipleQualityAvatarLoading/MultipleQualityAvatarLoadingExample.cs
|
||||
uploadId: 704624
|
||||
+2099
File diff suppressed because it is too large
Load Diff
+14
@@ -0,0 +1,14 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 03b0ef715be5f0741893a9c75d7712f8
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 259814
|
||||
packageName: Ready Player Me Avatar and Character Creator
|
||||
packageVersion: 7.3.1
|
||||
assetPath: Assets/Ready Player Me/Core/Samples/AvatarLoadingSamples/MultipleQualityAvatarLoading/MultipleQualityAvatarLoadingExample.unity
|
||||
uploadId: 704624
|
||||
+289
@@ -0,0 +1,289 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &66221596150849589
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 2864682271222091454}
|
||||
- component: {fileID: 5232411026552460661}
|
||||
- component: {fileID: 51886015861231641}
|
||||
- component: {fileID: 6527695666281933317}
|
||||
m_Layer: 5
|
||||
m_Name: Canvas
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &2864682271222091454
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 66221596150849589}
|
||||
m_LocalRotation: {x: -0, y: 1, z: -0, w: 0}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 0.001, y: 0.001, z: 0.001}
|
||||
m_Children:
|
||||
- {fileID: 958127205910372780}
|
||||
- {fileID: 1615667814320735963}
|
||||
m_Father: {fileID: 1853687888834283808}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 0, y: 0}
|
||||
m_AnchoredPosition: {x: -0.0453, y: 2.2233}
|
||||
m_SizeDelta: {x: 590.6979, y: 216.49927}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!223 &5232411026552460661
|
||||
Canvas:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 66221596150849589}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 3
|
||||
m_RenderMode: 2
|
||||
m_Camera: {fileID: 0}
|
||||
m_PlaneDistance: 100
|
||||
m_PixelPerfect: 0
|
||||
m_ReceivesEvents: 1
|
||||
m_OverrideSorting: 0
|
||||
m_OverridePixelPerfect: 0
|
||||
m_SortingBucketNormalizedSize: 0
|
||||
m_AdditionalShaderChannelsFlag: 0
|
||||
m_SortingLayerID: 0
|
||||
m_SortingOrder: 0
|
||||
m_TargetDisplay: 0
|
||||
--- !u!114 &51886015861231641
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 66221596150849589}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_UiScaleMode: 0
|
||||
m_ReferencePixelsPerUnit: 100
|
||||
m_ScaleFactor: 1
|
||||
m_ReferenceResolution: {x: 800, y: 600}
|
||||
m_ScreenMatchMode: 0
|
||||
m_MatchWidthOrHeight: 0
|
||||
m_PhysicalUnit: 3
|
||||
m_FallbackScreenDPI: 96
|
||||
m_DefaultSpriteDPI: 96
|
||||
m_DynamicPixelsPerUnit: 1
|
||||
--- !u!114 &6527695666281933317
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 66221596150849589}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_IgnoreReversedGraphics: 1
|
||||
m_BlockingObjects: 0
|
||||
m_BlockingMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
--- !u!1 &1853687888834283811
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1853687888834283808}
|
||||
m_Layer: 0
|
||||
m_Name: QualityContainer
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &1853687888834283808
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1853687888834283811}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children:
|
||||
- {fileID: 2864682271222091454}
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1 &5405597977882472060
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 958127205910372780}
|
||||
- component: {fileID: 7121030917185800971}
|
||||
- component: {fileID: 4569678332020499963}
|
||||
m_Layer: 5
|
||||
m_Name: Image
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &958127205910372780
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5405597977882472060}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 2864682271222091454}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!222 &7121030917185800971
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5405597977882472060}
|
||||
m_CullTransparentMesh: 0
|
||||
--- !u!114 &4569678332020499963
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5405597977882472060}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 0.27450982, g: 0.26666668, b: 0.25490198, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_Type: 1
|
||||
m_PreserveAspect: 0
|
||||
m_FillCenter: 1
|
||||
m_FillMethod: 4
|
||||
m_FillAmount: 1
|
||||
m_FillClockwise: 1
|
||||
m_FillOrigin: 0
|
||||
m_UseSpriteMesh: 0
|
||||
m_PixelsPerUnitMultiplier: 1
|
||||
--- !u!1 &5502648877521386677
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1615667814320735963}
|
||||
- component: {fileID: 417389983854223714}
|
||||
- component: {fileID: 7962115338986911485}
|
||||
m_Layer: 5
|
||||
m_Name: Text
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &1615667814320735963
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5502648877521386677}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 2864682271222091454}
|
||||
m_RootOrder: 1
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!222 &417389983854223714
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5502648877521386677}
|
||||
m_CullTransparentMesh: 0
|
||||
--- !u!114 &7962115338986911485
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5502648877521386677}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_FontData:
|
||||
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_FontSize: 60
|
||||
m_FontStyle: 0
|
||||
m_BestFit: 0
|
||||
m_MinSize: 1
|
||||
m_MaxSize: 100
|
||||
m_Alignment: 1
|
||||
m_AlignByGeometry: 0
|
||||
m_RichText: 1
|
||||
m_HorizontalOverflow: 0
|
||||
m_VerticalOverflow: 0
|
||||
m_LineSpacing: 1
|
||||
m_Text: '<b>High</b>
|
||||
|
||||
MeshLoad: High
|
||||
|
||||
Texture: High'
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7e49cdc951d802d4d9bfdf45578ca7f8
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 259814
|
||||
packageName: Ready Player Me Avatar and Character Creator
|
||||
packageVersion: 7.3.1
|
||||
assetPath: Assets/Ready Player Me/Core/Samples/AvatarLoadingSamples/MultipleQualityAvatarLoading/QualityContainer.prefab
|
||||
uploadId: 704624
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"name": "ReadyPlayerMe.Samples.AvatarLoading",
|
||||
"rootNamespace": "",
|
||||
"references": [
|
||||
"ReadyPlayerMe.Core"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": false
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b7665bce58a1de546a53a59dc2154359
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 259814
|
||||
packageName: Ready Player Me Avatar and Character Creator
|
||||
packageVersion: 7.3.1
|
||||
assetPath: Assets/Ready Player Me/Core/Samples/AvatarLoadingSamples/ReadyPlayerMe.Samples.AvatarLoading.asmdef
|
||||
uploadId: 704624
|
||||
Reference in New Issue
Block a user