diff --git a/Runtime/AvatarCreator/Scripts/Managers/AvatarManager.cs b/Runtime/AvatarCreator/Scripts/Managers/AvatarManager.cs index 46a7558f..417f274c 100644 --- a/Runtime/AvatarCreator/Scripts/Managers/AvatarManager.cs +++ b/Runtime/AvatarCreator/Scripts/Managers/AvatarManager.cs @@ -229,6 +229,50 @@ public async Task UpdateAsset(AssetType assetType, object assetId) return await inCreatorAvatarLoader.Load(avatarId, gender, data); } + + public async Task UpdateAssets(Dictionary assetIdByType) + { + var payload = new AvatarProperties + { + Assets = new Dictionary() + }; + // if it contains top, bottom or footwear, remove outfit + if (assetIdByType.ContainsKey(AssetType.Top) || assetIdByType.ContainsKey(AssetType.Bottom) || assetIdByType.ContainsKey(AssetType.Footwear)) + { + payload.Assets.Add(AssetType.Outfit, string.Empty); + } + + // Convert costume to outfit + foreach (var assetType in assetIdByType.Keys) + { + payload.Assets.Add(assetType == AssetType.Costume ? AssetType.Outfit : assetType, assetIdByType[assetType]); + } + + byte[] data; + try + { + data = await avatarAPIRequests.UpdateAvatar(avatarId, payload, avatarConfigParameters); + } + catch (Exception e) + { + HandleException(e); + return null; + } + + if (ctxSource.IsCancellationRequested) + { + return null; + } + foreach (var assetType in assetIdByType) + { + if (assetType.Key != AssetType.BodyShape) + { + await ValidateBodyShapeUpdate(assetType.Key, assetType.Value); + } + } + + return await inCreatorAvatarLoader.Load(avatarId, gender, data); + } /// /// Function that checks if body shapes are enabled in the studio. This validation is performed only in the editor. diff --git a/Samples~/AvatarCreatorSamples/AvatarCreatorElements/Scripts/AvatarHandler.cs b/Samples~/AvatarCreatorSamples/AvatarCreatorElements/Scripts/AvatarHandler.cs index abcb26c3..ae600979 100644 --- a/Samples~/AvatarCreatorSamples/AvatarCreatorElements/Scripts/AvatarHandler.cs +++ b/Samples~/AvatarCreatorSamples/AvatarCreatorElements/Scripts/AvatarHandler.cs @@ -1,4 +1,7 @@ using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; using ReadyPlayerMe.AvatarCreator; @@ -35,7 +38,18 @@ public async Task LoadAvatar(string avatarId) public async Task SelectAsset(IAssetData assetData) { OnAvatarLoading?.Invoke(); - var newAvatar = await avatarManager.UpdateAsset(assetData.AssetType, assetData.Id); + GameObject newAvatar; + if(assetData.AssetType == AssetType.Headwear && ActiveAvatarProperties.Assets.ContainsKey(AssetType.HairStyle)) + { + var assets = new Dictionary(); + assets.Add(AssetType.HairStyle, ActiveAvatarProperties.Assets[AssetType.HairStyle]); + assets.Add(AssetType.Headwear, assetData.Id); + newAvatar = await avatarManager.UpdateAssets(assets); + } + else + { + newAvatar = await avatarManager.UpdateAsset(assetData.AssetType, assetData.Id); + } SetupLoadedAvatar(newAvatar, ActiveAvatarProperties); } diff --git a/Samples~/AvatarCreatorSamples/AvatarCreatorWizard/Scripts/Utils/AssetTypeHelper.cs.meta b/Samples~/AvatarCreatorSamples/AvatarCreatorWizard/Scripts/Utils/AssetTypeHelper.cs.meta new file mode 100644 index 00000000..2200ab84 --- /dev/null +++ b/Samples~/AvatarCreatorSamples/AvatarCreatorWizard/Scripts/Utils/AssetTypeHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6db2b85ffc40417478f7b3a97b15401e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: