From c3f27a001cb55335556aa6de7c8aeac3fc9158cf Mon Sep 17 00:00:00 2001 From: Alejandro Jimenez Date: Tue, 28 Apr 2026 14:40:30 +0200 Subject: [PATCH 01/28] feat(avatar): port facial expression data layer Components (AvatarFaceComponent merging expression/blink/mouth-anim, AvatarMouthInputComponent, LocalPlayerFacialExpressionComponent), SO definitions (AvatarFaceExpressionConfig + Definition), shared mouth input queue, default expressions asset, and Essentials addressable. --- .../AssetGroups/Essentials.asset | 5 +++ .../AvatarShape/AvatarFaceExpressionConfig.cs | 17 ++++++++ .../AvatarFaceExpressionConfig.cs.meta | 2 + .../AvatarFaceExpressionDefinition.cs | 26 +++++++++++ .../AvatarFaceExpressionDefinition.cs.meta | 2 + .../AvatarShape/AvatarMouthInputQueue.cs | 33 ++++++++++++++ .../AvatarShape/AvatarMouthInputQueue.cs.meta | 2 + .../Components/AvatarFaceComponent.cs | 43 +++++++++++++++++++ .../Components/AvatarFaceComponent.cs.meta | 2 + .../Components/AvatarMouthInputComponent.cs | 21 +++++++++ .../AvatarMouthInputComponent.cs.meta | 2 + .../LocalPlayerFacialExpressionComponent.cs | 14 ++++++ ...calPlayerFacialExpressionComponent.cs.meta | 2 + .../Global/AvatarFaceExpressionConfig.asset | 43 +++++++++++++++++++ .../AvatarFaceExpressionConfig.asset.meta | 8 ++++ 15 files changed, 222 insertions(+) create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionConfig.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionConfig.cs.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionDefinition.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionDefinition.cs.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarMouthInputQueue.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarMouthInputQueue.cs.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/AvatarFaceComponent.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/AvatarFaceComponent.cs.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/AvatarMouthInputComponent.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/AvatarMouthInputComponent.cs.meta create mode 100644 Explorer/Assets/DCL/Multiplayer/Movement/Components/LocalPlayerFacialExpressionComponent.cs create mode 100644 Explorer/Assets/DCL/Multiplayer/Movement/Components/LocalPlayerFacialExpressionComponent.cs.meta create mode 100644 Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceExpressionConfig.asset create mode 100644 Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceExpressionConfig.asset.meta diff --git a/Explorer/Assets/AddressableAssetsData/AssetGroups/Essentials.asset b/Explorer/Assets/AddressableAssetsData/AssetGroups/Essentials.asset index fb1f7d0958d..1aa03aa942a 100644 --- a/Explorer/Assets/AddressableAssetsData/AssetGroups/Essentials.asset +++ b/Explorer/Assets/AddressableAssetsData/AssetGroups/Essentials.asset @@ -355,6 +355,11 @@ MonoBehaviour: m_ReadOnly: 0 m_SerializedLabels: [] FlaggedDuringContentUpdateRestriction: 0 + - m_GUID: f13fd0befee6d48479806b957b3ca94f + m_Address: Assets/DCL/PluginSystem/Global/AvatarFaceExpressionConfig.asset + m_ReadOnly: 0 + m_SerializedLabels: [] + FlaggedDuringContentUpdateRestriction: 0 - m_GUID: f3fd7329d073f964aaec82eb9acc9ed3 m_Address: DefaultBlack_512_BC7.DDS m_ReadOnly: 0 diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionConfig.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionConfig.cs new file mode 100644 index 00000000000..6590cfbce93 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionConfig.cs @@ -0,0 +1,17 @@ +using System; +using UnityEngine; + +namespace DCL.AvatarRendering.AvatarShape +{ + /// + /// ScriptableObject holding all named face expressions available to avatars. + /// Configure via Assets > Create > DCL > Avatar > Face Expression Config. + /// Expressions are the base layer of the face, underneath blink and mouth-pose animations + /// which temporarily override eyes and mouth respectively. + /// + [CreateAssetMenu(fileName = "AvatarFaceExpressionConfig", menuName = "DCL/Avatar/Face Expression Config")] + public class AvatarFaceExpressionConfig : ScriptableObject + { + public AvatarFaceExpressionDefinition[] Expressions = Array.Empty(); + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionConfig.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionConfig.cs.meta new file mode 100644 index 00000000000..3ea032e9960 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionConfig.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3fc70577efb0ebd4fb2f7ed9436f8213 \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionDefinition.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionDefinition.cs new file mode 100644 index 00000000000..2473acafa25 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionDefinition.cs @@ -0,0 +1,26 @@ +using System; +using UnityEngine; + +namespace DCL.AvatarRendering.AvatarShape +{ + /// + /// A named face pose combining specific atlas slice indices for eyebrows, eyes, and mouth. + /// Eyebrows atlas: 0 Idle, 1 Up, 2 Down, 3 Angry, 4 Sad, 5 Surprised, 6-15 Unused. + /// Eyes atlas: 0 Idle, 1 HalfClosed, 2 Closed, 3 WideOpen, 4-7 Look directions, 8-15 Unused. + /// Mouth atlas: 0-11 Mouth poses, 12 Sad, 13 Happy, 14 Smile, 15 Worried. + /// + [Serializable] + public struct AvatarFaceExpressionDefinition + { + public string Name; + + [Range(0, 15)] + public int EyebrowsIndex; + + [Range(0, 15)] + public int EyesIndex; + + [Range(0, 15)] + public int MouthIndex; + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionDefinition.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionDefinition.cs.meta new file mode 100644 index 00000000000..62445162a80 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionDefinition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 22d16ab00265faa4c860c5aa05735669 \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarMouthInputQueue.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarMouthInputQueue.cs new file mode 100644 index 00000000000..d5da3f27233 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarMouthInputQueue.cs @@ -0,0 +1,33 @@ +using Arch.Core; +using System.Collections.Generic; + +namespace DCL.AvatarRendering.AvatarShape +{ + /// + /// Buffer for mouth-animation inputs originating outside the ECS update loop + /// (voice-chat speakers, chat messages). External services enqueue here; the avatar + /// facial expression system drains and applies the entries each frame. + /// + public sealed class AvatarMouthInputQueue + { + private readonly List<(Entity entity, bool isSpeaking)> pendingSpeaking = new(); + private readonly List<(Entity entity, string message)> pendingMessages = new(); + + public void EnqueueSpeaking(Entity entity, bool isSpeaking) => + pendingSpeaking.Add((entity, isSpeaking)); + + public void EnqueueMessage(Entity entity, string message) => + pendingMessages.Add((entity, message)); + + public void DrainTo( + List<(Entity entity, bool isSpeaking)> speakingOut, + List<(Entity entity, string message)> messagesOut) + { + speakingOut.AddRange(pendingSpeaking); + pendingSpeaking.Clear(); + + messagesOut.AddRange(pendingMessages); + pendingMessages.Clear(); + } + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarMouthInputQueue.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarMouthInputQueue.cs.meta new file mode 100644 index 00000000000..22fc9af3298 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarMouthInputQueue.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: eb0994950fa7d594cac8baa8f0f0aeb9 \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/AvatarFaceComponent.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/AvatarFaceComponent.cs new file mode 100644 index 00000000000..4ffc6c62fa4 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/AvatarFaceComponent.cs @@ -0,0 +1,43 @@ +using UnityEngine; + +namespace DCL.AvatarRendering.AvatarShape.Components +{ + /// + /// Per-avatar facial animation state. One component holds all three layers because they are + /// always added/removed together and the pipeline reads them together each frame: + /// base expression → blink overrides eyes → chat/voice overrides mouth → pause restores + /// mouth to (not idle). + /// + public struct AvatarFaceComponent + { + // Renderers — null while setup is pending or after avatar re-instantiation. + public Renderer EyebrowsRenderer; + public Renderer EyeRenderer; + public Renderer MouthRenderer; + + // Base expression (resting layer). Eyes/mouth are restored to these when blink / mouth animation ends. + public int EyebrowsExpressionIndex; + public int EyesExpressionIndex; + public int MouthExpressionIndex; + + // Currently applied MaterialPropertyBlock slice indices. -1 means no override (material default). + public int CurrentEyebrowsIndex; + public int CurrentEyeIndex; + public int CurrentMouthPoseIndex; + + // Blink state. + public bool IsBlinking; + public float TimeSinceLastBlink; + public float NextBlinkTime; + public int BlinkFrameIndex; + public float BlinkFrameTimer; + + // Mouth-pose animation state. AnimatingText is null when idle. + public string? AnimatingText; + public int CharacterIndex; + public float CharacterTimer; + + /// True when expression indices changed and need to be pushed to renderers this frame. + public bool IsDirty; + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/AvatarFaceComponent.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/AvatarFaceComponent.cs.meta new file mode 100644 index 00000000000..2ae4fd305f4 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/AvatarFaceComponent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 136cbc65d4cd923489a70626f8a022b3 \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/AvatarMouthInputComponent.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/AvatarMouthInputComponent.cs new file mode 100644 index 00000000000..afe1450decb --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/AvatarMouthInputComponent.cs @@ -0,0 +1,21 @@ +namespace DCL.AvatarRendering.AvatarShape.Components +{ + /// + /// Bridge component written by external services (chat + voice chat) to drive mouth animation. + /// AvatarFacialExpressionSystem reads and clears it each frame. + /// + /// Two independent writers update different fields, so writers must use a partial-update + /// pattern (Has + Get or Add) instead of AddOrSet to avoid clobbering each other. + /// + /// + /// / — set by chat service when a message arrives. + /// — set by voice handler when speaking state changes. + /// + /// + public struct AvatarMouthInputComponent + { + public string? PendingMessage; + public bool MessageIsDirty; + public bool IsVoiceChatSpeaking; + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/AvatarMouthInputComponent.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/AvatarMouthInputComponent.cs.meta new file mode 100644 index 00000000000..b61498b43be --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/AvatarMouthInputComponent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 68754f419783b9a4a8c72cda3bc21f51 \ No newline at end of file diff --git a/Explorer/Assets/DCL/Multiplayer/Movement/Components/LocalPlayerFacialExpressionComponent.cs b/Explorer/Assets/DCL/Multiplayer/Movement/Components/LocalPlayerFacialExpressionComponent.cs new file mode 100644 index 00000000000..94071dc62f1 --- /dev/null +++ b/Explorer/Assets/DCL/Multiplayer/Movement/Components/LocalPlayerFacialExpressionComponent.cs @@ -0,0 +1,14 @@ +namespace DCL.Multiplayer.Movement +{ + /// + /// Mirrors the local player's current facial expression indices so + /// can include them in every movement + /// packet without taking a dependency on the AvatarShape assembly. + /// + public struct LocalPlayerFacialExpressionComponent + { + public byte EyebrowsIndex; + public byte EyesIndex; + public byte MouthIndex; + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/Multiplayer/Movement/Components/LocalPlayerFacialExpressionComponent.cs.meta b/Explorer/Assets/DCL/Multiplayer/Movement/Components/LocalPlayerFacialExpressionComponent.cs.meta new file mode 100644 index 00000000000..102874bc9a0 --- /dev/null +++ b/Explorer/Assets/DCL/Multiplayer/Movement/Components/LocalPlayerFacialExpressionComponent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6335e8704a94db740818167b513e1d63 \ No newline at end of file diff --git a/Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceExpressionConfig.asset b/Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceExpressionConfig.asset new file mode 100644 index 00000000000..87dfa6f0322 --- /dev/null +++ b/Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceExpressionConfig.asset @@ -0,0 +1,43 @@ +%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: 3fc70577efb0ebd4fb2f7ed9436f8213, type: 3} + m_Name: AvatarFaceExpressionConfig + m_EditorClassIdentifier: AvatarShape::DCL.AvatarRendering.AvatarShape.AvatarFaceExpressionConfig + Expressions: + - Name: Idle + EyebrowsIndex: 0 + EyesIndex: 0 + MouthIndex: 0 + - Name: Happy + EyebrowsIndex: 1 + EyesIndex: 0 + MouthIndex: 13 + - Name: Suspicius Left + EyebrowsIndex: 4 + EyesIndex: 7 + MouthIndex: 15 + - Name: Suspicius Right + EyebrowsIndex: 5 + EyesIndex: 6 + MouthIndex: 15 + - Name: Surprised + EyebrowsIndex: 1 + EyesIndex: 3 + MouthIndex: 7 + - Name: Stoned + EyebrowsIndex: 3 + EyesIndex: 1 + MouthIndex: 3 + - Name: Surprised + EyebrowsIndex: 3 + EyesIndex: 3 + MouthIndex: 11 diff --git a/Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceExpressionConfig.asset.meta b/Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceExpressionConfig.asset.meta new file mode 100644 index 00000000000..68ce355cfbb --- /dev/null +++ b/Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceExpressionConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f13fd0befee6d48479806b957b3ca94f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: From a04ddb683026839bd9adcbf57178e7429ff4898b Mon Sep 17 00:00:00 2001 From: Alejandro Jimenez Date: Tue, 28 Apr 2026 15:46:54 +0200 Subject: [PATCH 02/28] feat(avatar): port AvatarFacialExpressionSystem (lean orchestrator) Adds the central face animation system delegating material binding to AvatarFaceMaterialUtils and atlas/pose data to AvatarFacialExpressionConstants. Designer-tunable timings live in AvatarFaceAnimationSettings (SO). Drops AvatarMouthInputQueue: chat/voice handlers will write directly to AvatarMouthInputComponent (added alongside AvatarFaceComponent in setup). --- .../Assets/AvatarFaceAnimationSettings.cs | 17 ++ .../AvatarFaceAnimationSettings.cs.meta | 2 + .../AvatarShape/AvatarFaceMaterialUtils.cs | 117 ++++++++ .../AvatarFaceMaterialUtils.cs.meta | 2 + .../AvatarFacialExpressionConstants.cs | 80 ++++++ .../AvatarFacialExpressionConstants.cs.meta | 2 + .../AvatarShape/AvatarMouthInputQueue.cs | 33 --- .../AvatarShape/AvatarMouthInputQueue.cs.meta | 2 - .../Systems/AvatarFacialExpressionSystem.cs | 258 ++++++++++++++++++ .../AvatarFacialExpressionSystem.cs.meta | 2 + 10 files changed, 480 insertions(+), 35 deletions(-) create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Assets/AvatarFaceAnimationSettings.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Assets/AvatarFaceAnimationSettings.cs.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceMaterialUtils.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceMaterialUtils.cs.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFacialExpressionConstants.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFacialExpressionConstants.cs.meta delete mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarMouthInputQueue.cs delete mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarMouthInputQueue.cs.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/AvatarFacialExpressionSystem.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/AvatarFacialExpressionSystem.cs.meta diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Assets/AvatarFaceAnimationSettings.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Assets/AvatarFaceAnimationSettings.cs new file mode 100644 index 00000000000..e7dc3825b82 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Assets/AvatarFaceAnimationSettings.cs @@ -0,0 +1,17 @@ +using UnityEngine; + +namespace DCL.AvatarRendering.AvatarShape.Assets +{ + [CreateAssetMenu(fileName = "AvatarFaceAnimationSettings", menuName = "DCL/Avatar/Face Animation Settings")] + public class AvatarFaceAnimationSettings : ScriptableObject + { + [field: Header("Blink")] + [field: SerializeField] public float MinBlinkInterval { get; private set; } = 2.0f; + [field: SerializeField] public float MaxBlinkInterval { get; private set; } = 8.0f; + [field: SerializeField] public float BlinkFrameDuration { get; private set; } = 0.05f; + + [field: Header("Mouth Pose")] + [field: SerializeField] public float MouthPoseDuration { get; private set; } = 0.08f; + [field: SerializeField] public float VowelMouthPoseDuration { get; private set; } = 0.12f; + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Assets/AvatarFaceAnimationSettings.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Assets/AvatarFaceAnimationSettings.cs.meta new file mode 100644 index 00000000000..7545cfa5555 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Assets/AvatarFaceAnimationSettings.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3fa44f695c71c9d44a49c7ddfbf82738 \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceMaterialUtils.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceMaterialUtils.cs new file mode 100644 index 00000000000..34554adbe6e --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceMaterialUtils.cs @@ -0,0 +1,117 @@ +using DCL.AvatarRendering.AvatarShape.Components; +using DCL.AvatarRendering.AvatarShape.Rendering.TextureArray; +using DCL.AvatarRendering.Loading.Assets; +using UnityEngine; + +namespace DCL.AvatarRendering.AvatarShape +{ + /// + /// Material/MaterialPropertyBlock side-effects for face animation. The avatar facial + /// expression system delegates all texture array binding here so it stays focused + /// on state transitions. + /// + public static class AvatarFaceMaterialUtils + { + private static readonly MaterialPropertyBlock MPB = new (); + + public static void ApplyEyebrowsFrame(ref AvatarFaceComponent face, int eyebrowsIndex, Texture2DArray? eyebrowsTextureArray) + { + if (face.EyebrowsRenderer == null || eyebrowsTextureArray == null) return; + if (face.CurrentEyebrowsIndex == eyebrowsIndex) return; + + face.CurrentEyebrowsIndex = eyebrowsIndex; + + MPB.Clear(); + MPB.SetTexture(TextureArrayConstants.MAINTEX_ARR_TEX_SHADER, eyebrowsTextureArray); + MPB.SetInteger(TextureArrayConstants.MAINTEX_ARR_SHADER_INDEX, eyebrowsIndex); + face.EyebrowsRenderer.SetPropertyBlock(MPB); + } + + public static void ApplyEyeFrame(ref AvatarFaceComponent face, int eyeIndex, Texture2DArray? eyeTextureArray) + { + if (face.EyeRenderer == null) return; + if (face.CurrentEyeIndex == eyeIndex) return; + + face.CurrentEyeIndex = eyeIndex; + + if (eyeIndex == AvatarFacialExpressionConstants.NO_EYE_OVERRIDE) + { + face.EyeRenderer.SetPropertyBlock(null); + return; + } + + if (eyeTextureArray == null) return; + + MPB.Clear(); + MPB.SetTexture(TextureArrayConstants.MAINTEX_ARR_TEX_SHADER, eyeTextureArray); + MPB.SetInteger(TextureArrayConstants.MAINTEX_ARR_SHADER_INDEX, eyeIndex); + face.EyeRenderer.SetPropertyBlock(MPB); + } + + public static void ApplyMouthPose(ref AvatarFaceComponent face, int mouthPoseIndex, Texture2DArray? mouthPoseTextureArray) + { + if (face.MouthRenderer == null) return; + if (face.CurrentMouthPoseIndex == mouthPoseIndex) return; + + face.CurrentMouthPoseIndex = mouthPoseIndex; + + if (mouthPoseIndex == AvatarFacialExpressionConstants.NO_MOUTH_POSE) + { + face.MouthRenderer.SetPropertyBlock(null); + return; + } + + if (mouthPoseTextureArray == null) return; + + MPB.Clear(); + MPB.SetTexture(TextureArrayConstants.MAINTEX_ARR_TEX_SHADER, mouthPoseTextureArray); + MPB.SetInteger(TextureArrayConstants.MAINTEX_ARR_SHADER_INDEX, mouthPoseIndex); + face.MouthRenderer.SetPropertyBlock(MPB); + } + + public static void StartBlink(ref AvatarFaceComponent face, Texture2DArray? eyeTextureArray) + { + face.IsBlinking = true; + face.BlinkFrameIndex = 0; + face.BlinkFrameTimer = 0f; + ApplyEyeFrame(ref face, AvatarFacialExpressionConstants.BLINK_SEQUENCE[0], eyeTextureArray); + } + + public static void EndBlink(ref AvatarFaceComponent face, Texture2DArray? eyeTextureArray, float minBlinkInterval, float maxBlinkInterval) + { + face.IsBlinking = false; + face.TimeSinceLastBlink = 0f; + face.NextBlinkTime = Random.Range(minBlinkInterval, maxBlinkInterval); + ApplyEyeFrame(ref face, face.EyesExpressionIndex, eyeTextureArray); + } + + public static void StopMouthAnimation(ref AvatarFaceComponent face, Texture2DArray? mouthPoseTextureArray) + { + face.AnimatingText = null; + ApplyMouthPose(ref face, face.MouthExpressionIndex, mouthPoseTextureArray); + } + + /// + /// Searches the avatar's instantiated wearables for the first renderer whose name ends + /// with . Returns null when none of the wearables expose one + /// (e.g. wearable lacks a Mask_* mesh). + /// + public static Renderer? FindRendererWithSuffix(in AvatarShapeComponent avatarShape, string suffix) + { + for (var i = 0; i < avatarShape.InstantiatedWearables.Count; i++) + { + CachedAttachment wearable = avatarShape.InstantiatedWearables[i]; + + for (var j = 0; j < wearable.Renderers.Count; j++) + { + Renderer renderer = wearable.Renderers[j]; + + if (renderer.name.EndsWith(suffix)) + return renderer; + } + } + + return null; + } + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceMaterialUtils.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceMaterialUtils.cs.meta new file mode 100644 index 00000000000..dfa343d23d8 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceMaterialUtils.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8d9334e9f4aad364ebab5fde98cacc37 \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFacialExpressionConstants.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFacialExpressionConstants.cs new file mode 100644 index 00000000000..68fce9e8e05 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFacialExpressionConstants.cs @@ -0,0 +1,80 @@ +namespace DCL.AvatarRendering.AvatarShape +{ + /// + /// Atlas slice indices, mouth-pose mapping, and pause-character classification used by + /// the avatar facial expression pipeline. + /// + /// + /// Atlases are 1024×1024, 4×4 grid of 256px cells (top-to-bottom, left-to-right). + /// + /// Eyebrows: 0 Idle, 1 Up, 2 Down, 3 Angry, 4 Sad, 5 Surprised, 6-15 Unused. + /// Eyes: 0 Idle, 1 HalfClosed, 2 Closed, 3 WideOpen, 4-7 Look*, 8-15 Unused. + /// Mouth: 0 Idle, 1 a/e/i, 2 b/m/p, 3 f/v, 4 d/th, 5 u, 6 c/g/h/k/n/s/t/x/y/z, + /// 7 o, 8 l, 9 r, 10 ch/j/sh, 11 w/q, 12 Sad, 13 Happy, 14 Smile, 15 Worried. + /// + public static class AvatarFacialExpressionConstants + { + public const int NO_EYEBROWS_OVERRIDE = -1; + public const int NO_EYE_OVERRIDE = -1; + public const int NO_MOUTH_POSE = -1; + + public const int EYE_HALF_CLOSED = 1; + public const int EYE_CLOSED = 2; + + public const float UPPERCASE_DURATION_MULTIPLIER = 2f; + + /// Mouth-pose-rich text looped while an avatar is actively speaking in voice chat. + public const string VOICE_CHAT_LOOP_TEXT = "el murcielago hindu comia feliz cardillo y kiwi"; + + /// One blink: HalfClosed → Closed → HalfClosed → restore expression. + public static readonly int[] BLINK_SEQUENCE = { EYE_HALF_CLOSED, EYE_CLOSED, EYE_HALF_CLOSED }; + + public static bool IsVowel(char c) + { + c = char.ToLowerInvariant(c); + return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'; + } + + /// + /// Pause characters hold the expression mouth (not idle) instead of an articulated pose. + /// + public static bool IsPauseChar(char c) => + c == ',' || c == '.' || c == ';' || c == ':' || c == '!' || c == '?' || c == ' ' || c == '\n'; + + /// + /// Maps a character at to a mouth pose slice. Digraphs + /// (th, ch, sh) detected by peeking. Pause chars and any unmapped char return + /// so the caller falls back to the expression mouth. + /// + public static int MapCharToMouthPose(string text, int index) + { + char c = char.ToLowerInvariant(text[index]); + + if (IsPauseChar(c)) + return NO_MOUTH_POSE; + + char next = index + 1 < text.Length ? char.ToLowerInvariant(text[index + 1]) : '\0'; + + switch (c) + { + case 'a': case 'e': case 'i': return 1; + case 'b': case 'm': case 'p': return 2; + case 'f': case 'v': return 3; + case 't': return next == 'h' ? 4 : 6; + case 'u': return 5; + case 'd': return 4; + case 'g': case 'h': + case 'k': case 'n': case 'x': + case 'y': case 'z': return 6; + case 'c': return next == 'h' ? 10 : 6; + case 's': return next == 'h' ? 10 : 6; + case 'o': return 7; + case 'l': return 8; + case 'r': return 9; + case 'j': return 10; + case 'w': case 'q': return 11; + default: return NO_MOUTH_POSE; + } + } + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFacialExpressionConstants.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFacialExpressionConstants.cs.meta new file mode 100644 index 00000000000..e4a9918d375 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFacialExpressionConstants.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 897324802def3d34b85dc05e3019c32c \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarMouthInputQueue.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarMouthInputQueue.cs deleted file mode 100644 index d5da3f27233..00000000000 --- a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarMouthInputQueue.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Arch.Core; -using System.Collections.Generic; - -namespace DCL.AvatarRendering.AvatarShape -{ - /// - /// Buffer for mouth-animation inputs originating outside the ECS update loop - /// (voice-chat speakers, chat messages). External services enqueue here; the avatar - /// facial expression system drains and applies the entries each frame. - /// - public sealed class AvatarMouthInputQueue - { - private readonly List<(Entity entity, bool isSpeaking)> pendingSpeaking = new(); - private readonly List<(Entity entity, string message)> pendingMessages = new(); - - public void EnqueueSpeaking(Entity entity, bool isSpeaking) => - pendingSpeaking.Add((entity, isSpeaking)); - - public void EnqueueMessage(Entity entity, string message) => - pendingMessages.Add((entity, message)); - - public void DrainTo( - List<(Entity entity, bool isSpeaking)> speakingOut, - List<(Entity entity, string message)> messagesOut) - { - speakingOut.AddRange(pendingSpeaking); - pendingSpeaking.Clear(); - - messagesOut.AddRange(pendingMessages); - pendingMessages.Clear(); - } - } -} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarMouthInputQueue.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarMouthInputQueue.cs.meta deleted file mode 100644 index 22fc9af3298..00000000000 --- a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarMouthInputQueue.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: eb0994950fa7d594cac8baa8f0f0aeb9 \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/AvatarFacialExpressionSystem.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/AvatarFacialExpressionSystem.cs new file mode 100644 index 00000000000..cca59cc9406 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/AvatarFacialExpressionSystem.cs @@ -0,0 +1,258 @@ +using Arch.Core; +using Arch.System; +using Arch.SystemGroups; +using DCL.AvatarRendering.AvatarShape.Assets; +using DCL.AvatarRendering.AvatarShape.Components; +using ECS.Abstract; +using ECS.LifeCycle.Components; +using UnityEngine; + +namespace DCL.AvatarRendering.AvatarShape +{ + /// + /// Drives 2D facial animation for instantiated avatars: eyebrow expression (base layer), + /// blink (overrides eyes temporarily), and mouth pose (overrides mouth temporarily). + /// Pause characters in animated text restore the expression mouth instead of an articulated pose. + /// Material binding is delegated to and + /// all atlas / pose constants live in . + /// + [UpdateInGroup(typeof(AvatarGroup))] + [UpdateAfter(typeof(AvatarInstantiatorSystem))] + public partial class AvatarFacialExpressionSystem : BaseUnityLoopSystem + { + private readonly AvatarFaceAnimationSettings settings; + private readonly Texture2DArray? eyebrowsTextureArray; + private readonly Texture2DArray? eyeTextureArray; + private readonly Texture2DArray? mouthPoseTextureArray; + + internal AvatarFacialExpressionSystem( + World world, + AvatarFaceAnimationSettings settings, + Texture2DArray? eyebrowsTextureArray, + Texture2DArray? eyeTextureArray, + Texture2DArray? mouthPoseTextureArray) : base(world) + { + this.settings = settings; + this.eyebrowsTextureArray = eyebrowsTextureArray; + this.eyeTextureArray = eyeTextureArray; + this.mouthPoseTextureArray = mouthPoseTextureArray; + } + + protected override void Update(float t) + { + SetupFaceComponentsQuery(World); + UpdateFaceQuery(World, t); + } + + // ─── Setup ──────────────────────────────────────────────────────────── + + /// + /// Adds + together + /// so external services (chat / voice) can write inputs without checking the face + /// component is present, and so the per-frame query can require both. + /// + [Query] + [All(typeof(AvatarCustomSkinningComponent))] + [None(typeof(AvatarFaceComponent), typeof(DeleteEntityIntention))] + private void SetupFaceComponents(in Entity entity, ref AvatarShapeComponent avatarShape) + { + World.Add(entity, + new AvatarFaceComponent + { + EyebrowsRenderer = AvatarFaceMaterialUtils.FindRendererWithSuffix(in avatarShape, "Mask_Eyebrows"), + EyeRenderer = AvatarFaceMaterialUtils.FindRendererWithSuffix(in avatarShape, "Mask_Eyes"), + MouthRenderer = AvatarFaceMaterialUtils.FindRendererWithSuffix(in avatarShape, "Mask_Mouth"), + EyebrowsExpressionIndex = 0, + EyesExpressionIndex = AvatarFacialExpressionConstants.NO_EYE_OVERRIDE, + MouthExpressionIndex = AvatarFacialExpressionConstants.NO_MOUTH_POSE, + CurrentEyebrowsIndex = AvatarFacialExpressionConstants.NO_EYEBROWS_OVERRIDE, + CurrentEyeIndex = AvatarFacialExpressionConstants.NO_EYE_OVERRIDE, + CurrentMouthPoseIndex = AvatarFacialExpressionConstants.NO_MOUTH_POSE, + NextBlinkTime = Random.Range(settings.MinBlinkInterval, settings.MaxBlinkInterval), + }, + new AvatarMouthInputComponent()); + } + + // ─── Per-frame update ───────────────────────────────────────────────── + + [Query] + [None(typeof(DeleteEntityIntention))] + private void UpdateFace( + [Data] float t, + ref AvatarFaceComponent face, + ref AvatarMouthInputComponent mouthInput, + ref AvatarShapeComponent avatarShape) + { + ReInitRenderersIfNeeded(ref face, in avatarShape); + + if (face.IsDirty) + ApplyExpressionLayer(ref face); + + bool visible = avatarShape.IsVisible; + + if (face.EyeRenderer != null) + StepBlink(t, ref face, visible); + + if (face.MouthRenderer != null) + StepMouthAnimation(t, ref face, ref mouthInput, visible); + } + + private void ReInitRenderersIfNeeded(ref AvatarFaceComponent face, in AvatarShapeComponent avatarShape) + { + if (face.EyebrowsRenderer == null) + { + Renderer? r = AvatarFaceMaterialUtils.FindRendererWithSuffix(in avatarShape, "Mask_Eyebrows"); + + if (r != null) + { + face.EyebrowsRenderer = r; + face.CurrentEyebrowsIndex = AvatarFacialExpressionConstants.NO_EYEBROWS_OVERRIDE; + face.IsDirty = true; + } + } + + if (face.EyeRenderer == null) + { + Renderer? r = AvatarFaceMaterialUtils.FindRendererWithSuffix(in avatarShape, "Mask_Eyes"); + + if (r != null) + { + face.EyeRenderer = r; + face.IsBlinking = false; + face.BlinkFrameIndex = 0; + face.BlinkFrameTimer = 0f; + face.TimeSinceLastBlink = 0f; + face.CurrentEyeIndex = AvatarFacialExpressionConstants.NO_EYE_OVERRIDE; + face.NextBlinkTime = Random.Range(settings.MinBlinkInterval, settings.MaxBlinkInterval); + } + } + + if (face.MouthRenderer == null) + { + Renderer? r = AvatarFaceMaterialUtils.FindRendererWithSuffix(in avatarShape, "Mask_Mouth"); + + if (r != null) + { + face.MouthRenderer = r; + face.AnimatingText = null; + face.CharacterIndex = 0; + face.CharacterTimer = 0f; + face.CurrentMouthPoseIndex = AvatarFacialExpressionConstants.NO_MOUTH_POSE; + } + } + } + + /// + /// Pushes the expression layer to renderers. Eyebrows always apply; eyes/mouth apply + /// only when no override layer is currently animating — the override layer will + /// restore to the new resting indices when it ends. + /// + private void ApplyExpressionLayer(ref AvatarFaceComponent face) + { + face.IsDirty = false; + + AvatarFaceMaterialUtils.ApplyEyebrowsFrame(ref face, face.EyebrowsExpressionIndex, eyebrowsTextureArray); + + if (!face.IsBlinking) + AvatarFaceMaterialUtils.ApplyEyeFrame(ref face, face.EyesExpressionIndex, eyeTextureArray); + + if (face.AnimatingText == null) + AvatarFaceMaterialUtils.ApplyMouthPose(ref face, face.MouthExpressionIndex, mouthPoseTextureArray); + } + + // ─── Blink layer ────────────────────────────────────────────────────── + + private void StepBlink(float t, ref AvatarFaceComponent face, bool isVisible) + { + if (!isVisible || !face.EyeRenderer.enabled) + { + if (face.IsBlinking) + AvatarFaceMaterialUtils.EndBlink(ref face, eyeTextureArray, settings.MinBlinkInterval, settings.MaxBlinkInterval); + + return; + } + + if (face.IsBlinking) + { + face.BlinkFrameTimer += t; + + if (face.BlinkFrameTimer < settings.BlinkFrameDuration) return; + + face.BlinkFrameTimer = 0f; + face.BlinkFrameIndex++; + + if (face.BlinkFrameIndex >= AvatarFacialExpressionConstants.BLINK_SEQUENCE.Length) + AvatarFaceMaterialUtils.EndBlink(ref face, eyeTextureArray, settings.MinBlinkInterval, settings.MaxBlinkInterval); + else + AvatarFaceMaterialUtils.ApplyEyeFrame(ref face, AvatarFacialExpressionConstants.BLINK_SEQUENCE[face.BlinkFrameIndex], eyeTextureArray); + } + else + { + face.TimeSinceLastBlink += t; + + if (face.TimeSinceLastBlink >= face.NextBlinkTime) + AvatarFaceMaterialUtils.StartBlink(ref face, eyeTextureArray); + } + } + + // ─── Mouth animation layer ──────────────────────────────────────────── + + private void StepMouthAnimation(float t, ref AvatarFaceComponent face, ref AvatarMouthInputComponent input, bool isVisible) + { + if (!isVisible || !face.MouthRenderer.enabled) + { + AvatarFaceMaterialUtils.StopMouthAnimation(ref face, mouthPoseTextureArray); + return; + } + + // Chat message overrides the voice-chat loop; consume it. + if (input.MessageIsDirty) + { + face.AnimatingText = input.PendingMessage; + face.CharacterIndex = 0; + face.CharacterTimer = 0f; + input.MessageIsDirty = false; + } + + bool isSpeaking = input.IsVoiceChatSpeaking; + + if (face.AnimatingText != null && face.CharacterIndex < face.AnimatingText.Length) + { + // Stop the voice loop if speaking ended mid-animation. + if (!isSpeaking && face.AnimatingText == AvatarFacialExpressionConstants.VOICE_CHAT_LOOP_TEXT) + { + AvatarFaceMaterialUtils.StopMouthAnimation(ref face, mouthPoseTextureArray); + return; + } + + int mouthPose = AvatarFacialExpressionConstants.MapCharToMouthPose(face.AnimatingText, face.CharacterIndex); + AvatarFaceMaterialUtils.ApplyMouthPose( + ref face, + mouthPose == AvatarFacialExpressionConstants.NO_MOUTH_POSE ? face.MouthExpressionIndex : mouthPose, + mouthPoseTextureArray); + + face.CharacterTimer += t; + + char currentChar = face.AnimatingText[face.CharacterIndex]; + float baseDuration = AvatarFacialExpressionConstants.IsVowel(currentChar) ? settings.VowelMouthPoseDuration : settings.MouthPoseDuration; + float duration = char.IsUpper(currentChar) ? baseDuration * AvatarFacialExpressionConstants.UPPERCASE_DURATION_MULTIPLIER : baseDuration; + + if (face.CharacterTimer >= duration) + { + face.CharacterTimer = 0f; + face.CharacterIndex++; + } + } + else if (isSpeaking) + { + face.AnimatingText = AvatarFacialExpressionConstants.VOICE_CHAT_LOOP_TEXT; + face.CharacterIndex = 0; + face.CharacterTimer = 0f; + } + else + { + AvatarFaceMaterialUtils.StopMouthAnimation(ref face, mouthPoseTextureArray); + } + } + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/AvatarFacialExpressionSystem.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/AvatarFacialExpressionSystem.cs.meta new file mode 100644 index 00000000000..0eac688e196 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/AvatarFacialExpressionSystem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f6950c2e6be708d47a0ab6069f08f507 \ No newline at end of file From 7dea39dbbcbb4454a618dbfc43798322c1dcbae6 Mon Sep 17 00:00:00 2001 From: Alejandro Jimenez Date: Tue, 5 May 2026 11:40:51 +0200 Subject: [PATCH 03/28] feat(protocol): regen Comms with FacialExpression message Adds rfc4 FacialExpression message (eyebrows/eyes/mouth tile indices, ADR-317) and wires MessagePipe payload extraction for the new oneof case. Source proto change lives on protocol branch feat/facial-expressions. --- .../AvatarFacialExpressionSystem.cs | 0 .../AvatarFacialExpressionSystem.cs.meta | 0 .../Connections/Messaging/Pipe/MessagePipe.cs | 1 + .../DecentralandProtocol/Comms.gen.cs | 438 +++++++++++++++--- 4 files changed, 384 insertions(+), 55 deletions(-) rename Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/{ => FacialExpression}/AvatarFacialExpressionSystem.cs (100%) rename Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/{ => FacialExpression}/AvatarFacialExpressionSystem.cs.meta (100%) diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/AvatarFacialExpressionSystem.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/AvatarFacialExpressionSystem.cs similarity index 100% rename from Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/AvatarFacialExpressionSystem.cs rename to Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/AvatarFacialExpressionSystem.cs diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/AvatarFacialExpressionSystem.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/AvatarFacialExpressionSystem.cs.meta similarity index 100% rename from Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/AvatarFacialExpressionSystem.cs.meta rename to Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/AvatarFacialExpressionSystem.cs.meta diff --git a/Explorer/Assets/DCL/Multiplayer/Connections/Messaging/Pipe/MessagePipe.cs b/Explorer/Assets/DCL/Multiplayer/Connections/Messaging/Pipe/MessagePipe.cs index 5b21b533649..5afad991440 100644 --- a/Explorer/Assets/DCL/Multiplayer/Connections/Messaging/Pipe/MessagePipe.cs +++ b/Explorer/Assets/DCL/Multiplayer/Connections/Messaging/Pipe/MessagePipe.cs @@ -206,6 +206,7 @@ private async UniTaskVoid NotifySubscribersAsync(Packet.MessageOneofCase name, P Packet.MessageOneofCase.SceneEmote => (packet.SceneEmote as T).EnsureNotNull(), Packet.MessageOneofCase.Reaction => (packet.Reaction as T).EnsureNotNull(), Packet.MessageOneofCase.ChatReaction => (packet.ChatReaction as T).EnsureNotNull(), + Packet.MessageOneofCase.FacialExpression => (packet.FacialExpression as T).EnsureNotNull(), Packet.MessageOneofCase.None => null, _ => null, }; diff --git a/Explorer/Assets/Protocol/DecentralandProtocol/Comms.gen.cs b/Explorer/Assets/Protocol/DecentralandProtocol/Comms.gen.cs index 384ea7889bd..53060454bfb 100644 --- a/Explorer/Assets/Protocol/DecentralandProtocol/Comms.gen.cs +++ b/Explorer/Assets/Protocol/DecentralandProtocol/Comms.gen.cs @@ -25,7 +25,7 @@ static CommsReflection() { byte[] descriptorData = global::System.Convert.FromBase64String( string.Concat( "CipkZWNlbnRyYWxhbmQva2VybmVsL2NvbW1zL3JmYzQvY29tbXMucHJvdG8S", - "HmRlY2VudHJhbGFuZC5rZXJuZWwuY29tbXMucmZjNCLmBwoGUGFja2V0EjwK", + "HmRlY2VudHJhbGFuZC5rZXJuZWwuY29tbXMucmZjNCK1CAoGUGFja2V0EjwK", "CHBvc2l0aW9uGAEgASgLMiguZGVjZW50cmFsYW5kLmtlcm5lbC5jb21tcy5y", "ZmM0LlBvc2l0aW9uSAASUQoPcHJvZmlsZV92ZXJzaW9uGAIgASgLMjYuZGVj", "ZW50cmFsYW5kLmtlcm5lbC5jb21tcy5yZmM0LkFubm91bmNlUHJvZmlsZVZl", @@ -47,62 +47,66 @@ static CommsReflection() { "aXRpb25IABI8CghyZWFjdGlvbhgOIAEoCzIoLmRlY2VudHJhbGFuZC5rZXJu", "ZWwuY29tbXMucmZjNC5SZWFjdGlvbkgAEkUKDWNoYXRfcmVhY3Rpb24YDyAB", "KAsyLC5kZWNlbnRyYWxhbmQua2VybmVsLmNvbW1zLnJmYzQuQ2hhdFJlYWN0", - "aW9uSAASGAoQcHJvdG9jb2xfdmVyc2lvbhgLIAEoDUIJCgdtZXNzYWdlIqUB", - "CghQb3NpdGlvbhINCgVpbmRleBgBIAEoDRISCgpwb3NpdGlvbl94GAMgASgC", - "EhIKCnBvc2l0aW9uX3kYBCABKAISEgoKcG9zaXRpb25fehgFIAEoAhISCgpy", - "b3RhdGlvbl94GAYgASgCEhIKCnJvdGF0aW9uX3kYByABKAISEgoKcm90YXRp", - "b25fehgIIAEoAhISCgpyb3RhdGlvbl93GAkgASgCIusFCghNb3ZlbWVudBIR", - "Cgl0aW1lc3RhbXAYASABKAISEgoKcG9zaXRpb25feBgCIAEoAhISCgpwb3Np", - "dGlvbl95GAMgASgCEhIKCnBvc2l0aW9uX3oYBCABKAISEgoKdmVsb2NpdHlf", - "eBgFIAEoAhISCgp2ZWxvY2l0eV95GAYgASgCEhIKCnZlbG9jaXR5X3oYByAB", - "KAISHAoUbW92ZW1lbnRfYmxlbmRfdmFsdWUYCCABKAISGQoRc2xpZGVfYmxl", - "bmRfdmFsdWUYCSABKAISEwoLaXNfZ3JvdW5kZWQYCiABKAgSEgoKaXNfanVt", - "cGluZxgLIAEoCBISCgpqdW1wX2NvdW50GBggASgFEhQKDGlzX2xvbmdfanVt", - "cBgMIAEoCBIUCgxpc19sb25nX2ZhbGwYDSABKAgSEgoKaXNfZmFsbGluZxgO", - "IAEoCBISCgppc19zdHVubmVkGA8gASgIEkgKC2dsaWRlX3N0YXRlGBcgASgO", - "MjMuZGVjZW50cmFsYW5kLmtlcm5lbC5jb21tcy5yZmM0Lk1vdmVtZW50Lkds", - "aWRlU3RhdGUSEgoKcm90YXRpb25feRgQIAEoAhISCgppc19pbnN0YW50GBEg", - "ASgIEhIKCmlzX2Vtb3RpbmcYEiABKAgSGwoTaGVhZF9pa195YXdfZW5hYmxl", - "ZBgTIAEoCBIdChVoZWFkX2lrX3BpdGNoX2VuYWJsZWQYFCABKAgSEAoIaGVh", - "ZF95YXcYFSABKAISEgoKaGVhZF9waXRjaBgWIAEoAhISCgpwb2ludF9hdF94", - "GBkgASgCEhIKCnBvaW50X2F0X3kYGiABKAISEgoKcG9pbnRfYXRfehgbIAEo", - "AhIWCg5pc19wb2ludGluZ19hdBgcIAEoCCJOCgpHbGlkZVN0YXRlEg8KC1BS", - "T1BfQ0xPU0VEEAASEAoMT1BFTklOR19QUk9QEAESCwoHR0xJRElORxACEhAK", - "DENMT1NJTkdfUFJPUBADInEKEk1vdmVtZW50Q29tcHJlc3NlZBIVCg10ZW1w", - "b3JhbF9kYXRhGAEgASgFEhUKDW1vdmVtZW50X2RhdGEYAiABKAMSFgoOaGVh", - "ZF9zeW5jX2RhdGEYAyABKAUSFQoNcG9pbnRfYXRfZGF0YRgEIAEoBSK7AwoL", - "UGxheWVyRW1vdGUSFgoOaW5jcmVtZW50YWxfaWQYASABKA0SCwoDdXJuGAIg", - "ASgJEhEKCXRpbWVzdGFtcBgDIAEoAhIYCgtpc19zdG9wcGluZxgEIAEoCEgA", - "iAEBEhkKDGlzX3JlcGVhdGluZxgFIAEoCEgBiAEBEhsKDmludGVyYWN0aW9u", - "X2lkGAYgASgFSAKIAQESIQoUc29jaWFsX2Vtb3RlX291dGNvbWUYByABKAVI", - "A4gBARIYCgtpc19yZWFjdGluZxgIIAEoCEgEiAEBEiMKFnNvY2lhbF9lbW90", - "ZV9pbml0aWF0b3IYCSABKAlIBYgBARIaCg10YXJnZXRfYXZhdGFyGAogASgJ", - "SAaIAQESEQoEbWFzaxgLIAEoDUgHiAEBQg4KDF9pc19zdG9wcGluZ0IPCg1f", - "aXNfcmVwZWF0aW5nQhEKD19pbnRlcmFjdGlvbl9pZEIXChVfc29jaWFsX2Vt", - "b3RlX291dGNvbWVCDgoMX2lzX3JlYWN0aW5nQhkKF19zb2NpYWxfZW1vdGVf", - "aW5pdGlhdG9yQhAKDl90YXJnZXRfYXZhdGFyQgcKBV9tYXNrIjUKClNjZW5l", - "RW1vdGUSFwoPc2NlbmVfZW50aXR5X2lkGAEgASgJEg4KBnNvdXJjZRgCIAEo", - "CSIxChZBbm5vdW5jZVByb2ZpbGVWZXJzaW9uEhcKD3Byb2ZpbGVfdmVyc2lv", - "bhgBIAEoDSI6Cg5Qcm9maWxlUmVxdWVzdBIPCgdhZGRyZXNzGAQgASgJEhcK", - "D3Byb2ZpbGVfdmVyc2lvbhgDIAEoDSI/Cg9Qcm9maWxlUmVzcG9uc2USGgoS", - "c2VyaWFsaXplZF9wcm9maWxlGAEgASgJEhAKCGJhc2VfdXJsGAIgASgJIloK", - "BENoYXQSDwoHbWVzc2FnZRgBIAEoCRIRCgl0aW1lc3RhbXAYAiABKAESGwoO", - "Zm9yd2FyZGVkX2Zyb20YAyABKAlIAIgBAUIRCg9fZm9yd2FyZGVkX2Zyb20i", - "JwoFU2NlbmUSEAoIc2NlbmVfaWQYASABKAkSDAoEZGF0YRgCIAEoDCKLAQoF", - "Vm9pY2USFwoPZW5jb2RlZF9zYW1wbGVzGAEgASgMEg0KBWluZGV4GAIgASgN", - "Ej8KBWNvZGVjGAMgASgOMjAuZGVjZW50cmFsYW5kLmtlcm5lbC5jb21tcy5y", - "ZmM0LlZvaWNlLlZvaWNlQ29kZWMiGQoKVm9pY2VDb2RlYxILCgdWQ19PUFVT", - "EAAihQEKDkxvb2tBdFBvc2l0aW9uEhEKCXRpbWVzdGFtcBgBIAEoAhISCgpw", - "b3NpdGlvbl94GAIgASgCEhIKCnBvc2l0aW9uX3kYAyABKAISEgoKcG9zaXRp", - "b25fehgEIAEoAhIkChx0YXJnZXRfYXZhdGFyX3dhbGxldF9hZGRyZXNzGAUg", - "ASgJIkEKCFJlYWN0aW9uEhMKC2Vtb2ppX2luZGV4GAEgASgFEhEKCXRpbWVz", - "dGFtcBgCIAEoAhINCgVjb3VudBgDIAEoBSJICgxDaGF0UmVhY3Rpb24SEwoL", - "ZW1vamlfaW5kZXgYASABKAUSEgoKbWVzc2FnZV9pZBgCIAEoCRIPCgdhZGRy", - "ZXNzGAMgASgJYgZwcm90bzM=")); + "aW9uSAASTQoRZmFjaWFsX2V4cHJlc3Npb24YECABKAsyMC5kZWNlbnRyYWxh", + "bmQua2VybmVsLmNvbW1zLnJmYzQuRmFjaWFsRXhwcmVzc2lvbkgAEhgKEHBy", + "b3RvY29sX3ZlcnNpb24YCyABKA1CCQoHbWVzc2FnZSKlAQoIUG9zaXRpb24S", + "DQoFaW5kZXgYASABKA0SEgoKcG9zaXRpb25feBgDIAEoAhISCgpwb3NpdGlv", + "bl95GAQgASgCEhIKCnBvc2l0aW9uX3oYBSABKAISEgoKcm90YXRpb25feBgG", + "IAEoAhISCgpyb3RhdGlvbl95GAcgASgCEhIKCnJvdGF0aW9uX3oYCCABKAIS", + "EgoKcm90YXRpb25fdxgJIAEoAiLrBQoITW92ZW1lbnQSEQoJdGltZXN0YW1w", + "GAEgASgCEhIKCnBvc2l0aW9uX3gYAiABKAISEgoKcG9zaXRpb25feRgDIAEo", + "AhISCgpwb3NpdGlvbl96GAQgASgCEhIKCnZlbG9jaXR5X3gYBSABKAISEgoK", + "dmVsb2NpdHlfeRgGIAEoAhISCgp2ZWxvY2l0eV96GAcgASgCEhwKFG1vdmVt", + "ZW50X2JsZW5kX3ZhbHVlGAggASgCEhkKEXNsaWRlX2JsZW5kX3ZhbHVlGAkg", + "ASgCEhMKC2lzX2dyb3VuZGVkGAogASgIEhIKCmlzX2p1bXBpbmcYCyABKAgS", + "EgoKanVtcF9jb3VudBgYIAEoBRIUCgxpc19sb25nX2p1bXAYDCABKAgSFAoM", + "aXNfbG9uZ19mYWxsGA0gASgIEhIKCmlzX2ZhbGxpbmcYDiABKAgSEgoKaXNf", + "c3R1bm5lZBgPIAEoCBJICgtnbGlkZV9zdGF0ZRgXIAEoDjIzLmRlY2VudHJh", + "bGFuZC5rZXJuZWwuY29tbXMucmZjNC5Nb3ZlbWVudC5HbGlkZVN0YXRlEhIK", + "CnJvdGF0aW9uX3kYECABKAISEgoKaXNfaW5zdGFudBgRIAEoCBISCgppc19l", + "bW90aW5nGBIgASgIEhsKE2hlYWRfaWtfeWF3X2VuYWJsZWQYEyABKAgSHQoV", + "aGVhZF9pa19waXRjaF9lbmFibGVkGBQgASgIEhAKCGhlYWRfeWF3GBUgASgC", + "EhIKCmhlYWRfcGl0Y2gYFiABKAISEgoKcG9pbnRfYXRfeBgZIAEoAhISCgpw", + "b2ludF9hdF95GBogASgCEhIKCnBvaW50X2F0X3oYGyABKAISFgoOaXNfcG9p", + "bnRpbmdfYXQYHCABKAgiTgoKR2xpZGVTdGF0ZRIPCgtQUk9QX0NMT1NFRBAA", + "EhAKDE9QRU5JTkdfUFJPUBABEgsKB0dMSURJTkcQAhIQCgxDTE9TSU5HX1BS", + "T1AQAyJxChJNb3ZlbWVudENvbXByZXNzZWQSFQoNdGVtcG9yYWxfZGF0YRgB", + "IAEoBRIVCg1tb3ZlbWVudF9kYXRhGAIgASgDEhYKDmhlYWRfc3luY19kYXRh", + "GAMgASgFEhUKDXBvaW50X2F0X2RhdGEYBCABKAUiuwMKC1BsYXllckVtb3Rl", + "EhYKDmluY3JlbWVudGFsX2lkGAEgASgNEgsKA3VybhgCIAEoCRIRCgl0aW1l", + "c3RhbXAYAyABKAISGAoLaXNfc3RvcHBpbmcYBCABKAhIAIgBARIZCgxpc19y", + "ZXBlYXRpbmcYBSABKAhIAYgBARIbCg5pbnRlcmFjdGlvbl9pZBgGIAEoBUgC", + "iAEBEiEKFHNvY2lhbF9lbW90ZV9vdXRjb21lGAcgASgFSAOIAQESGAoLaXNf", + "cmVhY3RpbmcYCCABKAhIBIgBARIjChZzb2NpYWxfZW1vdGVfaW5pdGlhdG9y", + "GAkgASgJSAWIAQESGgoNdGFyZ2V0X2F2YXRhchgKIAEoCUgGiAEBEhEKBG1h", + "c2sYCyABKA1IB4gBAUIOCgxfaXNfc3RvcHBpbmdCDwoNX2lzX3JlcGVhdGlu", + "Z0IRCg9faW50ZXJhY3Rpb25faWRCFwoVX3NvY2lhbF9lbW90ZV9vdXRjb21l", + "Qg4KDF9pc19yZWFjdGluZ0IZChdfc29jaWFsX2Vtb3RlX2luaXRpYXRvckIQ", + "Cg5fdGFyZ2V0X2F2YXRhckIHCgVfbWFzayI1CgpTY2VuZUVtb3RlEhcKD3Nj", + "ZW5lX2VudGl0eV9pZBgBIAEoCRIOCgZzb3VyY2UYAiABKAkiMQoWQW5ub3Vu", + "Y2VQcm9maWxlVmVyc2lvbhIXCg9wcm9maWxlX3ZlcnNpb24YASABKA0iOgoO", + "UHJvZmlsZVJlcXVlc3QSDwoHYWRkcmVzcxgEIAEoCRIXCg9wcm9maWxlX3Zl", + "cnNpb24YAyABKA0iPwoPUHJvZmlsZVJlc3BvbnNlEhoKEnNlcmlhbGl6ZWRf", + "cHJvZmlsZRgBIAEoCRIQCghiYXNlX3VybBgCIAEoCSJaCgRDaGF0Eg8KB21l", + "c3NhZ2UYASABKAkSEQoJdGltZXN0YW1wGAIgASgBEhsKDmZvcndhcmRlZF9m", + "cm9tGAMgASgJSACIAQFCEQoPX2ZvcndhcmRlZF9mcm9tIicKBVNjZW5lEhAK", + "CHNjZW5lX2lkGAEgASgJEgwKBGRhdGEYAiABKAwiiwEKBVZvaWNlEhcKD2Vu", + "Y29kZWRfc2FtcGxlcxgBIAEoDBINCgVpbmRleBgCIAEoDRI/CgVjb2RlYxgD", + "IAEoDjIwLmRlY2VudHJhbGFuZC5rZXJuZWwuY29tbXMucmZjNC5Wb2ljZS5W", + "b2ljZUNvZGVjIhkKClZvaWNlQ29kZWMSCwoHVkNfT1BVUxAAIoUBCg5Mb29r", + "QXRQb3NpdGlvbhIRCgl0aW1lc3RhbXAYASABKAISEgoKcG9zaXRpb25feBgC", + "IAEoAhISCgpwb3NpdGlvbl95GAMgASgCEhIKCnBvc2l0aW9uX3oYBCABKAIS", + "JAocdGFyZ2V0X2F2YXRhcl93YWxsZXRfYWRkcmVzcxgFIAEoCSJBCghSZWFj", + "dGlvbhITCgtlbW9qaV9pbmRleBgBIAEoBRIRCgl0aW1lc3RhbXAYAiABKAIS", + "DQoFY291bnQYAyABKAUiSAoMQ2hhdFJlYWN0aW9uEhMKC2Vtb2ppX2luZGV4", + "GAEgASgFEhIKCm1lc3NhZ2VfaWQYAiABKAkSDwoHYWRkcmVzcxgDIAEoCSJT", + "ChBGYWNpYWxFeHByZXNzaW9uEhYKDmV5ZWJyb3dzX2luZGV4GAEgASgNEhIK", + "CmV5ZXNfaW5kZXgYAiABKA0SEwoLbW91dGhfaW5kZXgYAyABKA1iBnByb3Rv", + "Mw==")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::Decentraland.Kernel.Comms.Rfc4.Packet), global::Decentraland.Kernel.Comms.Rfc4.Packet.Parser, new[]{ "Position", "ProfileVersion", "ProfileRequest", "ProfileResponse", "Chat", "Scene", "Voice", "Movement", "PlayerEmote", "SceneEmote", "MovementCompressed", "LookAtPosition", "Reaction", "ChatReaction", "ProtocolVersion" }, new[]{ "Message" }, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Decentraland.Kernel.Comms.Rfc4.Packet), global::Decentraland.Kernel.Comms.Rfc4.Packet.Parser, new[]{ "Position", "ProfileVersion", "ProfileRequest", "ProfileResponse", "Chat", "Scene", "Voice", "Movement", "PlayerEmote", "SceneEmote", "MovementCompressed", "LookAtPosition", "Reaction", "ChatReaction", "FacialExpression", "ProtocolVersion" }, new[]{ "Message" }, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Decentraland.Kernel.Comms.Rfc4.Position), global::Decentraland.Kernel.Comms.Rfc4.Position.Parser, new[]{ "Index", "PositionX", "PositionY", "PositionZ", "RotationX", "RotationY", "RotationZ", "RotationW" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Decentraland.Kernel.Comms.Rfc4.Movement), global::Decentraland.Kernel.Comms.Rfc4.Movement.Parser, new[]{ "Timestamp", "PositionX", "PositionY", "PositionZ", "VelocityX", "VelocityY", "VelocityZ", "MovementBlendValue", "SlideBlendValue", "IsGrounded", "IsJumping", "JumpCount", "IsLongJump", "IsLongFall", "IsFalling", "IsStunned", "GlideState", "RotationY", "IsInstant", "IsEmoting", "HeadIkYawEnabled", "HeadIkPitchEnabled", "HeadYaw", "HeadPitch", "PointAtX", "PointAtY", "PointAtZ", "IsPointingAt" }, null, new[]{ typeof(global::Decentraland.Kernel.Comms.Rfc4.Movement.Types.GlideState) }, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Decentraland.Kernel.Comms.Rfc4.MovementCompressed), global::Decentraland.Kernel.Comms.Rfc4.MovementCompressed.Parser, new[]{ "TemporalData", "MovementData", "HeadSyncData", "PointAtData" }, null, null, null, null), @@ -116,7 +120,8 @@ static CommsReflection() { new pbr::GeneratedClrTypeInfo(typeof(global::Decentraland.Kernel.Comms.Rfc4.Voice), global::Decentraland.Kernel.Comms.Rfc4.Voice.Parser, new[]{ "EncodedSamples", "Index", "Codec" }, null, new[]{ typeof(global::Decentraland.Kernel.Comms.Rfc4.Voice.Types.VoiceCodec) }, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Decentraland.Kernel.Comms.Rfc4.LookAtPosition), global::Decentraland.Kernel.Comms.Rfc4.LookAtPosition.Parser, new[]{ "Timestamp", "PositionX", "PositionY", "PositionZ", "TargetAvatarWalletAddress" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Decentraland.Kernel.Comms.Rfc4.Reaction), global::Decentraland.Kernel.Comms.Rfc4.Reaction.Parser, new[]{ "EmojiIndex", "Timestamp", "Count" }, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Decentraland.Kernel.Comms.Rfc4.ChatReaction), global::Decentraland.Kernel.Comms.Rfc4.ChatReaction.Parser, new[]{ "EmojiIndex", "MessageId", "Address" }, null, null, null, null) + new pbr::GeneratedClrTypeInfo(typeof(global::Decentraland.Kernel.Comms.Rfc4.ChatReaction), global::Decentraland.Kernel.Comms.Rfc4.ChatReaction.Parser, new[]{ "EmojiIndex", "MessageId", "Address" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Decentraland.Kernel.Comms.Rfc4.FacialExpression), global::Decentraland.Kernel.Comms.Rfc4.FacialExpression.Parser, new[]{ "EyebrowsIndex", "EyesIndex", "MouthIndex" }, null, null, null, null) })); } #endregion @@ -201,6 +206,9 @@ public Packet(Packet other) : this() { case MessageOneofCase.ChatReaction: ChatReaction = other.ChatReaction.Clone(); break; + case MessageOneofCase.FacialExpression: + FacialExpression = other.FacialExpression.Clone(); + break; } _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); @@ -380,6 +388,18 @@ public Packet Clone() { } } + /// Field number for the "facial_expression" field. + public const int FacialExpressionFieldNumber = 16; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Decentraland.Kernel.Comms.Rfc4.FacialExpression FacialExpression { + get { return messageCase_ == MessageOneofCase.FacialExpression ? (global::Decentraland.Kernel.Comms.Rfc4.FacialExpression) message_ : null; } + set { + message_ = value; + messageCase_ = value == null ? MessageOneofCase.None : MessageOneofCase.FacialExpression; + } + } + /// Field number for the "protocol_version" field. public const int ProtocolVersionFieldNumber = 11; private uint protocolVersion_; @@ -410,6 +430,7 @@ public enum MessageOneofCase { LookAtPosition = 13, Reaction = 14, ChatReaction = 15, + FacialExpression = 16, } private MessageOneofCase messageCase_ = MessageOneofCase.None; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -454,6 +475,7 @@ public bool Equals(Packet other) { if (!object.Equals(LookAtPosition, other.LookAtPosition)) return false; if (!object.Equals(Reaction, other.Reaction)) return false; if (!object.Equals(ChatReaction, other.ChatReaction)) return false; + if (!object.Equals(FacialExpression, other.FacialExpression)) return false; if (ProtocolVersion != other.ProtocolVersion) return false; if (MessageCase != other.MessageCase) return false; return Equals(_unknownFields, other._unknownFields); @@ -477,6 +499,7 @@ public override int GetHashCode() { if (messageCase_ == MessageOneofCase.LookAtPosition) hash ^= LookAtPosition.GetHashCode(); if (messageCase_ == MessageOneofCase.Reaction) hash ^= Reaction.GetHashCode(); if (messageCase_ == MessageOneofCase.ChatReaction) hash ^= ChatReaction.GetHashCode(); + if (messageCase_ == MessageOneofCase.FacialExpression) hash ^= FacialExpression.GetHashCode(); if (ProtocolVersion != 0) hash ^= ProtocolVersion.GetHashCode(); hash ^= (int) messageCase_; if (_unknownFields != null) { @@ -557,6 +580,10 @@ public void WriteTo(pb::CodedOutputStream output) { output.WriteRawTag(122); output.WriteMessage(ChatReaction); } + if (messageCase_ == MessageOneofCase.FacialExpression) { + output.WriteRawTag(130, 1); + output.WriteMessage(FacialExpression); + } if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -627,6 +654,10 @@ public void WriteTo(pb::CodedOutputStream output) { output.WriteRawTag(122); output.WriteMessage(ChatReaction); } + if (messageCase_ == MessageOneofCase.FacialExpression) { + output.WriteRawTag(130, 1); + output.WriteMessage(FacialExpression); + } if (_unknownFields != null) { _unknownFields.WriteTo(ref output); } @@ -679,6 +710,9 @@ public int CalculateSize() { if (messageCase_ == MessageOneofCase.ChatReaction) { size += 1 + pb::CodedOutputStream.ComputeMessageSize(ChatReaction); } + if (messageCase_ == MessageOneofCase.FacialExpression) { + size += 2 + pb::CodedOutputStream.ComputeMessageSize(FacialExpression); + } if (ProtocolVersion != 0) { size += 1 + pb::CodedOutputStream.ComputeUInt32Size(ProtocolVersion); } @@ -782,6 +816,12 @@ public void MergeFrom(Packet other) { } ChatReaction.MergeFrom(other.ChatReaction); break; + case MessageOneofCase.FacialExpression: + if (FacialExpression == null) { + FacialExpression = new global::Decentraland.Kernel.Comms.Rfc4.FacialExpression(); + } + FacialExpression.MergeFrom(other.FacialExpression); + break; } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); @@ -929,6 +969,15 @@ public void MergeFrom(pb::CodedInputStream input) { ChatReaction = subBuilder; break; } + case 130: { + global::Decentraland.Kernel.Comms.Rfc4.FacialExpression subBuilder = new global::Decentraland.Kernel.Comms.Rfc4.FacialExpression(); + if (messageCase_ == MessageOneofCase.FacialExpression) { + subBuilder.MergeFrom(FacialExpression); + } + input.ReadMessage(subBuilder); + FacialExpression = subBuilder; + break; + } } } #endif @@ -1074,6 +1123,15 @@ public void MergeFrom(pb::CodedInputStream input) { ChatReaction = subBuilder; break; } + case 130: { + global::Decentraland.Kernel.Comms.Rfc4.FacialExpression subBuilder = new global::Decentraland.Kernel.Comms.Rfc4.FacialExpression(); + if (messageCase_ == MessageOneofCase.FacialExpression) { + subBuilder.MergeFrom(FacialExpression); + } + input.ReadMessage(subBuilder); + FacialExpression = subBuilder; + break; + } } } } @@ -6280,6 +6338,276 @@ public void MergeFrom(pb::CodedInputStream input) { } + /// + /// Facial expression state per ADR-317. + /// Each field is a 0-based tile index into the corresponding 4x4 facial-feature atlas. + /// Values outside 0-15 MUST be ignored by receivers in this version. + /// Edge-triggered: senders emit only when an index changes; not periodic. + /// Local-only blink and lip-sync are NOT part of this message. + /// + public sealed partial class FacialExpression : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new FacialExpression()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::Decentraland.Kernel.Comms.Rfc4.CommsReflection.Descriptor.MessageTypes[15]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public FacialExpression() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public FacialExpression(FacialExpression other) : this() { + eyebrowsIndex_ = other.eyebrowsIndex_; + eyesIndex_ = other.eyesIndex_; + mouthIndex_ = other.mouthIndex_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public FacialExpression Clone() { + return new FacialExpression(this); + } + + /// Field number for the "eyebrows_index" field. + public const int EyebrowsIndexFieldNumber = 1; + private uint eyebrowsIndex_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint EyebrowsIndex { + get { return eyebrowsIndex_; } + set { + eyebrowsIndex_ = value; + } + } + + /// Field number for the "eyes_index" field. + public const int EyesIndexFieldNumber = 2; + private uint eyesIndex_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint EyesIndex { + get { return eyesIndex_; } + set { + eyesIndex_ = value; + } + } + + /// Field number for the "mouth_index" field. + public const int MouthIndexFieldNumber = 3; + private uint mouthIndex_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint MouthIndex { + get { return mouthIndex_; } + set { + mouthIndex_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as FacialExpression); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(FacialExpression other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (EyebrowsIndex != other.EyebrowsIndex) return false; + if (EyesIndex != other.EyesIndex) return false; + if (MouthIndex != other.MouthIndex) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (EyebrowsIndex != 0) hash ^= EyebrowsIndex.GetHashCode(); + if (EyesIndex != 0) hash ^= EyesIndex.GetHashCode(); + if (MouthIndex != 0) hash ^= MouthIndex.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (EyebrowsIndex != 0) { + output.WriteRawTag(8); + output.WriteUInt32(EyebrowsIndex); + } + if (EyesIndex != 0) { + output.WriteRawTag(16); + output.WriteUInt32(EyesIndex); + } + if (MouthIndex != 0) { + output.WriteRawTag(24); + output.WriteUInt32(MouthIndex); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (EyebrowsIndex != 0) { + output.WriteRawTag(8); + output.WriteUInt32(EyebrowsIndex); + } + if (EyesIndex != 0) { + output.WriteRawTag(16); + output.WriteUInt32(EyesIndex); + } + if (MouthIndex != 0) { + output.WriteRawTag(24); + output.WriteUInt32(MouthIndex); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (EyebrowsIndex != 0) { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(EyebrowsIndex); + } + if (EyesIndex != 0) { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(EyesIndex); + } + if (MouthIndex != 0) { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(MouthIndex); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(FacialExpression other) { + if (other == null) { + return; + } + if (other.EyebrowsIndex != 0) { + EyebrowsIndex = other.EyebrowsIndex; + } + if (other.EyesIndex != 0) { + EyesIndex = other.EyesIndex; + } + if (other.MouthIndex != 0) { + MouthIndex = other.MouthIndex; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + EyebrowsIndex = input.ReadUInt32(); + break; + } + case 16: { + EyesIndex = input.ReadUInt32(); + break; + } + case 24: { + MouthIndex = input.ReadUInt32(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + EyebrowsIndex = input.ReadUInt32(); + break; + } + case 16: { + EyesIndex = input.ReadUInt32(); + break; + } + case 24: { + MouthIndex = input.ReadUInt32(); + break; + } + } + } + } + #endif + + } + #endregion } From 9cf919becf259c0d5604289f73577fe29a114e26 Mon Sep 17 00:00:00 2001 From: Alejandro Jimenez Date: Tue, 5 May 2026 11:41:38 +0200 Subject: [PATCH 04/28] feat(facial-expression): add bus + send/receive systems Multiplayer: IFacialExpressionMessageBus + MultiplayerFacialExpressionMessageBus (subscribe to FacialExpression oneof, edge-triggered Send), RemoteFacialExpressionIntention, and PlayerFacialExpressionNetSendSystem reading LocalPlayerFacialExpressionComponent. AvatarShape: RemoteFacialExpressionSystem drains intentions and applies indices to AvatarFaceComponent of the matching remote avatar (TODO: validate non-query-driven participant lookup with architect, mirrors RemoteEmotesSystem). Face systems grouped under AvatarShape/Systems/FacialExpression and Multiplayer/FacialExpression. --- .../AvatarShape/Systems/FacialExpression.meta | 8 ++ .../RemoteFacialExpressionSystem.cs | 74 +++++++++++++++ .../RemoteFacialExpressionSystem.cs.meta | 2 + .../DCL/Multiplayer/FacialExpression.meta | 8 ++ .../IFacialExpressionMessageBus.cs | 16 ++++ .../IFacialExpressionMessageBus.cs.meta | 2 + .../MultiplayerFacialExpressionMessageBus.cs | 92 +++++++++++++++++++ ...tiplayerFacialExpressionMessageBus.cs.meta | 2 + .../RemoteFacialExpressionIntention.cs | 36 ++++++++ .../RemoteFacialExpressionIntention.cs.meta | 2 + .../Multiplayer/FacialExpression/Systems.meta | 8 ++ .../PlayerFacialExpressionNetSendSystem.cs | 55 +++++++++++ ...layerFacialExpressionNetSendSystem.cs.meta | 2 + 13 files changed, 307 insertions(+) create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/RemoteFacialExpressionSystem.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/RemoteFacialExpressionSystem.cs.meta create mode 100644 Explorer/Assets/DCL/Multiplayer/FacialExpression.meta create mode 100644 Explorer/Assets/DCL/Multiplayer/FacialExpression/IFacialExpressionMessageBus.cs create mode 100644 Explorer/Assets/DCL/Multiplayer/FacialExpression/IFacialExpressionMessageBus.cs.meta create mode 100644 Explorer/Assets/DCL/Multiplayer/FacialExpression/MultiplayerFacialExpressionMessageBus.cs create mode 100644 Explorer/Assets/DCL/Multiplayer/FacialExpression/MultiplayerFacialExpressionMessageBus.cs.meta create mode 100644 Explorer/Assets/DCL/Multiplayer/FacialExpression/RemoteFacialExpressionIntention.cs create mode 100644 Explorer/Assets/DCL/Multiplayer/FacialExpression/RemoteFacialExpressionIntention.cs.meta create mode 100644 Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems.meta create mode 100644 Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/PlayerFacialExpressionNetSendSystem.cs create mode 100644 Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/PlayerFacialExpressionNetSendSystem.cs.meta diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression.meta new file mode 100644 index 00000000000..d86abbf56c3 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 91abfaa82595cb24bb956be994dd19a7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/RemoteFacialExpressionSystem.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/RemoteFacialExpressionSystem.cs new file mode 100644 index 00000000000..9d409ab1098 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/RemoteFacialExpressionSystem.cs @@ -0,0 +1,74 @@ +using Arch.Core; +using Arch.SystemGroups; +using Arch.SystemGroups.DefaultSystemGroups; +using DCL.AvatarRendering.AvatarShape.Components; +using DCL.Diagnostics; +using DCL.Multiplayer.FacialExpression; +using DCL.Multiplayer.Movement.Systems; +using DCL.Multiplayer.Profiles.Tables; +using ECS.Abstract; +using System.Collections.Generic; + +namespace DCL.AvatarRendering.AvatarShape +{ + /// + /// Drains intentions and applies them to the matching + /// remote avatar's . When the participant entity isn't + /// known yet (avatar still loading), the intention is requeued for the next frame. + /// Per ADR-317 face state is last-write-wins; no timestamp/order check. + /// + /// + /// TODO/WARNING — pending architect review. This system bypasses ECS and resolves the target + /// entity by walletId via instead of running a + /// query. Same pattern as RemoteEmotesSystem; performant but at odds with the + /// "systems are the sole entity manipulation entry point via queries" principle. Validate the + /// approach (or rework as a query-driven system) before merging. + /// + [UpdateInGroup(typeof(PresentationSystemGroup))] + [UpdateAfter(typeof(RemotePlayersMovementSystem))] + [LogCategory(ReportCategory.MULTIPLAYER_MOVEMENT)] + public class RemoteFacialExpressionSystem : BaseUnityLoopSystem + { + private readonly IReadOnlyEntityParticipantTable entityParticipantTable; + private readonly IFacialExpressionMessageBus bus; + private readonly List drained = new (); + + internal RemoteFacialExpressionSystem(World world, IReadOnlyEntityParticipantTable entityParticipantTable, IFacialExpressionMessageBus bus) : base(world) + { + this.entityParticipantTable = entityParticipantTable; + this.bus = bus; + } + + protected override void Update(float t) + { + bus.Drain(drained); + + if (drained.Count == 0) + return; + + foreach (RemoteFacialExpressionIntention intention in drained) + { + if (!entityParticipantTable.TryGet(intention.WalletId, out IReadOnlyEntityParticipantTable.Entry entry)) + { + bus.SaveForRetry(intention); + continue; + } + + ref AvatarFaceComponent face = ref World.TryGetRef(entry.Entity, out bool exists); + + if (!exists) + { + bus.SaveForRetry(intention); + continue; + } + + face.EyebrowsExpressionIndex = intention.EyebrowsIndex; + face.EyesExpressionIndex = intention.EyesIndex; + face.MouthExpressionIndex = intention.MouthIndex; + face.IsDirty = true; + } + + drained.Clear(); + } + } +} diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/RemoteFacialExpressionSystem.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/RemoteFacialExpressionSystem.cs.meta new file mode 100644 index 00000000000..f92b84cff8b --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/RemoteFacialExpressionSystem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 19962c707cae4184ba57b5bf7e05baef \ No newline at end of file diff --git a/Explorer/Assets/DCL/Multiplayer/FacialExpression.meta b/Explorer/Assets/DCL/Multiplayer/FacialExpression.meta new file mode 100644 index 00000000000..1780ce44396 --- /dev/null +++ b/Explorer/Assets/DCL/Multiplayer/FacialExpression.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3c3b7798634c4f24fa677d962ed7f89b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/Multiplayer/FacialExpression/IFacialExpressionMessageBus.cs b/Explorer/Assets/DCL/Multiplayer/FacialExpression/IFacialExpressionMessageBus.cs new file mode 100644 index 00000000000..de7c98d3224 --- /dev/null +++ b/Explorer/Assets/DCL/Multiplayer/FacialExpression/IFacialExpressionMessageBus.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace DCL.Multiplayer.FacialExpression +{ + public interface IFacialExpressionMessageBus + { + /// Edge-triggered send of the local player's expression indices to remote peers. + void Send(byte eyebrowsIndex, byte eyesIndex, byte mouthIndex); + + /// Moves all received intentions into and clears the internal buffer. + void Drain(ICollection output); + + /// Re-queues an intention whose target entity wasn't ready this frame. + void SaveForRetry(RemoteFacialExpressionIntention intention); + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/Multiplayer/FacialExpression/IFacialExpressionMessageBus.cs.meta b/Explorer/Assets/DCL/Multiplayer/FacialExpression/IFacialExpressionMessageBus.cs.meta new file mode 100644 index 00000000000..c62d967f37b --- /dev/null +++ b/Explorer/Assets/DCL/Multiplayer/FacialExpression/IFacialExpressionMessageBus.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3db436b2e6198074788b1878cff52865 \ No newline at end of file diff --git a/Explorer/Assets/DCL/Multiplayer/FacialExpression/MultiplayerFacialExpressionMessageBus.cs b/Explorer/Assets/DCL/Multiplayer/FacialExpression/MultiplayerFacialExpressionMessageBus.cs new file mode 100644 index 00000000000..2418225b16e --- /dev/null +++ b/Explorer/Assets/DCL/Multiplayer/FacialExpression/MultiplayerFacialExpressionMessageBus.cs @@ -0,0 +1,92 @@ +using Cysharp.Threading.Tasks; +using DCL.Multiplayer.Connections.Messaging; +using DCL.Multiplayer.Connections.Messaging.Hubs; +using DCL.Multiplayer.Connections.Messaging.Pipe; +using Decentraland.Kernel.Comms.Rfc4; +using DCL.LiveKit.Public; +using System; +using System.Collections.Generic; +using System.Threading; + +namespace DCL.Multiplayer.FacialExpression +{ + /// + /// Carries per-player state across the rfc4 comms. + /// Edge-triggered: is only called when the local player's indices change + /// (see ADR-317). Last-received message per peer is the authoritative remote state. + /// + public class MultiplayerFacialExpressionMessageBus : IFacialExpressionMessageBus, IDisposable + { + private const byte MAX_INDEX = 15; + + private readonly IMessagePipesHub messagePipesHub; + private readonly CancellationTokenSource cts = new (); + private readonly HashSet intentions = new (); + + public MultiplayerFacialExpressionMessageBus(IMessagePipesHub messagePipesHub) + { + this.messagePipesHub = messagePipesHub; + + messagePipesHub.IslandPipe().Subscribe(Packet.MessageOneofCase.FacialExpression, OnMessageReceived); + messagePipesHub.ScenePipe().Subscribe(Packet.MessageOneofCase.FacialExpression, OnMessageReceived); + } + + public void Dispose() + { + cts.Cancel(); + cts.Dispose(); + } + + public void Send(byte eyebrowsIndex, byte eyesIndex, byte mouthIndex) + { + if (cts.IsCancellationRequested) + return; + + SendTo(eyebrowsIndex, eyesIndex, mouthIndex, messagePipesHub.IslandPipe()); + SendTo(eyebrowsIndex, eyesIndex, mouthIndex, messagePipesHub.ScenePipe()); + } + + public void Drain(ICollection output) + { + foreach (RemoteFacialExpressionIntention intention in intentions) + output.Add(intention); + + intentions.Clear(); + } + + public void SaveForRetry(RemoteFacialExpressionIntention intention) => + intentions.Add(intention); + + private void SendTo(byte eyebrows, byte eyes, byte mouth, IMessagePipe pipe) + { + MessageWrap message = pipe.NewMessage(); + + message.Payload.EyebrowsIndex = eyebrows; + message.Payload.EyesIndex = eyes; + message.Payload.MouthIndex = mouth; + + message.SendAndDisposeAsync(cts.Token, LKDataPacketKind.KindReliable).Forget(); + } + + private void OnMessageReceived(ReceivedMessage receivedMessage) + { + using (receivedMessage) + { + if (cts.IsCancellationRequested) + return; + + var payload = receivedMessage.Payload; + + // Per ADR-317: drop messages with out-of-range indices. + if (payload.EyebrowsIndex > MAX_INDEX || payload.EyesIndex > MAX_INDEX || payload.MouthIndex > MAX_INDEX) + return; + + intentions.Add(new RemoteFacialExpressionIntention( + receivedMessage.FromWalletId, + (byte)payload.EyebrowsIndex, + (byte)payload.EyesIndex, + (byte)payload.MouthIndex)); + } + } + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/Multiplayer/FacialExpression/MultiplayerFacialExpressionMessageBus.cs.meta b/Explorer/Assets/DCL/Multiplayer/FacialExpression/MultiplayerFacialExpressionMessageBus.cs.meta new file mode 100644 index 00000000000..589991d36b6 --- /dev/null +++ b/Explorer/Assets/DCL/Multiplayer/FacialExpression/MultiplayerFacialExpressionMessageBus.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 627d6e4f4af65504e8e50eef1fe9e58f \ No newline at end of file diff --git a/Explorer/Assets/DCL/Multiplayer/FacialExpression/RemoteFacialExpressionIntention.cs b/Explorer/Assets/DCL/Multiplayer/FacialExpression/RemoteFacialExpressionIntention.cs new file mode 100644 index 00000000000..b832e098124 --- /dev/null +++ b/Explorer/Assets/DCL/Multiplayer/FacialExpression/RemoteFacialExpressionIntention.cs @@ -0,0 +1,36 @@ +using System; + +namespace DCL.Multiplayer.FacialExpression +{ + /// + /// Intention to apply a facial expression to a remote avatar. Each index is a 0-15 tile + /// in the corresponding 4x4 atlas (ADR-317). Out-of-range values MUST be ignored at receive time. + /// + public readonly struct RemoteFacialExpressionIntention : IEquatable + { + public readonly string WalletId; + public readonly byte EyebrowsIndex; + public readonly byte EyesIndex; + public readonly byte MouthIndex; + + public RemoteFacialExpressionIntention(string walletId, byte eyebrowsIndex, byte eyesIndex, byte mouthIndex) + { + WalletId = walletId; + EyebrowsIndex = eyebrowsIndex; + EyesIndex = eyesIndex; + MouthIndex = mouthIndex; + } + + public bool Equals(RemoteFacialExpressionIntention other) => + WalletId == other.WalletId + && EyebrowsIndex == other.EyebrowsIndex + && EyesIndex == other.EyesIndex + && MouthIndex == other.MouthIndex; + + public override bool Equals(object? obj) => + obj is RemoteFacialExpressionIntention other && Equals(other); + + public override int GetHashCode() => + HashCode.Combine(WalletId, EyebrowsIndex, EyesIndex, MouthIndex); + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/Multiplayer/FacialExpression/RemoteFacialExpressionIntention.cs.meta b/Explorer/Assets/DCL/Multiplayer/FacialExpression/RemoteFacialExpressionIntention.cs.meta new file mode 100644 index 00000000000..fe8309c3772 --- /dev/null +++ b/Explorer/Assets/DCL/Multiplayer/FacialExpression/RemoteFacialExpressionIntention.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6aaae60249863cc4f954a16b966640a2 \ No newline at end of file diff --git a/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems.meta b/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems.meta new file mode 100644 index 00000000000..3c3783b3151 --- /dev/null +++ b/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: abe272bf0dbbe1d48b0ebe10e122665c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/PlayerFacialExpressionNetSendSystem.cs b/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/PlayerFacialExpressionNetSendSystem.cs new file mode 100644 index 00000000000..8866291d4cc --- /dev/null +++ b/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/PlayerFacialExpressionNetSendSystem.cs @@ -0,0 +1,55 @@ +using Arch.Core; +using Arch.System; +using Arch.SystemGroups; +using Arch.SystemGroups.DefaultSystemGroups; +using DCL.Diagnostics; +using DCL.Multiplayer.Movement; +using ECS.Abstract; + +namespace DCL.Multiplayer.FacialExpression.Systems +{ + /// + /// Edge-triggered facial expression send. Reads + /// on the local player entity, compares against the last-sent indices cached in this system, + /// and emits a FacialExpression message only when something changed (per ADR-317). + /// Component is written by AvatarShape's expression input system (slot binding, debug menu, etc.). + /// + [UpdateInGroup(typeof(PostRenderingSystemGroup))] + [LogCategory(ReportCategory.MULTIPLAYER_MOVEMENT)] + public partial class PlayerFacialExpressionNetSendSystem : BaseUnityLoopSystem + { + // Sentinel "never sent" — first frame the component exists, indices won't match these and a send fires. + private const byte UNSENT = byte.MaxValue; + + private readonly IFacialExpressionMessageBus bus; + + private byte lastEyebrows = UNSENT; + private byte lastEyes = UNSENT; + private byte lastMouth = UNSENT; + + internal PlayerFacialExpressionNetSendSystem(World world, IFacialExpressionMessageBus bus) : base(world) + { + this.bus = bus; + } + + protected override void Update(float t) + { + SendIfChangedQuery(World); + } + + [Query] + private void SendIfChanged(in LocalPlayerFacialExpressionComponent face) + { + if (face.EyebrowsIndex == lastEyebrows + && face.EyesIndex == lastEyes + && face.MouthIndex == lastMouth) + return; + + lastEyebrows = face.EyebrowsIndex; + lastEyes = face.EyesIndex; + lastMouth = face.MouthIndex; + + bus.Send(face.EyebrowsIndex, face.EyesIndex, face.MouthIndex); + } + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/PlayerFacialExpressionNetSendSystem.cs.meta b/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/PlayerFacialExpressionNetSendSystem.cs.meta new file mode 100644 index 00000000000..227135b3180 --- /dev/null +++ b/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/PlayerFacialExpressionNetSendSystem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1c5f24df324e448418a9b1c625614f0c \ No newline at end of file From c3df09740cedc3ecf1eb373833a480b86ad307e3 Mon Sep 17 00:00:00 2001 From: Alejandro Jimenez Date: Tue, 5 May 2026 11:54:04 +0200 Subject: [PATCH 05/28] feat(input): add FaceExpressions action map (Y + 1-9) Slots 1-9 bound as Y-modifier composites mirroring the emote slot shortcut style. Unblocks UpdateFaceExpressionInputSystem (Domain 2 leftover). --- .../DCL/Input/UnityInputSystem/DCLInput.cs | 653 ++++++++++++++++++ .../UnityInputSystem/DCLInput.inputactions | 386 +++++++++++ 2 files changed, 1039 insertions(+) diff --git a/Explorer/Assets/DCL/Input/UnityInputSystem/DCLInput.cs b/Explorer/Assets/DCL/Input/UnityInputSystem/DCLInput.cs index 046cc6e8cfc..a8966ba5269 100644 --- a/Explorer/Assets/DCL/Input/UnityInputSystem/DCLInput.cs +++ b/Explorer/Assets/DCL/Input/UnityInputSystem/DCLInput.cs @@ -3927,6 +3927,392 @@ public @DCLInput() ""isPartOfComposite"": false } ] + }, + { + ""name"": ""FaceExpressions"", + ""id"": ""a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d"", + ""actions"": [ + { + ""name"": ""Slot 1"", + ""type"": ""Button"", + ""id"": ""fe100001-0000-4000-a000-000000000001"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""Slot 2"", + ""type"": ""Button"", + ""id"": ""fe100001-0000-4000-a000-000000000002"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""Slot 3"", + ""type"": ""Button"", + ""id"": ""fe100001-0000-4000-a000-000000000003"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""Slot 4"", + ""type"": ""Button"", + ""id"": ""fe100001-0000-4000-a000-000000000004"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""Slot 5"", + ""type"": ""Button"", + ""id"": ""fe100001-0000-4000-a000-000000000005"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""Slot 6"", + ""type"": ""Button"", + ""id"": ""fe100001-0000-4000-a000-000000000006"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""Slot 7"", + ""type"": ""Button"", + ""id"": ""fe100001-0000-4000-a000-000000000007"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""Slot 8"", + ""type"": ""Button"", + ""id"": ""fe100001-0000-4000-a000-000000000008"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""Slot 9"", + ""type"": ""Button"", + ""id"": ""fe100001-0000-4000-a000-000000000009"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + } + ], + ""bindings"": [ + { + ""name"": ""One Modifier"", + ""id"": ""fe200001-0000-4000-b000-000000000001"", + ""path"": ""OneModifier"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 1"", + ""isComposite"": true, + ""isPartOfComposite"": false + }, + { + ""name"": ""modifier"", + ""id"": ""fe200001-0000-4000-b000-000000000002"", + ""path"": ""/y"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 1"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""binding"", + ""id"": ""fe200001-0000-4000-b000-000000000003"", + ""path"": ""/1"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 1"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""One Modifier"", + ""id"": ""fe200002-0000-4000-b000-000000000001"", + ""path"": ""OneModifier"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 2"", + ""isComposite"": true, + ""isPartOfComposite"": false + }, + { + ""name"": ""modifier"", + ""id"": ""fe200002-0000-4000-b000-000000000002"", + ""path"": ""/y"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 2"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""binding"", + ""id"": ""fe200002-0000-4000-b000-000000000003"", + ""path"": ""/2"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 2"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""One Modifier"", + ""id"": ""fe200003-0000-4000-b000-000000000001"", + ""path"": ""OneModifier"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 3"", + ""isComposite"": true, + ""isPartOfComposite"": false + }, + { + ""name"": ""modifier"", + ""id"": ""fe200003-0000-4000-b000-000000000002"", + ""path"": ""/y"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 3"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""binding"", + ""id"": ""fe200003-0000-4000-b000-000000000003"", + ""path"": ""/3"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 3"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""One Modifier"", + ""id"": ""fe200004-0000-4000-b000-000000000001"", + ""path"": ""OneModifier"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 4"", + ""isComposite"": true, + ""isPartOfComposite"": false + }, + { + ""name"": ""modifier"", + ""id"": ""fe200004-0000-4000-b000-000000000002"", + ""path"": ""/y"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 4"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""binding"", + ""id"": ""fe200004-0000-4000-b000-000000000003"", + ""path"": ""/4"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 4"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""One Modifier"", + ""id"": ""fe200005-0000-4000-b000-000000000001"", + ""path"": ""OneModifier"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 5"", + ""isComposite"": true, + ""isPartOfComposite"": false + }, + { + ""name"": ""modifier"", + ""id"": ""fe200005-0000-4000-b000-000000000002"", + ""path"": ""/y"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 5"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""binding"", + ""id"": ""fe200005-0000-4000-b000-000000000003"", + ""path"": ""/5"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 5"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""One Modifier"", + ""id"": ""fe200006-0000-4000-b000-000000000001"", + ""path"": ""OneModifier"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 6"", + ""isComposite"": true, + ""isPartOfComposite"": false + }, + { + ""name"": ""modifier"", + ""id"": ""fe200006-0000-4000-b000-000000000002"", + ""path"": ""/y"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 6"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""binding"", + ""id"": ""fe200006-0000-4000-b000-000000000003"", + ""path"": ""/6"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 6"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""One Modifier"", + ""id"": ""fe200007-0000-4000-b000-000000000001"", + ""path"": ""OneModifier"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 7"", + ""isComposite"": true, + ""isPartOfComposite"": false + }, + { + ""name"": ""modifier"", + ""id"": ""fe200007-0000-4000-b000-000000000002"", + ""path"": ""/y"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 7"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""binding"", + ""id"": ""fe200007-0000-4000-b000-000000000003"", + ""path"": ""/7"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 7"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""One Modifier"", + ""id"": ""fe200008-0000-4000-b000-000000000001"", + ""path"": ""OneModifier"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 8"", + ""isComposite"": true, + ""isPartOfComposite"": false + }, + { + ""name"": ""modifier"", + ""id"": ""fe200008-0000-4000-b000-000000000002"", + ""path"": ""/y"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 8"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""binding"", + ""id"": ""fe200008-0000-4000-b000-000000000003"", + ""path"": ""/8"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 8"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""One Modifier"", + ""id"": ""fe200009-0000-4000-b000-000000000001"", + ""path"": ""OneModifier"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 9"", + ""isComposite"": true, + ""isPartOfComposite"": false + }, + { + ""name"": ""modifier"", + ""id"": ""fe200009-0000-4000-b000-000000000002"", + ""path"": ""/y"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 9"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""binding"", + ""id"": ""fe200009-0000-4000-b000-000000000003"", + ""path"": ""/9"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 9"", + ""isComposite"": false, + ""isPartOfComposite"": true + } + ] } ], ""controlSchemes"": [ @@ -4062,6 +4448,17 @@ public @DCLInput() // VoiceChat m_VoiceChat = asset.FindActionMap("VoiceChat", throwIfNotFound: true); m_VoiceChat_Talk = m_VoiceChat.FindAction("Talk", throwIfNotFound: true); + // FaceExpressions + m_FaceExpressions = asset.FindActionMap("FaceExpressions", throwIfNotFound: true); + m_FaceExpressions_Slot1 = m_FaceExpressions.FindAction("Slot 1", throwIfNotFound: true); + m_FaceExpressions_Slot2 = m_FaceExpressions.FindAction("Slot 2", throwIfNotFound: true); + m_FaceExpressions_Slot3 = m_FaceExpressions.FindAction("Slot 3", throwIfNotFound: true); + m_FaceExpressions_Slot4 = m_FaceExpressions.FindAction("Slot 4", throwIfNotFound: true); + m_FaceExpressions_Slot5 = m_FaceExpressions.FindAction("Slot 5", throwIfNotFound: true); + m_FaceExpressions_Slot6 = m_FaceExpressions.FindAction("Slot 6", throwIfNotFound: true); + m_FaceExpressions_Slot7 = m_FaceExpressions.FindAction("Slot 7", throwIfNotFound: true); + m_FaceExpressions_Slot8 = m_FaceExpressions.FindAction("Slot 8", throwIfNotFound: true); + m_FaceExpressions_Slot9 = m_FaceExpressions.FindAction("Slot 9", throwIfNotFound: true); } ~@DCLInput() @@ -4075,6 +4472,7 @@ public @DCLInput() UnityEngine.Debug.Assert(!m_EmoteWheel.enabled, "This will cause a leak and performance issues, DCLInput.EmoteWheel.Disable() has not been called."); UnityEngine.Debug.Assert(!m_InWorldCamera.enabled, "This will cause a leak and performance issues, DCLInput.InWorldCamera.Disable() has not been called."); UnityEngine.Debug.Assert(!m_VoiceChat.enabled, "This will cause a leak and performance issues, DCLInput.VoiceChat.Disable() has not been called."); + UnityEngine.Debug.Assert(!m_FaceExpressions.enabled, "This will cause a leak and performance issues, DCLInput.FaceExpressions.Disable() has not been called."); } /// @@ -6088,6 +6486,190 @@ public void SetCallbacks(IVoiceChatActions instance) /// Provides a new instance referencing this action map. /// public VoiceChatActions @VoiceChat => new VoiceChatActions(this); + + // FaceExpressions + private readonly InputActionMap m_FaceExpressions; + private List m_FaceExpressionsActionsCallbackInterfaces = new List(); + private readonly InputAction m_FaceExpressions_Slot1; + private readonly InputAction m_FaceExpressions_Slot2; + private readonly InputAction m_FaceExpressions_Slot3; + private readonly InputAction m_FaceExpressions_Slot4; + private readonly InputAction m_FaceExpressions_Slot5; + private readonly InputAction m_FaceExpressions_Slot6; + private readonly InputAction m_FaceExpressions_Slot7; + private readonly InputAction m_FaceExpressions_Slot8; + private readonly InputAction m_FaceExpressions_Slot9; + /// + /// Provides access to input actions defined in input action map "FaceExpressions". + /// + public struct FaceExpressionsActions + { + private @DCLInput m_Wrapper; + + /// + /// Construct a new instance of the input action map wrapper class. + /// + public FaceExpressionsActions(@DCLInput wrapper) { m_Wrapper = wrapper; } + /// + /// Provides access to the underlying input action "FaceExpressions/Slot1". + /// + public InputAction @Slot1 => m_Wrapper.m_FaceExpressions_Slot1; + /// + /// Provides access to the underlying input action "FaceExpressions/Slot2". + /// + public InputAction @Slot2 => m_Wrapper.m_FaceExpressions_Slot2; + /// + /// Provides access to the underlying input action "FaceExpressions/Slot3". + /// + public InputAction @Slot3 => m_Wrapper.m_FaceExpressions_Slot3; + /// + /// Provides access to the underlying input action "FaceExpressions/Slot4". + /// + public InputAction @Slot4 => m_Wrapper.m_FaceExpressions_Slot4; + /// + /// Provides access to the underlying input action "FaceExpressions/Slot5". + /// + public InputAction @Slot5 => m_Wrapper.m_FaceExpressions_Slot5; + /// + /// Provides access to the underlying input action "FaceExpressions/Slot6". + /// + public InputAction @Slot6 => m_Wrapper.m_FaceExpressions_Slot6; + /// + /// Provides access to the underlying input action "FaceExpressions/Slot7". + /// + public InputAction @Slot7 => m_Wrapper.m_FaceExpressions_Slot7; + /// + /// Provides access to the underlying input action "FaceExpressions/Slot8". + /// + public InputAction @Slot8 => m_Wrapper.m_FaceExpressions_Slot8; + /// + /// Provides access to the underlying input action "FaceExpressions/Slot9". + /// + public InputAction @Slot9 => m_Wrapper.m_FaceExpressions_Slot9; + /// + /// Provides access to the underlying input action map instance. + /// + public InputActionMap Get() { return m_Wrapper.m_FaceExpressions; } + /// + public void Enable() { Get().Enable(); } + /// + public void Disable() { Get().Disable(); } + /// + public bool enabled => Get().enabled; + /// + /// Implicitly converts an to an instance. + /// + public static implicit operator InputActionMap(FaceExpressionsActions set) { return set.Get(); } + /// + /// Adds , and callbacks provided via on all input actions contained in this map. + /// + /// Callback instance. + /// + /// If is null or have already been added this method does nothing. + /// + /// + public void AddCallbacks(IFaceExpressionsActions instance) + { + if (instance == null || m_Wrapper.m_FaceExpressionsActionsCallbackInterfaces.Contains(instance)) return; + m_Wrapper.m_FaceExpressionsActionsCallbackInterfaces.Add(instance); + @Slot1.started += instance.OnSlot1; + @Slot1.performed += instance.OnSlot1; + @Slot1.canceled += instance.OnSlot1; + @Slot2.started += instance.OnSlot2; + @Slot2.performed += instance.OnSlot2; + @Slot2.canceled += instance.OnSlot2; + @Slot3.started += instance.OnSlot3; + @Slot3.performed += instance.OnSlot3; + @Slot3.canceled += instance.OnSlot3; + @Slot4.started += instance.OnSlot4; + @Slot4.performed += instance.OnSlot4; + @Slot4.canceled += instance.OnSlot4; + @Slot5.started += instance.OnSlot5; + @Slot5.performed += instance.OnSlot5; + @Slot5.canceled += instance.OnSlot5; + @Slot6.started += instance.OnSlot6; + @Slot6.performed += instance.OnSlot6; + @Slot6.canceled += instance.OnSlot6; + @Slot7.started += instance.OnSlot7; + @Slot7.performed += instance.OnSlot7; + @Slot7.canceled += instance.OnSlot7; + @Slot8.started += instance.OnSlot8; + @Slot8.performed += instance.OnSlot8; + @Slot8.canceled += instance.OnSlot8; + @Slot9.started += instance.OnSlot9; + @Slot9.performed += instance.OnSlot9; + @Slot9.canceled += instance.OnSlot9; + } + + /// + /// Removes , and callbacks provided via on all input actions contained in this map. + /// + /// + /// Calling this method when have not previously been registered has no side-effects. + /// + /// + private void UnregisterCallbacks(IFaceExpressionsActions instance) + { + @Slot1.started -= instance.OnSlot1; + @Slot1.performed -= instance.OnSlot1; + @Slot1.canceled -= instance.OnSlot1; + @Slot2.started -= instance.OnSlot2; + @Slot2.performed -= instance.OnSlot2; + @Slot2.canceled -= instance.OnSlot2; + @Slot3.started -= instance.OnSlot3; + @Slot3.performed -= instance.OnSlot3; + @Slot3.canceled -= instance.OnSlot3; + @Slot4.started -= instance.OnSlot4; + @Slot4.performed -= instance.OnSlot4; + @Slot4.canceled -= instance.OnSlot4; + @Slot5.started -= instance.OnSlot5; + @Slot5.performed -= instance.OnSlot5; + @Slot5.canceled -= instance.OnSlot5; + @Slot6.started -= instance.OnSlot6; + @Slot6.performed -= instance.OnSlot6; + @Slot6.canceled -= instance.OnSlot6; + @Slot7.started -= instance.OnSlot7; + @Slot7.performed -= instance.OnSlot7; + @Slot7.canceled -= instance.OnSlot7; + @Slot8.started -= instance.OnSlot8; + @Slot8.performed -= instance.OnSlot8; + @Slot8.canceled -= instance.OnSlot8; + @Slot9.started -= instance.OnSlot9; + @Slot9.performed -= instance.OnSlot9; + @Slot9.canceled -= instance.OnSlot9; + } + + /// + /// Unregisters and unregisters all input action callbacks via . + /// + /// + public void RemoveCallbacks(IFaceExpressionsActions instance) + { + if (m_Wrapper.m_FaceExpressionsActionsCallbackInterfaces.Remove(instance)) + UnregisterCallbacks(instance); + } + + /// + /// Replaces all existing callback instances and previously registered input action callbacks associated with them with callbacks provided via . + /// + /// + /// If is null, calling this method will only unregister all existing callbacks but not register any new callbacks. + /// + /// + /// + /// + public void SetCallbacks(IFaceExpressionsActions instance) + { + foreach (var item in m_Wrapper.m_FaceExpressionsActionsCallbackInterfaces) + UnregisterCallbacks(item); + m_Wrapper.m_FaceExpressionsActionsCallbackInterfaces.Clear(); + AddCallbacks(instance); + } + } + /// + /// Provides a new instance referencing this action map. + /// + public FaceExpressionsActions @FaceExpressions => new FaceExpressionsActions(this); private int m_DesktopSchemeIndex = -1; /// /// Provides access to the input control scheme. @@ -6922,4 +7504,75 @@ public interface IVoiceChatActions /// void OnTalk(InputAction.CallbackContext context); } + /// + /// Interface to implement callback methods for all input action callbacks associated with input actions defined by "FaceExpressions" which allows adding and removing callbacks. + /// + /// + /// + public interface IFaceExpressionsActions + { + /// + /// Method invoked when associated input action "Slot 1" is either , or . + /// + /// + /// + /// + void OnSlot1(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 2" is either , or . + /// + /// + /// + /// + void OnSlot2(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 3" is either , or . + /// + /// + /// + /// + void OnSlot3(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 4" is either , or . + /// + /// + /// + /// + void OnSlot4(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 5" is either , or . + /// + /// + /// + /// + void OnSlot5(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 6" is either , or . + /// + /// + /// + /// + void OnSlot6(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 7" is either , or . + /// + /// + /// + /// + void OnSlot7(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 8" is either , or . + /// + /// + /// + /// + void OnSlot8(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 9" is either , or . + /// + /// + /// + /// + void OnSlot9(InputAction.CallbackContext context); + } } diff --git a/Explorer/Assets/DCL/Input/UnityInputSystem/DCLInput.inputactions b/Explorer/Assets/DCL/Input/UnityInputSystem/DCLInput.inputactions index e845f5788f6..d7f0b838912 100644 --- a/Explorer/Assets/DCL/Input/UnityInputSystem/DCLInput.inputactions +++ b/Explorer/Assets/DCL/Input/UnityInputSystem/DCLInput.inputactions @@ -3841,6 +3841,392 @@ "isPartOfComposite": false } ] + }, + { + "name": "FaceExpressions", + "id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d", + "actions": [ + { + "name": "Slot 1", + "type": "Button", + "id": "fe100001-0000-4000-a000-000000000001", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Slot 2", + "type": "Button", + "id": "fe100001-0000-4000-a000-000000000002", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Slot 3", + "type": "Button", + "id": "fe100001-0000-4000-a000-000000000003", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Slot 4", + "type": "Button", + "id": "fe100001-0000-4000-a000-000000000004", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Slot 5", + "type": "Button", + "id": "fe100001-0000-4000-a000-000000000005", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Slot 6", + "type": "Button", + "id": "fe100001-0000-4000-a000-000000000006", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Slot 7", + "type": "Button", + "id": "fe100001-0000-4000-a000-000000000007", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Slot 8", + "type": "Button", + "id": "fe100001-0000-4000-a000-000000000008", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Slot 9", + "type": "Button", + "id": "fe100001-0000-4000-a000-000000000009", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "One Modifier", + "id": "fe200001-0000-4000-b000-000000000001", + "path": "OneModifier", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 1", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "modifier", + "id": "fe200001-0000-4000-b000-000000000002", + "path": "/y", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 1", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "binding", + "id": "fe200001-0000-4000-b000-000000000003", + "path": "/1", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 1", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "One Modifier", + "id": "fe200002-0000-4000-b000-000000000001", + "path": "OneModifier", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 2", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "modifier", + "id": "fe200002-0000-4000-b000-000000000002", + "path": "/y", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 2", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "binding", + "id": "fe200002-0000-4000-b000-000000000003", + "path": "/2", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 2", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "One Modifier", + "id": "fe200003-0000-4000-b000-000000000001", + "path": "OneModifier", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 3", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "modifier", + "id": "fe200003-0000-4000-b000-000000000002", + "path": "/y", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 3", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "binding", + "id": "fe200003-0000-4000-b000-000000000003", + "path": "/3", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 3", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "One Modifier", + "id": "fe200004-0000-4000-b000-000000000001", + "path": "OneModifier", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 4", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "modifier", + "id": "fe200004-0000-4000-b000-000000000002", + "path": "/y", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 4", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "binding", + "id": "fe200004-0000-4000-b000-000000000003", + "path": "/4", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 4", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "One Modifier", + "id": "fe200005-0000-4000-b000-000000000001", + "path": "OneModifier", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 5", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "modifier", + "id": "fe200005-0000-4000-b000-000000000002", + "path": "/y", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 5", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "binding", + "id": "fe200005-0000-4000-b000-000000000003", + "path": "/5", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 5", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "One Modifier", + "id": "fe200006-0000-4000-b000-000000000001", + "path": "OneModifier", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 6", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "modifier", + "id": "fe200006-0000-4000-b000-000000000002", + "path": "/y", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 6", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "binding", + "id": "fe200006-0000-4000-b000-000000000003", + "path": "/6", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 6", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "One Modifier", + "id": "fe200007-0000-4000-b000-000000000001", + "path": "OneModifier", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 7", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "modifier", + "id": "fe200007-0000-4000-b000-000000000002", + "path": "/y", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 7", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "binding", + "id": "fe200007-0000-4000-b000-000000000003", + "path": "/7", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 7", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "One Modifier", + "id": "fe200008-0000-4000-b000-000000000001", + "path": "OneModifier", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 8", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "modifier", + "id": "fe200008-0000-4000-b000-000000000002", + "path": "/y", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 8", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "binding", + "id": "fe200008-0000-4000-b000-000000000003", + "path": "/8", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 8", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "One Modifier", + "id": "fe200009-0000-4000-b000-000000000001", + "path": "OneModifier", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 9", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "modifier", + "id": "fe200009-0000-4000-b000-000000000002", + "path": "/y", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 9", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "binding", + "id": "fe200009-0000-4000-b000-000000000003", + "path": "/9", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 9", + "isComposite": false, + "isPartOfComposite": true + } + ] } ], "controlSchemes": [ From 5bbe089113c8f06e2a277007eccc6ebc41d222af Mon Sep 17 00:00:00 2001 From: Alejandro Jimenez Date: Tue, 5 May 2026 12:34:39 +0200 Subject: [PATCH 06/28] feat(avatar): add UpdateFaceExpressionInputSystem Y + 1-9 shortcut applies the matching expression to the local player's AvatarFaceComponent and mirrors indices into LocalPlayerFacialExpressionComponent so PlayerFacialExpressionNetSendSystem propagates the change. --- .../UpdateFaceExpressionInputSystem.cs | 125 ++++++++++++++++++ .../UpdateFaceExpressionInputSystem.cs.meta | 2 + 2 files changed, 127 insertions(+) create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFaceExpressionInputSystem.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFaceExpressionInputSystem.cs.meta diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFaceExpressionInputSystem.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFaceExpressionInputSystem.cs new file mode 100644 index 00000000000..a4422d583d6 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFaceExpressionInputSystem.cs @@ -0,0 +1,125 @@ +using Arch.Core; +using Arch.System; +using Arch.SystemGroups; +using DCL.AvatarRendering.AvatarShape.Components; +using DCL.Character.Components; +using DCL.Diagnostics; +using DCL.Input; +using DCL.Multiplayer.Movement; +using ECS.Abstract; +using ECS.LifeCycle.Components; +using System; +using UnityEngine.InputSystem; +using InputAction = UnityEngine.InputSystem.InputAction; + +namespace DCL.AvatarRendering.AvatarShape +{ + /// + /// Listens to the Y + 1-9 shortcut and applies the corresponding face expression to the local + /// player's avatar (mirrors the emote slot pattern). Writes both + /// (drives rendering) and + /// (drives the network send). + /// + [UpdateInGroup(typeof(InputGroup))] + [LogCategory(ReportCategory.AVATAR)] + public partial class UpdateFaceExpressionInputSystem : BaseUnityLoopSystem + { + private const int SLOT_COUNT = 9; + + private readonly AvatarFaceExpressionDefinition[] expressions; + private readonly DCLInput.FaceExpressionsActions faceExpressionsActions; + private readonly Action[] slotCallbacks = new Action[SLOT_COUNT]; + + // One-frame buffer for the input event. Set on the input thread by the slot callback, + // consumed in Update. Same shape as UpdateEmoteInputSystem.triggeredEmote. + private int pendingExpressionIndex = -1; + + internal UpdateFaceExpressionInputSystem(World world, AvatarFaceExpressionDefinition[] expressions) : base(world) + { + this.expressions = expressions; + faceExpressionsActions = DCLInput.Instance.FaceExpressions; + + InputActionMap actionMap = faceExpressionsActions.Get(); + + for (var i = 0; i < SLOT_COUNT; i++) + { + int expressionIndex = i; + slotCallbacks[i] = _ => pendingExpressionIndex = expressionIndex; + + try + { + InputAction action = actionMap.FindAction($"Slot {i + 1}"); + action.started += slotCallbacks[i]; + } + catch (Exception e) { ReportHub.LogException(e, GetReportData()); } + } + } + + protected override void OnDispose() + { + InputActionMap actionMap = faceExpressionsActions.Get(); + + for (var i = 0; i < SLOT_COUNT; i++) + { + try + { + InputAction action = actionMap.FindAction($"Slot {i + 1}"); + action.started -= slotCallbacks[i]; + } + catch (Exception e) { ReportHub.LogException(e, GetReportData()); } + } + } + + protected override void Update(float t) + { + // Ensure LocalPlayerFacialExpressionComponent exists before the apply query runs. + SetupNetworkExpressionComponentQuery(World); + + if (pendingExpressionIndex < 0) + return; + + // Out of range (no expression configured for this slot) — drop the input. + if (pendingExpressionIndex >= expressions.Length) + { + pendingExpressionIndex = -1; + return; + } + + ApplyExpressionToPlayerQuery(World, pendingExpressionIndex); + pendingExpressionIndex = -1; + } + + /// + /// Adds to the player entity as soon as + /// is available (i.e. after avatar load). Runs at most + /// once per player entity thanks to the [None] filter. + /// + [Query] + [All(typeof(PlayerComponent), typeof(AvatarFaceComponent))] + [None(typeof(LocalPlayerFacialExpressionComponent), typeof(DeleteEntityIntention))] + private void SetupNetworkExpressionComponent(in Entity entity) + { + World.Add(entity, new LocalPlayerFacialExpressionComponent()); + } + + [Query] + [All(typeof(PlayerComponent), typeof(AvatarFaceComponent))] + [None(typeof(DeleteEntityIntention))] + private void ApplyExpressionToPlayer( + [Data] int expressionIndex, + ref AvatarFaceComponent face, + ref LocalPlayerFacialExpressionComponent network) + { + AvatarFaceExpressionDefinition def = expressions[expressionIndex]; + + face.EyebrowsExpressionIndex = def.EyebrowsIndex; + face.EyesExpressionIndex = def.EyesIndex; + face.MouthExpressionIndex = def.MouthIndex; + face.IsDirty = true; + + network.EyebrowsIndex = (byte)def.EyebrowsIndex; + network.EyesIndex = (byte)def.EyesIndex; + network.MouthIndex = (byte)def.MouthIndex; + } + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFaceExpressionInputSystem.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFaceExpressionInputSystem.cs.meta new file mode 100644 index 00000000000..c9386c19361 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFaceExpressionInputSystem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ee524cb980161dd4d98e3164d05eedbb \ No newline at end of file From 8809b3e99a3b597843d8b1cc226f9318ac86c190 Mon Sep 17 00:00:00 2001 From: Alejandro Jimenez Date: Tue, 5 May 2026 13:06:01 +0200 Subject: [PATCH 07/28] feat(avatar): wire facial expression plugins + DI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AvatarPlugin loads AvatarFaceAnimationSettings + AvatarFaceExpressionConfig SOs and injects AvatarFacialExpressionSystem (null texture arrays for now — atlases come from wearables per ADR-317) and UpdateFaceExpressionInputSystem. MultiplayerMovementPlugin owns IFacialExpressionMessageBus, injects PlayerFacialExpressionNetSendSystem and RemoteFacialExpressionSystem. DynamicWorldContainer instantiates MultiplayerFacialExpressionMessageBus alongside the movement bus. RemoteFacialExpressionSystem made partial so the Arch source generator emits InjectToWorld. Added asmref so PlayerFacialExpressionNetSendSystem compiles in DCL.Plugins (which has Arch.SystemGroups). Default AvatarFaceAnimationSettings asset and Essentials addressable entry plus Global Plugins Settings.asset references for both SOs. --- .../AssetGroups/Essentials.asset | 5 ++++ .../RemoteFacialExpressionSystem.cs | 2 +- .../Global/Dynamic/DynamicWorldContainer.cs | 3 +++ ...ultiplayer.FacialExpression.Systems.asmref | 3 +++ ...layer.FacialExpression.Systems.asmref.meta | 7 ++++++ .../Global/AvatarFaceAnimationSettings.asset | 19 +++++++++++++++ .../AvatarFaceAnimationSettings.asset.meta | 8 +++++++ .../DCL/PluginSystem/Global/AvatarPlugin.cs | 23 +++++++++++++++++++ .../Global/Global Plugins Settings.asset | 18 ++++++++++++--- .../Global/MultiplayerMovementPlugin.cs | 13 ++++++++++- 10 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/DCL.Multiplayer.FacialExpression.Systems.asmref create mode 100644 Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/DCL.Multiplayer.FacialExpression.Systems.asmref.meta create mode 100644 Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceAnimationSettings.asset create mode 100644 Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceAnimationSettings.asset.meta diff --git a/Explorer/Assets/AddressableAssetsData/AssetGroups/Essentials.asset b/Explorer/Assets/AddressableAssetsData/AssetGroups/Essentials.asset index 1aa03aa942a..4fee673e5f6 100644 --- a/Explorer/Assets/AddressableAssetsData/AssetGroups/Essentials.asset +++ b/Explorer/Assets/AddressableAssetsData/AssetGroups/Essentials.asset @@ -170,6 +170,11 @@ MonoBehaviour: m_ReadOnly: 0 m_SerializedLabels: [] FlaggedDuringContentUpdateRestriction: 0 + - m_GUID: 69832a4fb177e7645af56a1f27d0dce2 + m_Address: Assets/DCL/PluginSystem/Global/AvatarFaceAnimationSettings.asset + m_ReadOnly: 0 + m_SerializedLabels: [] + FlaggedDuringContentUpdateRestriction: 0 - m_GUID: 6a252383173104e17acac54eb364afc4 m_Address: Assets/DCL/AvatarRendering/AvatarShape/Assets/PointAtMarker.prefab m_ReadOnly: 0 diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/RemoteFacialExpressionSystem.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/RemoteFacialExpressionSystem.cs index 9d409ab1098..3963df8f234 100644 --- a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/RemoteFacialExpressionSystem.cs +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/RemoteFacialExpressionSystem.cs @@ -27,7 +27,7 @@ namespace DCL.AvatarRendering.AvatarShape [UpdateInGroup(typeof(PresentationSystemGroup))] [UpdateAfter(typeof(RemotePlayersMovementSystem))] [LogCategory(ReportCategory.MULTIPLAYER_MOVEMENT)] - public class RemoteFacialExpressionSystem : BaseUnityLoopSystem + public partial class RemoteFacialExpressionSystem : BaseUnityLoopSystem { private readonly IReadOnlyEntityParticipantTable entityParticipantTable; private readonly IFacialExpressionMessageBus bus; diff --git a/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs b/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs index 4ca90216844..afedabdf77a 100644 --- a/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs +++ b/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs @@ -52,6 +52,7 @@ using DCL.Multiplayer.Connectivity; using DCL.Multiplayer.Deduplication; using DCL.Multiplayer.Emotes; +using DCL.Multiplayer.FacialExpression; using DCL.Multiplayer.HealthChecks; using DCL.Multiplayer.Movement; using DCL.Multiplayer.Movement.Systems; @@ -644,6 +645,7 @@ await MapRendererContainer var audioMixerVolumesController = new AudioMixerVolumesController(generalAudioMixer); var multiplayerMovementMessageBus = new MultiplayerMovementMessageBus(messagePipesHub, entityParticipantTable, globalWorld); + var multiplayerFacialExpressionMessageBus = new MultiplayerFacialExpressionMessageBus(messagePipesHub); var badgesAPIClient = new BadgesAPIClient(staticContainer.WebRequestsContainer.WebRequestController, bootstrapContainer.DecentralandUrlsSource); @@ -1033,6 +1035,7 @@ await MapRendererContainer new MultiplayerMovementPlugin( assetsProvisioner, multiplayerMovementMessageBus, + multiplayerFacialExpressionMessageBus, debugBuilder, remoteEntities, staticContainer.CharacterContainer.Transform, diff --git a/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/DCL.Multiplayer.FacialExpression.Systems.asmref b/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/DCL.Multiplayer.FacialExpression.Systems.asmref new file mode 100644 index 00000000000..b24e4ef9e3d --- /dev/null +++ b/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/DCL.Multiplayer.FacialExpression.Systems.asmref @@ -0,0 +1,3 @@ +{ + "reference": "GUID:fc4fd35fb877e904d8cedee73b2256f6" +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/DCL.Multiplayer.FacialExpression.Systems.asmref.meta b/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/DCL.Multiplayer.FacialExpression.Systems.asmref.meta new file mode 100644 index 00000000000..02793c0086c --- /dev/null +++ b/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/DCL.Multiplayer.FacialExpression.Systems.asmref.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b200aa6cda4095d43b6aae5f52bee231 +AssemblyDefinitionReferenceImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceAnimationSettings.asset b/Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceAnimationSettings.asset new file mode 100644 index 00000000000..6f2d3924b83 --- /dev/null +++ b/Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceAnimationSettings.asset @@ -0,0 +1,19 @@ +%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: 3fa44f695c71c9d44a49c7ddfbf82738, type: 3} + m_Name: AvatarFaceAnimationSettings + m_EditorClassIdentifier: + k__BackingField: 2 + k__BackingField: 8 + k__BackingField: 0.05 + k__BackingField: 0.08 + k__BackingField: 0.12 \ No newline at end of file diff --git a/Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceAnimationSettings.asset.meta b/Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceAnimationSettings.asset.meta new file mode 100644 index 00000000000..c75a85168c3 --- /dev/null +++ b/Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceAnimationSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 69832a4fb177e7645af56a1f27d0dce2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/PluginSystem/Global/AvatarPlugin.cs b/Explorer/Assets/DCL/PluginSystem/Global/AvatarPlugin.cs index a9643ffaa9a..3ab313d63f2 100644 --- a/Explorer/Assets/DCL/PluginSystem/Global/AvatarPlugin.cs +++ b/Explorer/Assets/DCL/PluginSystem/Global/AvatarPlugin.cs @@ -21,6 +21,7 @@ using System.Threading; using DCL.AvatarRendering; using DCL.AvatarRendering.AvatarShape; +using DCL.AvatarRendering.AvatarShape.Assets; using DCL.AvatarRendering.AvatarShape.Components; using DCL.AvatarRendering.AvatarShape.Helpers; using DCL.AvatarRendering.Loading.Assets; @@ -93,6 +94,9 @@ public class AvatarPlugin : IDCLGlobalPlugin private FacialFeaturesTextures[] facialFeaturesTextures; + private AvatarFaceAnimationSettings? faceAnimationSettings; + private AvatarFaceExpressionDefinition[] faceExpressions = Array.Empty(); + public AvatarPlugin( IComponentPoolsRegistry poolsRegistry, IAssetsProvisioner assetsProvisioner, @@ -152,6 +156,15 @@ public async UniTask InitializeAsync(AvatarShapeSettings settings, CancellationT transformPoolRegistry = componentPoolsRegistry.GetReferenceTypePool().EnsureNotNull("ReferenceTypePool of type Transform not found in the registry"); avatarRandomizerAsset = (await assetsProvisioner.ProvideMainAssetAsync(settings.AvatarRandomizerSettingsRef, ct)).Value; + if (settings.FaceAnimationSettings != null && !string.IsNullOrEmpty(settings.FaceAnimationSettings.AssetGUID)) + faceAnimationSettings = (await assetsProvisioner.ProvideMainAssetAsync(settings.FaceAnimationSettings, ct)).Value; + + if (settings.FaceExpressionConfig != null && !string.IsNullOrEmpty(settings.FaceExpressionConfig.AssetGUID)) + { + AvatarFaceExpressionConfig config = (await assetsProvisioner.ProvideMainAssetAsync(settings.FaceExpressionConfig, ct)).Value; + faceExpressions = config.Expressions ?? Array.Empty(); + } + debugContainerBuilder.TryAddWidget("Nametags") ?.AddToggleField("ShowNametags", _ => nametagsData.showNameTags = !nametagsData.showNameTags, nametagsData.showNameTags); } @@ -193,6 +206,12 @@ public void InjectToWorld(ref ArchSystemsWorldBuilder builder, NametagPlacementSystem.InjectToWorld(ref builder, nametagHolderPool, nametagsData); NameTagCleanUpSystem.InjectToWorld(ref builder, nametagsData, nametagHolderPool); + if (faceAnimationSettings != null) + { + AvatarFacialExpressionSystem.InjectToWorld(ref builder, faceAnimationSettings, eyebrowsTextureArray: null, eyeTextureArray: null, mouthPoseTextureArray: null); + UpdateFaceExpressionInputSystem.InjectToWorld(ref builder, faceExpressions); + } + //Debug scripts InstantiateRandomAvatarsSystem.InjectToWorld(ref builder, debugContainerBuilder, realmData, transformPoolRegistry, avatarRandomizerAsset); #if UNITY_EDITOR @@ -364,6 +383,10 @@ public class AvatarShapeSettings : IDCLPluginSettings public AssetReferenceT DefaultFemaleEyesTexture; public AssetReferenceT DefaultFemaleEyebrowsTexture; + [Header("Facial Expressions")] + public AssetReferenceT? FaceAnimationSettings; + public AssetReferenceT? FaceExpressionConfig; + [Serializable] public class NametagsDataRef : AssetReferenceT { diff --git a/Explorer/Assets/DCL/PluginSystem/Global/Global Plugins Settings.asset b/Explorer/Assets/DCL/PluginSystem/Global/Global Plugins Settings.asset index 098709837eb..d54f0dc4973 100644 --- a/Explorer/Assets/DCL/PluginSystem/Global/Global Plugins Settings.asset +++ b/Explorer/Assets/DCL/PluginSystem/Global/Global Plugins Settings.asset @@ -968,9 +968,21 @@ MonoBehaviour: m_EditorAssetChanged: 0 DefaultFemaleEyebrowsTexture: m_AssetGUID: eae766b15f997414794bfd4f17de5949 - m_SubObjectName: - m_SubObjectType: - m_SubObjectGUID: + m_SubObjectName: + m_SubObjectType: + m_SubObjectGUID: + m_EditorAssetChanged: 0 + FaceAnimationSettings: + m_AssetGUID: 69832a4fb177e7645af56a1f27d0dce2 + m_SubObjectName: + m_SubObjectType: + m_SubObjectGUID: + m_EditorAssetChanged: 0 + FaceExpressionConfig: + m_AssetGUID: f13fd0befee6d48479806b957b3ca94f + m_SubObjectName: + m_SubObjectType: + m_SubObjectGUID: m_EditorAssetChanged: 0 - rid: 6144113899072913496 type: {class: SkyboxPlugin/SkyboxTimeSettings, ns: DCL.SkyBox, asm: DCL.Plugins} diff --git a/Explorer/Assets/DCL/PluginSystem/Global/MultiplayerMovementPlugin.cs b/Explorer/Assets/DCL/PluginSystem/Global/MultiplayerMovementPlugin.cs index df1a57ab360..96d602b7885 100644 --- a/Explorer/Assets/DCL/PluginSystem/Global/MultiplayerMovementPlugin.cs +++ b/Explorer/Assets/DCL/PluginSystem/Global/MultiplayerMovementPlugin.cs @@ -4,6 +4,9 @@ using DCL.AssetsProvision; using DCL.DebugUtilities; using DCL.FeatureFlags; +using DCL.AvatarRendering.AvatarShape; +using DCL.Multiplayer.FacialExpression; +using DCL.Multiplayer.FacialExpression.Systems; using DCL.Multiplayer.Movement.Settings; using DCL.Multiplayer.Movement.Systems; using DCL.Multiplayer.Profiles.Entities; @@ -12,6 +15,7 @@ using DCL.Platforms; using ECS; using Global.AppArgs; +using System; using System.Threading; using Utility; using PlayerMovementNetSendSystem = DCL.Multiplayer.Movement.Systems.PlayerMovementNetSendSystem; @@ -23,6 +27,7 @@ public class MultiplayerMovementPlugin : IDCLGlobalPlugin builder, RemotePlayerAnimationSystem.InjectToWorld(ref builder, settings.ExtrapolationSettings, settings); CleanUpRemoteMotionSystem.InjectToWorld(ref builder); MultiplayerMovementDebugSystem.InjectToWorld(ref builder, arguments.PlayerEntity, realmData, debugBuilder, remoteEntities, playerTransform, debugSettings, settings, entityParticipantTable, remoteMetadata); + + PlayerFacialExpressionNetSendSystem.InjectToWorld(ref builder, facialExpressionMessageBus); + RemoteFacialExpressionSystem.InjectToWorld(ref builder, entityParticipantTable, facialExpressionMessageBus); } } } From 66920c792705dbbad1237e8b79f977940b0b8644 Mon Sep 17 00:00:00 2001 From: Romina Marchetti Date: Mon, 11 May 2026 15:19:56 +0100 Subject: [PATCH 08/28] Updates textures --- Explorer/Assets/Textures/Emotes/EmotesIcon.png | 3 +++ .../Emotes/{EmptyIcon.png.meta => EmotesIcon.png.meta} | 6 +++--- Explorer/Assets/Textures/Emotes/EmptyIcon.png | 3 --- Explorer/Assets/Textures/Emotes/HoverOutline.png | 4 ++-- Explorer/Assets/Textures/Emotes/HoverOutline.png.meta | 2 +- Explorer/Assets/Textures/Emotes/RarityBackgrounds/Base.png | 4 ++-- .../Assets/Textures/Emotes/RarityBackgrounds/Common.png | 4 ++-- Explorer/Assets/Textures/Emotes/RarityBackgrounds/Empty.png | 4 ++-- Explorer/Assets/Textures/Emotes/RarityBackgrounds/Epic.png | 4 ++-- .../Assets/Textures/Emotes/RarityBackgrounds/Exotic.png | 4 ++-- .../Assets/Textures/Emotes/RarityBackgrounds/Legendary.png | 4 ++-- .../Assets/Textures/Emotes/RarityBackgrounds/Mythic.png | 4 ++-- Explorer/Assets/Textures/Emotes/RarityBackgrounds/Rare.png | 4 ++-- .../Assets/Textures/Emotes/RarityBackgrounds/Uncommon.png | 4 ++-- .../Assets/Textures/Emotes/RarityBackgrounds/Unique.png | 4 ++-- 15 files changed, 29 insertions(+), 29 deletions(-) create mode 100644 Explorer/Assets/Textures/Emotes/EmotesIcon.png rename Explorer/Assets/Textures/Emotes/{EmptyIcon.png.meta => EmotesIcon.png.meta} (96%) delete mode 100755 Explorer/Assets/Textures/Emotes/EmptyIcon.png mode change 100755 => 100644 Explorer/Assets/Textures/Emotes/RarityBackgrounds/Base.png mode change 100755 => 100644 Explorer/Assets/Textures/Emotes/RarityBackgrounds/Common.png mode change 100755 => 100644 Explorer/Assets/Textures/Emotes/RarityBackgrounds/Empty.png mode change 100755 => 100644 Explorer/Assets/Textures/Emotes/RarityBackgrounds/Epic.png mode change 100755 => 100644 Explorer/Assets/Textures/Emotes/RarityBackgrounds/Exotic.png mode change 100755 => 100644 Explorer/Assets/Textures/Emotes/RarityBackgrounds/Legendary.png mode change 100755 => 100644 Explorer/Assets/Textures/Emotes/RarityBackgrounds/Mythic.png mode change 100755 => 100644 Explorer/Assets/Textures/Emotes/RarityBackgrounds/Rare.png mode change 100755 => 100644 Explorer/Assets/Textures/Emotes/RarityBackgrounds/Uncommon.png mode change 100755 => 100644 Explorer/Assets/Textures/Emotes/RarityBackgrounds/Unique.png diff --git a/Explorer/Assets/Textures/Emotes/EmotesIcon.png b/Explorer/Assets/Textures/Emotes/EmotesIcon.png new file mode 100644 index 00000000000..6fb0d5e9113 --- /dev/null +++ b/Explorer/Assets/Textures/Emotes/EmotesIcon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7fe9d03a5f00e64b95ce0b5c631c2df8d0f626e37fe4e7e6354636d0a3fddd22 +size 457 diff --git a/Explorer/Assets/Textures/Emotes/EmptyIcon.png.meta b/Explorer/Assets/Textures/Emotes/EmotesIcon.png.meta similarity index 96% rename from Explorer/Assets/Textures/Emotes/EmptyIcon.png.meta rename to Explorer/Assets/Textures/Emotes/EmotesIcon.png.meta index 1f3e1f76fac..e61fb5bc1dc 100644 --- a/Explorer/Assets/Textures/Emotes/EmptyIcon.png.meta +++ b/Explorer/Assets/Textures/Emotes/EmotesIcon.png.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 0dcdab27d9530440f8dd0973134f8717 +guid: 9349f1fea510d448cbac392ca619d66e TextureImporter: internalIDToNameTable: [] externalObjects: {} @@ -45,12 +45,12 @@ TextureImporter: compressionQuality: 50 spriteMode: 1 spriteExtrude: 1 - spriteMeshType: 1 + spriteMeshType: 0 alignment: 0 spritePivot: {x: 0.5, y: 0.5} spritePixelsToUnits: 100 spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 + spriteGenerateFallbackPhysicsShape: 0 alphaUsage: 1 alphaIsTransparency: 1 spriteTessellationDetail: -1 diff --git a/Explorer/Assets/Textures/Emotes/EmptyIcon.png b/Explorer/Assets/Textures/Emotes/EmptyIcon.png deleted file mode 100755 index ce0ff0fdd1f..00000000000 --- a/Explorer/Assets/Textures/Emotes/EmptyIcon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09d5066b4b63e3df88cad6eeb9fa60f15ade140663761efee6cca332b72f179d -size 2983 diff --git a/Explorer/Assets/Textures/Emotes/HoverOutline.png b/Explorer/Assets/Textures/Emotes/HoverOutline.png index afed2ffce2d..c755021c579 100644 --- a/Explorer/Assets/Textures/Emotes/HoverOutline.png +++ b/Explorer/Assets/Textures/Emotes/HoverOutline.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:208ced2beede27a4834548d777c5d9865ede2f8edf8af898e2e08df5524fca08 -size 11975 +oid sha256:5e14d4397455174c8114ab5aba98610bc67d6877b4b091018f917d3d89488652 +size 6791 diff --git a/Explorer/Assets/Textures/Emotes/HoverOutline.png.meta b/Explorer/Assets/Textures/Emotes/HoverOutline.png.meta index 45254de4c2d..31e02c6f930 100644 --- a/Explorer/Assets/Textures/Emotes/HoverOutline.png.meta +++ b/Explorer/Assets/Textures/Emotes/HoverOutline.png.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d6787e389abeb437ead1ebad0a81a461 +guid: 2092305e118884e81bb75ffbb7109788 TextureImporter: internalIDToNameTable: [] externalObjects: {} diff --git a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Base.png b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Base.png old mode 100755 new mode 100644 index 62a1648fab1..0c4862be44b --- a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Base.png +++ b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Base.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:47ea93d98473b84671d2b2e3a4aacb74421725a4e5d454e3ee1c780809e95ada -size 19102 +oid sha256:2a3b1287920423c90cc19fb04852b9392310dfe81975fbae7eec5251ea24785f +size 28406 diff --git a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Common.png b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Common.png old mode 100755 new mode 100644 index cd050b3df57..8a67ca9ff58 --- a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Common.png +++ b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Common.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:543fb2d19e5f54970db07aec03e11ca8f44efefe92bc36100fa0ab9d129af23b -size 14925 +oid sha256:6e0b8a7d225bb37cf9dbb164831fcad7403c3f7f62c6520787d9ef5d379d00e4 +size 24645 diff --git a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Empty.png b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Empty.png old mode 100755 new mode 100644 index 59a1eac8a25..5e7405736e7 --- a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Empty.png +++ b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Empty.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dbb6339b77ec763fcaa3349bf95ee562ca29cbc0d9bb0ab390575e94761a2c5e -size 1906 +oid sha256:a3eeed5aacdeba3f455c30a6a4b586e4e8e22bd8309f8509cd61620d1f4be59a +size 1857 diff --git a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Epic.png b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Epic.png old mode 100755 new mode 100644 index 7d70f02a032..87a3220b788 --- a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Epic.png +++ b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Epic.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0c799fd6b25571d407e92c386596961e372708dc0abd0644e8eb7afeb32a4b5b -size 13451 +oid sha256:4e58052c6e06351d9bbd4f58d59d3290118c40acb05aa6a4e22a6f5cf9d8e66c +size 22651 diff --git a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Exotic.png b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Exotic.png old mode 100755 new mode 100644 index 350cfc04dda..10668f34eaf --- a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Exotic.png +++ b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Exotic.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e4f6a0371dbdc598bfe8499127e81ed71d06633f680e039143596a2c0e328574 -size 18462 +oid sha256:140c2accf901e6d83690479689251d7c70106b48caffab5ede414bf21f7745dd +size 30215 diff --git a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Legendary.png b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Legendary.png old mode 100755 new mode 100644 index 81abc1c23e3..45fb1322bed --- a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Legendary.png +++ b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Legendary.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3aa85c60d21b35933b669489c17e711d3dbf4b584ff67463aff939a31be947eb -size 18678 +oid sha256:aa1cbca7701402b57ba05325184963607e7db0d4d543f7b0f698f20a6acae822 +size 23840 diff --git a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Mythic.png b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Mythic.png old mode 100755 new mode 100644 index 3173fa6646f..8e3356a9888 --- a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Mythic.png +++ b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Mythic.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:649ce1ea9fcb1c3ac5015d7ce3c53b6ef0346e928afa8a649ceea05a57b59164 -size 13639 +oid sha256:2b93797dcf054032e7eecd60edc8ed87dd71e0216f5b7c3cd8105b838ef4e7af +size 21478 diff --git a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Rare.png b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Rare.png old mode 100755 new mode 100644 index 4c792885157..8027e3387f9 --- a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Rare.png +++ b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Rare.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a83ce0340f8a2eae8081134bee146128b8d0d9344d9b06987ef5b832a0a729ae -size 14552 +oid sha256:9dfd1ae00fea02845b2683b855c4b3f79d832a096f6b3d8d2c4d082744cb0e84 +size 22371 diff --git a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Uncommon.png b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Uncommon.png old mode 100755 new mode 100644 index b8130b80b93..74b20a5a0e6 --- a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Uncommon.png +++ b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Uncommon.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5820ebcc705a35c3e84e4de316c1a4b91d2f38132635cf004b11c8766c9f22ae -size 13736 +oid sha256:8cc49bd67a567d2f4f7a1481155e1e94c932b8a844120fab7b4e6761f54397d1 +size 21735 diff --git a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Unique.png b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Unique.png old mode 100755 new mode 100644 index de5eaa57996..6f656b9f200 --- a/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Unique.png +++ b/Explorer/Assets/Textures/Emotes/RarityBackgrounds/Unique.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4f51a704ff061a7025c576dce0a287541380d56641c4fb166e7e549578e38d99 -size 21983 +oid sha256:08fde4caa0c3cbb90880b1fdd631aca5d64789bd5a70299ad2ac2ed048036ca9 +size 32985 From 21766f3f5aea4aa35c1660b06bfec932d1167cac Mon Sep 17 00:00:00 2001 From: Romina Marchetti Date: Mon, 11 May 2026 15:20:02 +0100 Subject: [PATCH 09/28] Update EmoteSlot.prefab --- .../DCL/EmotesWheel/Assets/EmoteSlot.prefab | 111 +++++++++++++++--- 1 file changed, 94 insertions(+), 17 deletions(-) diff --git a/Explorer/Assets/DCL/EmotesWheel/Assets/EmoteSlot.prefab b/Explorer/Assets/DCL/EmotesWheel/Assets/EmoteSlot.prefab index 6f9b54b6b68..ae32381e514 100644 --- a/Explorer/Assets/DCL/EmotesWheel/Assets/EmoteSlot.prefab +++ b/Explorer/Assets/DCL/EmotesWheel/Assets/EmoteSlot.prefab @@ -34,8 +34,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 7} - m_SizeDelta: {x: 32, y: 32} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 174, y: 160} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &69245956534039968 CanvasRenderer: @@ -58,14 +58,89 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.8117647, g: 0.8039216, b: 0.83137256, a: 1} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 0dcdab27d9530440f8dd0973134f8717, type: 3} + m_Sprite: {fileID: 21300000, guid: 3a3dee0180f4b47859cca03776a00e7c, type: 3} + m_Type: 0 + 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 &1923248890120471536 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3331880382409646134} + - component: {fileID: 2249465867215692124} + - component: {fileID: 8829078566679261275} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3331880382409646134 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1923248890120471536} + m_LocalRotation: {x: 0, y: 0, z: 0.10452846, w: 0.9945219} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 8974564133226285288} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 12} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 4.2, y: -18.2} + m_SizeDelta: {x: 18, y: 18} + m_Pivot: {x: 0, y: 1} +--- !u!222 &2249465867215692124 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1923248890120471536} + m_CullTransparentMesh: 1 +--- !u!114 &8829078566679261275 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1923248890120471536} + 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: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 9349f1fea510d448cbac392ca619d66e, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -110,7 +185,7 @@ RectTransform: m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 0, y: 7} - m_SizeDelta: {x: 50, y: 50} + m_SizeDelta: {x: 90, y: 90} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &8209566919986367981 CanvasRenderer: @@ -184,8 +259,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} m_AnchorMax: {x: 0.5, y: 0} - m_AnchoredPosition: {x: 0, y: 6.836853} - m_SizeDelta: {x: 15.6108, y: 15.6108} + m_AnchoredPosition: {x: 0, y: 8} + m_SizeDelta: {x: 20, y: 20} m_Pivot: {x: 0.5, y: 0} --- !u!222 &3925924027178008141 CanvasRenderer: @@ -242,8 +317,8 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 14 - m_fontSizeBase: 14 + m_fontSize: 18 + m_fontSizeBase: 18 m_fontWeight: 400 m_enableAutoSizing: 0 m_fontSizeMin: 10 @@ -253,6 +328,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -320,8 +396,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0.0707, y: -1.0678} - m_SizeDelta: {x: 112, y: 105} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 180, y: 168} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &6732855126494316192 CanvasRenderer: @@ -351,7 +427,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: d6787e389abeb437ead1ebad0a81a461, type: 3} + m_Sprite: {fileID: 21300000, guid: 2092305e118884e81bb75ffbb7109788, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -396,8 +472,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: -1.0469} - m_SizeDelta: {x: 111, y: 103} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 174, y: 160} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &6807344510761186898 CanvasRenderer: @@ -513,6 +589,7 @@ RectTransform: - {fileID: 5343966063347327097} - {fileID: 677941972702109446} - {fileID: 5294823707738111947} + - {fileID: 3331880382409646134} - {fileID: 4063225283202921380} - {fileID: 1176605725860819126} m_Father: {fileID: 1895304305689352378} @@ -520,7 +597,7 @@ RectTransform: m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 100, y: 100} + m_SizeDelta: {x: 174, y: 160} m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &8978849373333944373 GameObject: @@ -650,11 +727,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} propertyPath: m_SizeDelta.x - value: 40 + value: 50 objectReference: {fileID: 0} - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} propertyPath: m_SizeDelta.y - value: 40 + value: 50 objectReference: {fileID: 0} - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} propertyPath: m_LocalPosition.x From 5f711331292986526640db184208b943e5f2e80d Mon Sep 17 00:00:00 2001 From: Romina Marchetti Date: Mon, 11 May 2026 15:20:05 +0100 Subject: [PATCH 10/28] Update EmotesWheelHUD.prefab --- .../EmotesWheel/Assets/EmotesWheelHUD.prefab | 701 ++++++++++-------- 1 file changed, 396 insertions(+), 305 deletions(-) diff --git a/Explorer/Assets/DCL/EmotesWheel/Assets/EmotesWheelHUD.prefab b/Explorer/Assets/DCL/EmotesWheel/Assets/EmotesWheelHUD.prefab index b2fd7a5feca..a5837cd7ba0 100644 --- a/Explorer/Assets/DCL/EmotesWheel/Assets/EmotesWheelHUD.prefab +++ b/Explorer/Assets/DCL/EmotesWheel/Assets/EmotesWheelHUD.prefab @@ -34,8 +34,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: -43.872906} - m_SizeDelta: {x: 156, y: 26.373} + m_AnchoredPosition: {x: 0, y: -50} + m_SizeDelta: {x: 190, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &3738596849537230179 CanvasRenderer: @@ -66,7 +66,7 @@ MonoBehaviour: m_PersistentCalls: m_Calls: [] m_text: Hold <#fcfcfc>[b+num] to run an emote while the wheel is - closed + closed. m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 35aa85d68d15435418848a03a2db81ec, type: 2} m_sharedMaterial: {fileID: 1701868249614554837, guid: 35aa85d68d15435418848a03a2db81ec, type: 2} @@ -75,8 +75,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4293782508 - m_fontColor: {r: 0.9254902, g: 0.92156863, b: 0.92941177, a: 1} + rgba: 4292136399 + m_fontColor: {r: 0.8117647, g: 0.8039216, b: 0.83137256, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -93,8 +93,8 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 10 - m_fontSizeBase: 10 + m_fontSize: 12 + m_fontSizeBase: 12 m_fontWeight: 400 m_enableAutoSizing: 0 m_fontSizeMin: 10 @@ -104,6 +104,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -167,13 +168,15 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] + m_Children: + - {fileID: 186355610268972269} + - {fileID: 7706739768243273297} m_Father: {fileID: 3368308072246989936} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 1.0523955} - m_SizeDelta: {x: 120, y: 124.4} + m_AnchoredPosition: {x: 0, y: -6} + m_SizeDelta: {x: 80, y: 32} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &374315793872558327 CanvasRenderer: @@ -196,14 +199,14 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.29803923} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 0} + m_Sprite: {fileID: 21300000, guid: 1dcae7b3183f24eb39310ae8e4c092a5, type: 3} m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 @@ -212,7 +215,7 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 + m_PixelsPerUnitMultiplier: 3 --- !u!114 &1341166584425063779 MonoBehaviour: m_ObjectHideFlags: 0 @@ -234,13 +237,13 @@ MonoBehaviour: m_SelectOnRight: {fileID: 0} m_Transition: 1 m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_NormalColor: {r: 1, g: 1, b: 1, a: 0.019607844} + m_HighlightedColor: {r: 1, g: 1, b: 1, a: 0.050980393} + m_PressedColor: {r: 1, g: 1, b: 1, a: 0.019607844} + m_SelectedColor: {r: 1, g: 1, b: 1, a: 0.019607844} + m_DisabledColor: {r: 1, g: 1, b: 1, a: 0.019607844} m_ColorMultiplier: 1 - m_FadeDuration: 0.1 + m_FadeDuration: 0 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -253,146 +256,10 @@ MonoBehaviour: m_SelectedTrigger: Selected m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 50054618743786208} + m_TargetGraphic: {fileID: 3021313394658728330} m_OnClick: m_PersistentCalls: m_Calls: [] ---- !u!1 &1910573828672085254 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7155408817035108562} - - component: {fileID: 9030177804243959839} - - component: {fileID: 8296175027738707069} - m_Layer: 5 - m_Name: Cutomise - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &7155408817035108562 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1910573828672085254} - 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_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 3368308072246989936} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: -8.47291} - m_SizeDelta: {x: 150, y: 16} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &9030177804243959839 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1910573828672085254} - m_CullTransparentMesh: 0 ---- !u!114 &8296175027738707069 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1910573828672085254} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: Customise <#fcfcfc>[E] - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 35aa85d68d15435418848a03a2db81ec, type: 2} - m_sharedMaterial: {fileID: 1701868249614554837, guid: 35aa85d68d15435418848a03a2db81ec, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4293782508 - m_fontColor: {r: 0.9254902, g: 0.92156863, b: 0.92941177, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 10 - m_fontSizeBase: 10 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 10 - m_fontSizeMax: 12 - m_fontStyle: 0 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_TextWrappingMode: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_EmojiFallbackSupport: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 1 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} --- !u!1 &2730020739912452495 GameObject: m_ObjectHideFlags: 0 @@ -427,8 +294,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 48.1} - m_SizeDelta: {x: 118, y: 40} + m_AnchoredPosition: {x: 0, y: 60} + m_SizeDelta: {x: 240, y: 70} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &5735411371286715404 CanvasRenderer: @@ -485,17 +352,18 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 14 + m_fontSize: 18 m_fontSizeBase: 18 m_fontWeight: 400 m_enableAutoSizing: 1 m_fontSizeMin: 10 - m_fontSizeMax: 14 + m_fontSizeMax: 18 m_fontStyle: 0 m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 + m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -564,6 +432,7 @@ RectTransform: m_LocalScale: {x: 0, y: 0, z: 0} m_ConstrainProportionsScale: 0 m_Children: + - {fileID: 2913921208301803433} - {fileID: 3368308072246989936} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -623,6 +492,7 @@ Canvas: m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 m_VertexColorAlwaysGammaSpace: 0 + m_UseReflectionProbes: 0 m_AdditionalShaderChannelsFlag: 25 m_UpdateRectTransformForStandalone: 0 m_SortingLayerID: 0 @@ -668,7 +538,7 @@ MonoBehaviour: m_UiScaleMode: 1 m_ReferencePixelsPerUnit: 100 m_ScaleFactor: 1 - m_ReferenceResolution: {x: 1536, y: 864} + m_ReferenceResolution: {x: 1920, y: 1080} m_ScreenMatchMode: 0 m_MatchWidthOrHeight: 0 m_PhysicalUnit: 3 @@ -710,6 +580,81 @@ CanvasGroup: m_Interactable: 1 m_BlocksRaycasts: 1 m_IgnoreParentGroups: 0 +--- !u!1 &3247684323739948405 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2913921208301803433} + - component: {fileID: 4745836198485645779} + - component: {fileID: 7937820618774625464} + m_Layer: 5 + m_Name: Delete + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &2913921208301803433 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3247684323739948405} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7955344795505032275} + 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 &4745836198485645779 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3247684323739948405} + m_CullTransparentMesh: 1 +--- !u!114 &7937820618774625464 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3247684323739948405} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: dba8824b6fe72463daad7bbc095f895e, type: 3} + m_Type: 0 + 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 &3679844280292778605 GameObject: m_ObjectHideFlags: 0 @@ -745,7 +690,7 @@ RectTransform: m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 400, y: 400} + m_SizeDelta: {x: 680, y: 680} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &5950188987537430702 CanvasRenderer: @@ -820,7 +765,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -18, y: -18} + m_SizeDelta: {x: -24, y: -24} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &6428647394411284262 CanvasRenderer: @@ -850,7 +795,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: a4df2165befde144db1abdaf69cece34, type: 3} + m_Sprite: {fileID: 21300000, guid: f49bfce399a8c41568bf017a951a357a, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -890,12 +835,12 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 1 m_Children: [] - m_Father: {fileID: 3368308072246989936} + m_Father: {fileID: 6092354033751835054} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 6.9270954} - m_SizeDelta: {x: 164, y: 17.4034} + 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 &4081166362944202792 CanvasRenderer: @@ -925,7 +870,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Emotes + m_text: Edit <#716B7C>[E] m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 96ae0a2159a39234f858ea23bdcc74ad, type: 2} m_sharedMaterial: {fileID: 735423033564544980, guid: 96ae0a2159a39234f858ea23bdcc74ad, type: 2} @@ -963,6 +908,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -1034,8 +980,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 166.7, y: 147} - m_SizeDelta: {x: 28, y: 28} + m_AnchoredPosition: {x: 300, y: 226} + m_SizeDelta: {x: 36, y: 36} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &5505085621591519339 CanvasRenderer: @@ -1074,7 +1020,7 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 3 + m_PixelsPerUnitMultiplier: 2.5 --- !u!114 &8782135904965761850 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1191,8 +1137,6 @@ RectTransform: - {fileID: 2445375703582184909} - {fileID: 2707180414594536588} - {fileID: 7001501268930964302} - - {fileID: 7706739768243273297} - - {fileID: 7155408817035108562} - {fileID: 4606384253447135439} - {fileID: 6092354033751835054} - {fileID: 6380930832859347887} @@ -1294,6 +1238,81 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: [] +--- !u!1 &8969425724256707062 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 186355610268972269} + - component: {fileID: 2114752918178648863} + - component: {fileID: 3021313394658728330} + m_Layer: 5 + m_Name: Container + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &186355610268972269 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8969425724256707062} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6092354033751835054} + 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 &2114752918178648863 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8969425724256707062} + m_CullTransparentMesh: 1 +--- !u!114 &3021313394658728330 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8969425724256707062} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 12dd1efc4e826764f9b02be515a9a033, type: 3} + 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: 3 --- !u!1001 &991050409646404535 PrefabInstance: m_ObjectHideFlags: 0 @@ -1306,6 +1325,14 @@ PrefabInstance: propertyPath: m_LocalRotation.w value: 1 objectReference: {fileID: 0} + - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.z value: 0 @@ -1316,7 +1343,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 7 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z @@ -1352,11 +1379,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.x - value: 124.3549 + value: 174 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.y - value: 114.3263 + value: 160 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalPosition.x @@ -1388,11 +1415,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: 1.8051 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: -145.08679 + value: -236.2 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -1517,23 +1544,31 @@ PrefabInstance: m_Modifications: - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.w - value: 0.58778536 + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} + propertyPath: m_LocalRotation.y + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.z - value: -0.80901694 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: 0.000013589859 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 7.000005 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z - value: -108 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1072704683713788848, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_text @@ -1573,11 +1608,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.x - value: 124.3549 + value: 174 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.y - value: 114.3264 + value: 160 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalPosition.x @@ -1593,7 +1628,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.w - value: -0.59119856 + value: -0.5877851 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.x @@ -1601,19 +1636,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.z - value: -0.8065261 + value: -0.8090171 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: -137.49246 + value: -222.5 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: -45.60291 + value: -72.7 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -1625,7 +1660,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z - value: -252.48401 + value: -252 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_ConstrainProportionsScale @@ -1649,11 +1684,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4063225283202921380, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: -3 + value: -6 objectReference: {fileID: 0} - target: {fileID: 4063225283202921380, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 23 + value: 20 objectReference: {fileID: 0} - target: {fileID: 4063225283202921380, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z @@ -1738,23 +1773,31 @@ PrefabInstance: m_Modifications: - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.w - value: 0.30901697 + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} + propertyPath: m_LocalRotation.y + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.z - value: -0.95105654 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: -0.00003194809 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 6.999992 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z - value: -144 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1072704683713788848, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_text @@ -1786,11 +1829,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.x - value: 124.3549 + value: 174 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.y - value: 114.3263 + value: 160 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalPosition.x @@ -1822,11 +1865,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: -84.140175 + value: -138 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: -118.31043 + value: -191.7 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -1882,11 +1925,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: -0.00003194809 + value: -3 objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 6.999992 + value: 9 objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z @@ -1951,31 +1994,31 @@ PrefabInstance: m_Modifications: - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.w - value: 0.9539239 + value: 1 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.x - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.z - value: -0.3000489 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: 0.000019550323 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 6.9999967 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z - value: -34.921 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1072704683713788848, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_text @@ -2015,11 +2058,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.x - value: 124.3549 + value: 174 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.y - value: 114.3263 + value: 160 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalPosition.x @@ -2035,7 +2078,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.w - value: -0.9528228 + value: -0.95105654 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.x @@ -2043,19 +2086,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.z - value: -0.30352724 + value: -0.30901706 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: -87.249084 + value: -138 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 117.16163 + value: 190 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -2067,7 +2110,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z - value: -324.661 + value: -324 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_ConstrainProportionsScale @@ -2091,11 +2134,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4063225283202921380, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: -3.5 + value: -4 objectReference: {fileID: 0} - target: {fileID: 4063225283202921380, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 13.4 + value: 9 objectReference: {fileID: 0} - target: {fileID: 4063225283202921380, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z @@ -2103,19 +2146,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.w - value: 0.9539239 + value: 0.95105654 objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.x - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.z - value: -0.3000489 + value: -0.3090171 objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x @@ -2127,7 +2170,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z - value: -34.921 + value: -36 objectReference: {fileID: 0} - target: {fileID: 8978849373333944373, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_Name @@ -2188,23 +2231,31 @@ PrefabInstance: m_Modifications: - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.w - value: 0.95105654 + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} + propertyPath: m_LocalRotation.y + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.z - value: 0.309017 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: 0.0000054836273 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 7.000017 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z - value: 36 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1072704683713788848, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_text @@ -2244,11 +2295,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.x - value: 124.3549 + value: 174 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.y - value: 114.3263 + value: 160 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalPosition.x @@ -2264,27 +2315,27 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.w - value: 0.94928616 + value: 0.95105654 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.x - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.z - value: -0.3144136 + value: -0.3090171 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: 85.09822 + value: 137.5 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 119.167366 + value: 191.2 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -2296,7 +2347,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z - value: -36.651 + value: -36 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_ConstrainProportionsScale @@ -2320,7 +2371,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4063225283202921380, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: 6.7 + value: 7 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 74f861e4b826444a7836daeea35442db, type: 3} + propertyPath: m_AnchoredPosition.y + value: 10 objectReference: {fileID: 0} - target: {fileID: 4063225283202921380, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z @@ -2350,6 +2405,10 @@ PrefabInstance: propertyPath: m_Name value: Slot2 objectReference: {fileID: 0} + - target: {fileID: 8978849373333944373, guid: 74f861e4b826444a7836daeea35442db, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -2425,11 +2484,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.x - value: 124.3549 + value: 174 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.y - value: 114.3263 + value: 160 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalPosition.x @@ -2461,11 +2520,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: -2.0057983 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 144.94092 + value: 236 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -2546,31 +2605,31 @@ PrefabInstance: m_Modifications: - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.w - value: 0.8149515 + value: 1 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.x - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.z - value: -0.57952935 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: 0.00000166893 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 7.000007 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z - value: -70.835 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1072704683713788848, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_text @@ -2610,11 +2669,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.x - value: 124.3549 + value: 174 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.y - value: 114.3264 + value: 160 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalPosition.x @@ -2630,7 +2689,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.w - value: -0.8151489 + value: -0.8090169 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.x @@ -2638,19 +2697,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.z - value: -0.5792515 + value: -0.5877853 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: -139.4982 + value: -221.5 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 44.153255 + value: 72.3 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -2662,7 +2721,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z - value: -289.204 + value: -288 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_ConstrainProportionsScale @@ -2686,11 +2745,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4063225283202921380, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: -5.4 + value: -5 objectReference: {fileID: 0} - target: {fileID: 4063225283202921380, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 17.2 + value: 14 objectReference: {fileID: 0} - target: {fileID: 4063225283202921380, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z @@ -2698,19 +2757,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.w - value: 0.8149515 + value: 0.809017 objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.x - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.z - value: -0.57952935 + value: -0.58778524 objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x @@ -2722,7 +2781,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z - value: -70.835 + value: -72 objectReference: {fileID: 0} - target: {fileID: 8978849373333944373, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_Name @@ -2783,23 +2842,31 @@ PrefabInstance: m_Modifications: - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.w - value: 0.809017 + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} + propertyPath: m_LocalRotation.y + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.z - value: 0.58778524 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: -0.000019311905 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 7.000017 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z - value: 72 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1072704683713788848, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_text @@ -2839,11 +2906,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.x - value: 124.3549 + value: 174 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.y - value: 114.3264 + value: 160 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalPosition.x @@ -2859,27 +2926,27 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.w - value: 0.80673397 + value: 0.809017 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.x - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.z - value: -0.5909148 + value: -0.58778524 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: 137.89098 + value: 221.8 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 46.75069 + value: 73.6 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -2891,7 +2958,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z - value: -72.444 + value: -72 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_ConstrainProportionsScale @@ -2919,7 +2986,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4063225283202921380, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 17 + value: 14 objectReference: {fileID: 0} - target: {fileID: 4063225283202921380, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z @@ -2935,7 +3002,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 7.7 objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y @@ -2949,6 +3016,10 @@ PrefabInstance: propertyPath: m_Name value: Slot3 objectReference: {fileID: 0} + - target: {fileID: 8978849373333944373, guid: 74f861e4b826444a7836daeea35442db, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -3000,11 +3071,19 @@ PrefabInstance: m_Modifications: - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.w - value: 0.309017 + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} + propertyPath: m_LocalRotation.y + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.z - value: 0.95105654 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x @@ -3012,11 +3091,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 7 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z - value: 144 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1072704683713788848, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_text @@ -3056,11 +3135,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.x - value: 124.3549 + value: 174 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.y - value: 114.3263 + value: 160 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalPosition.x @@ -3092,11 +3171,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: 87.048416 + value: 138.5 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: -116.00384 + value: -190.2 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -3152,11 +3231,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 3 objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 7 + value: 9 objectReference: {fileID: 0} - target: {fileID: 5294823707738111947, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z @@ -3166,6 +3245,10 @@ PrefabInstance: propertyPath: m_Name value: Slot5 objectReference: {fileID: 0} + - target: {fileID: 8978849373333944373, guid: 74f861e4b826444a7836daeea35442db, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -3217,23 +3300,31 @@ PrefabInstance: m_Modifications: - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.w - value: 0.5877853 + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} + propertyPath: m_LocalRotation.y + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalRotation.z - value: 0.80901694 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: -0.000017642975 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: 7.0000253 + value: 0 objectReference: {fileID: 0} - target: {fileID: 677941972702109446, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.z - value: 108 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1072704683713788848, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_text @@ -3273,11 +3364,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.x - value: 124.3549 + value: 174 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_SizeDelta.y - value: 114.3264 + value: 160 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalPosition.x @@ -3309,11 +3400,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.x - value: 139.59843 + value: 222.6 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_AnchoredPosition.y - value: -43.196045 + value: -72 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 74f861e4b826444a7836daeea35442db, type: 3} propertyPath: m_LocalEulerAnglesHint.x From dec474599bc9233f76dcd9be51190e2fa164324d Mon Sep 17 00:00:00 2001 From: Alejandro Jimenez Date: Mon, 11 May 2026 11:38:44 +0200 Subject: [PATCH 11/28] feat(avatar): facial expressions wheel UI Brings the facial expressions wheel UI online: ring of 10 slots with icons, EYEBROWS / EYES / MOUTH cyclers, live avatar preview, and the input maps that drive it (Y+[0-9] always-on quick-apply, plain [0-9] while the wheel is open). On close, the last preview is committed via IFacialExpressionApplier if the user touched a slot or cycler; opening and closing without picking anything leaves the avatar untouched. The slot view, cycler view, controller, character preview wrapper and icon textures are introduced here. FacialExpressionWheelUtils centralises slot label / action name / wrap math so the controller and the (future) ECS input system share the same encoding. The cycler exposes a single OnCycle(int delta) instead of separate Previous/Next events. --- .../AvatarFaceExpressionDefinition.cs | 2 + .../CharacterPreviewController.cs | 18 + .../Assets/DCL/FacialExpressionsWheel.meta | 8 + .../DCL.FacialExpressionsWheel.asmref | 3 + .../DCL.FacialExpressionsWheel.asmref.meta | 7 + .../FaceChannelCyclerView.cs | 35 + .../FaceChannelCyclerView.cs.meta | 2 + .../FacialExpressionWheelSlotView.cs | 87 +++ .../FacialExpressionWheelSlotView.cs.meta | 2 + .../FacialExpressionWheelUtils.cs | 40 ++ .../FacialExpressionWheelUtils.cs.meta | 2 + ...alExpressionsCharacterPreviewController.cs | 24 + ...ressionsCharacterPreviewController.cs.meta | 2 + .../FacialExpressionsWheelController.cs | 313 +++++++++ .../FacialExpressionsWheelController.cs.meta | 2 + .../FacialExpressionsWheelView.cs | 83 +++ .../FacialExpressionsWheelView.cs.meta | 2 + .../DCL/FacialExpressionsWheel/Textures.meta | 8 + .../Textures/ExpressionIcons.meta | 8 + .../Textures/ExpressionIcons/Angry.png | 3 + .../Textures/ExpressionIcons/Angry.png.meta | 143 ++++ .../Textures/ExpressionIcons/Dizzy.png | 3 + .../Textures/ExpressionIcons/Dizzy.png.meta | 143 ++++ .../ExpressionIcons/ExpressionSlotHover.png | 3 + .../ExpressionSlotHover.png.meta | 143 ++++ .../ExpressionIcons/ExpressionSlotIdle.png | 3 + .../ExpressionSlotIdle.png.meta | 143 ++++ .../ExpressionSlotSelected.png | 3 + .../ExpressionSlotSelected.png.meta | 143 ++++ .../Textures/ExpressionIcons/Happy.png | 3 + .../Textures/ExpressionIcons/Happy.png.meta | 143 ++++ .../Textures/ExpressionIcons/Idle.png | 3 + .../Textures/ExpressionIcons/Idle.png.meta | 143 ++++ .../Textures/ExpressionIcons/Relaxed.png | 3 + .../Textures/ExpressionIcons/Relaxed.png.meta | 143 ++++ .../Textures/ExpressionIcons/Sad.png | 3 + .../Textures/ExpressionIcons/Sad.png.meta | 143 ++++ .../Textures/ExpressionIcons/Smirk.png | 3 + .../Textures/ExpressionIcons/Smirk.png.meta | 143 ++++ .../Textures/ExpressionIcons/Surprised.png | 3 + .../ExpressionIcons/Surprised.png.meta | 143 ++++ .../Textures/ExpressionIcons/WinkLeft.png | 3 + .../ExpressionIcons/WinkLeft.png.meta | 143 ++++ .../Textures/ExpressionIcons/WinkRight.png | 3 + .../ExpressionIcons/WinkRight.png.meta | 143 ++++ .../DCL/Input/UnityInputSystem/DCLInput.cs | 633 ++++++++++++++++++ .../UnityInputSystem/DCLInput.inputactions | 290 ++++++++ .../Global/AvatarFaceExpressionConfig.asset | 54 +- 48 files changed, 3507 insertions(+), 16 deletions(-) create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/DCL.FacialExpressionsWheel.asmref create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/DCL.FacialExpressionsWheel.asmref.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/FaceChannelCyclerView.cs create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/FaceChannelCyclerView.cs.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionWheelSlotView.cs create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionWheelSlotView.cs.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionWheelUtils.cs create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionWheelUtils.cs.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsCharacterPreviewController.cs create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsCharacterPreviewController.cs.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelView.cs create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelView.cs.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Angry.png create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Angry.png.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Dizzy.png create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Dizzy.png.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotHover.png create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotHover.png.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotIdle.png create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotIdle.png.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotSelected.png create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotSelected.png.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Happy.png create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Happy.png.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Idle.png create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Idle.png.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Relaxed.png create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Relaxed.png.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Sad.png create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Sad.png.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Smirk.png create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Smirk.png.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Surprised.png create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Surprised.png.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/WinkLeft.png create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/WinkLeft.png.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/WinkRight.png create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/WinkRight.png.meta diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionDefinition.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionDefinition.cs index 2473acafa25..e6f979f3754 100644 --- a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionDefinition.cs +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/AvatarFaceExpressionDefinition.cs @@ -14,6 +14,8 @@ public struct AvatarFaceExpressionDefinition { public string Name; + public Sprite Icon; + [Range(0, 15)] public int EyebrowsIndex; diff --git a/Explorer/Assets/DCL/Character/CharacterPreview/CharacterPreviewController.cs b/Explorer/Assets/DCL/Character/CharacterPreview/CharacterPreviewController.cs index 85ffefc06e1..023e1a9dcf4 100644 --- a/Explorer/Assets/DCL/Character/CharacterPreview/CharacterPreviewController.cs +++ b/Explorer/Assets/DCL/Character/CharacterPreview/CharacterPreviewController.cs @@ -163,6 +163,24 @@ public void ResetEmote() emoteComponent.Reset(); } + /// + /// Writes the resting facial expression layer on the preview avatar. No-ops until + /// has been attached by the rendering pipeline + /// (after wearable instantiation), so safe to call before the avatar has loaded. + /// + public void TrySetFace(int eyebrowsIndex, int eyesIndex, int mouthIndex) + { + if (!globalWorld.IsAlive(characterPreviewEntity)) return; + + ref AvatarFaceComponent face = ref globalWorld.TryGetRef(characterPreviewEntity, out bool exists); + if (!exists) return; + + face.EyebrowsExpressionIndex = eyebrowsIndex; + face.EyesExpressionIndex = eyesIndex; + face.MouthExpressionIndex = mouthIndex; + face.IsDirty = true; + } + public bool IsPlayingEmote() => globalWorld.TryGet(characterPreviewEntity, out CharacterEmoteComponent emoteComponent) && emoteComponent.IsPlayingEmote; diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel.meta b/Explorer/Assets/DCL/FacialExpressionsWheel.meta new file mode 100644 index 00000000000..f890e8ed0cc --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 349808ddfb3182246a63baec35c85cb2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/DCL.FacialExpressionsWheel.asmref b/Explorer/Assets/DCL/FacialExpressionsWheel/DCL.FacialExpressionsWheel.asmref new file mode 100644 index 00000000000..1d1668cac21 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/DCL.FacialExpressionsWheel.asmref @@ -0,0 +1,3 @@ +{ + "reference": "GUID:f56000518aba31544aa96f4739e50a64" +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/DCL.FacialExpressionsWheel.asmref.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/DCL.FacialExpressionsWheel.asmref.meta new file mode 100644 index 00000000000..a75c0779579 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/DCL.FacialExpressionsWheel.asmref.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 785b8a1617daffa488a77b1c169b6413 +AssemblyDefinitionReferenceImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/FaceChannelCyclerView.cs b/Explorer/Assets/DCL/FacialExpressionsWheel/FaceChannelCyclerView.cs new file mode 100644 index 00000000000..1bd26b7c42a --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/FaceChannelCyclerView.cs @@ -0,0 +1,35 @@ +using System; +using TMPro; +using UnityEngine; +using UnityEngine.UI; + +namespace DCL.FacialExpressionsWheel +{ + /// + /// One row of the wheel footer (EYEBROWS / EYES / MOUTH). Hosts a label plus prev/next arrows + /// to step through that channel's atlas slices, and a "current/total" index display. + /// The view is dumb: clamping and bounds live in the controller. Label is authored in the prefab. + /// + public class FaceChannelCyclerView : MonoBehaviour + { + public event Action? OnCycle; + + [field: SerializeField] + public TMP_Text IndexText { get; private set; } = null!; + + [SerializeField] + private Button previousButton = null!; + + [SerializeField] + private Button nextButton = null!; + + private void Awake() + { + previousButton.onClick.AddListener(() => OnCycle?.Invoke(-1)); + nextButton.onClick.AddListener(() => OnCycle?.Invoke(+1)); + } + + public void SetIndex(int currentOneBased, int total) => + IndexText.text = $"{currentOneBased}/{total}"; + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/FaceChannelCyclerView.cs.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/FaceChannelCyclerView.cs.meta new file mode 100644 index 00000000000..f90b38e35a1 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/FaceChannelCyclerView.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7d739f11aea6d2b4a8a26cb8e0cdd6bd \ No newline at end of file diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionWheelSlotView.cs b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionWheelSlotView.cs new file mode 100644 index 00000000000..5e428aff65e --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionWheelSlotView.cs @@ -0,0 +1,87 @@ +using DCL.Audio; +using DCL.UI; +using System; +using TMPro; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +namespace DCL.FacialExpressionsWheel +{ + /// + /// One slot around the facial expressions wheel. Mirrors EmoteWheelSlotView but + /// without the rarity background, since face expressions have no tier system. + /// + public class FacialExpressionWheelSlotView : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler + { + public event Action? OnPlay; + public event Action? OnHover; + public event Action? OnFocusLeave; + + [SerializeField] + private Button playButton = null!; + + [field: SerializeField] + public Image Icon { get; private set; } = null!; + + [field: SerializeField] + public TMP_Text SlotLabel { get; private set; } = null!; + + [SerializeField] + private GameObject hoverBackground = null!; + + [SerializeField] + private GameObject selectedBackground = null!; + + [field: SerializeField] + public Animator SlotAnimator { get; private set; } = null!; + + [field: Header("Audio")] + [field: SerializeField] + public AudioClipConfig ClickAudio { get; private set; } = null!; + + [field: SerializeField] + public AudioClipConfig HoverAudio { get; private set; } = null!; + + public int Slot { get; set; } + + private void Awake() + { + playButton.onClick.AddListener(() => + { + UIAudioEventsBus.Instance.SendPlayAudioEvent(ClickAudio); + OnPlay?.Invoke(Slot); + }); + } + + private void OnEnable() + { + SlotAnimator.Rebind(); + SlotAnimator.Update(0); + } + + private void OnDisable() + { + hoverBackground.SetActive(false); + selectedBackground.SetActive(false); + } + + public void SetSelected(bool selected) => + selectedBackground.SetActive(selected); + + public void OnPointerEnter(PointerEventData eventData) + { + UIAudioEventsBus.Instance.SendPlayAudioEvent(HoverAudio); + hoverBackground.SetActive(true); + SlotAnimator.SetTrigger(UIAnimationHashes.HOVER); + OnHover?.Invoke(Slot); + } + + public void OnPointerExit(PointerEventData eventData) + { + hoverBackground.SetActive(false); + SlotAnimator.SetTrigger(UIAnimationHashes.UNHOVER); + OnFocusLeave?.Invoke(Slot); + } + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionWheelSlotView.cs.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionWheelSlotView.cs.meta new file mode 100644 index 00000000000..3b2b35bc059 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionWheelSlotView.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e9a3d376af46b584db655b1626aa6d54 \ No newline at end of file diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionWheelUtils.cs b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionWheelUtils.cs new file mode 100644 index 00000000000..bbd5b4c8321 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionWheelUtils.cs @@ -0,0 +1,40 @@ +using System; +using UnityEngine; + +namespace DCL.FacialExpressionsWheel +{ + public static class FacialExpressionWheelUtils + { + public static int WrapChannelIndex(int currentIndex, int delta, int total) => + ((currentIndex + delta) % total + total) % total; + + public static string GetSlotLabel(int slotIndex) => + slotIndex < 9 ? (slotIndex + 1).ToString() : "0"; + + public static string GetSlotActionName(int slotIndex) => + $"Slot {slotIndex}"; + + // "Slot 1" maps to idx 0 ... "Slot 9" maps to idx 8, "Slot 0" maps to idx 9. + public static int SlotIndexFromActionName(string actionName) + { + int n = actionName[^1] - '0'; + return n == 0 ? 9 : n - 1; + } + + public static void Setup( + this FacialExpressionWheelSlotView slot, + int slotIndex, + Sprite icon, + Action onPlay, + Action onHover, + Action onFocusLeave) + { + slot.Slot = slotIndex; + slot.Icon.sprite = icon; + slot.SlotLabel.text = GetSlotLabel(slotIndex); + slot.OnPlay += onPlay; + slot.OnHover += onHover; + slot.OnFocusLeave += onFocusLeave; + } + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionWheelUtils.cs.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionWheelUtils.cs.meta new file mode 100644 index 00000000000..909964e156c --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionWheelUtils.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9696e6f85eba09446bed91b38bcba474 \ No newline at end of file diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsCharacterPreviewController.cs b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsCharacterPreviewController.cs new file mode 100644 index 00000000000..f3baa637174 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsCharacterPreviewController.cs @@ -0,0 +1,24 @@ +using Arch.Core; +using DCL.CharacterPreview; + +namespace DCL.FacialExpressionsWheel +{ + /// + /// Character preview for the facial expressions wheel. Wraps the shared preview infra + /// and exposes a single entry point so the wheel controller + /// can write resting eyebrow/eye/mouth slice indices without touching ECS directly. + /// No platform, no emote events, no wearable bus. + /// + public class FacialExpressionsCharacterPreviewController : CharacterPreviewControllerBase + { + public FacialExpressionsCharacterPreviewController( + CharacterPreviewView view, + ICharacterPreviewFactory previewFactory, + World world, + CharacterPreviewEventBus characterPreviewEventBus) + : base(view, previewFactory, world, isPreviewPlatformActive: false, characterPreviewEventBus) { } + + public void SetFace(int eyebrowsIndex, int eyesIndex, int mouthIndex) => + previewController?.TrySetFace(eyebrowsIndex, eyesIndex, mouthIndex); + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsCharacterPreviewController.cs.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsCharacterPreviewController.cs.meta new file mode 100644 index 00000000000..af69b878c66 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsCharacterPreviewController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b832fef4bb29f5b4f881363a90269a2b \ No newline at end of file diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs new file mode 100644 index 00000000000..aa8a5c5a38c --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs @@ -0,0 +1,313 @@ +using Cysharp.Threading.Tasks; +using DCL.AvatarRendering.AvatarShape; +using DCL.AvatarRendering.AvatarShape.FacialExpression; +using DCL.AvatarRendering.Emotes; +using DCL.Diagnostics; +using DCL.Input; +using DCL.Input.Component; +using DCL.Profiles; +using DCL.Profiles.Self; +using DCL.UI; +using MVC; +using System; +using System.Threading; +using UnityEngine; +using UnityEngine.InputSystem; +using Utility; + +namespace DCL.FacialExpressionsWheel +{ + public class FacialExpressionsWheelController : ControllerBase + { + // Mirrors EmoteWheelShortcutHandler.QUICK_EMOTE_LOCK_TIME so a fast Y release after + // a slot click doesn't immediately re-toggle the wheel. + private const float QUICK_APPLY_LOCK_TIME = 0.5f; + + // Atlas grid is 4x4 = 16 slices per channel (see AvatarFacialExpressionConstants). + private const int CHANNEL_ATLAS_SIZE = 16; + + private const int SLOT_COUNT = 10; + + private readonly SelfProfile selfProfile; + private readonly AvatarFaceExpressionConfig expressionConfig; + private readonly IFacialExpressionApplier applier; + private readonly IInputBlock inputBlock; + private readonly ICursor cursor; + private readonly IMVCManager mvcManager; + private readonly IEventBus eventBus; + private readonly FacialExpressionsCharacterPreviewController previewController; + private readonly DCLInput.ShortcutsActions shortcutsInput; + private readonly InputActionMap faceExpressionsInput; + private readonly InputActionMap wheelInput; + + private UniTaskCompletionSource? closeViewTask; + private CancellationTokenSource? fetchProfileCts; + + private int pendingEyebrowsIndex; + private int pendingEyesIndex; + private int pendingMouthIndex; + + // Y-release coordination: Y+N consumed the release, or a slot click locks it briefly. + private bool ignoreNextRelease; + private float lockUntilTime; + + // True once the user has touched a slot or cycler. Gates the on-close commit so opening + // and closing without picking anything leaves the avatar untouched. Also reset to false + // after Y+N quick-apply (face already on avatar) and on tab-swap (discard). + private bool pendingChanged; + + private int selectedSlot = -1; + + public override CanvasOrdering.SortingLayer Layer => CanvasOrdering.SortingLayer.POPUP; + + public FacialExpressionsWheelController( + ViewFactoryMethod viewFactory, + SelfProfile selfProfile, + AvatarFaceExpressionConfig expressionConfig, + IFacialExpressionApplier applier, + IInputBlock inputBlock, + ICursor cursor, + IMVCManager mvcManager, + IEventBus eventBus, + FacialExpressionsCharacterPreviewController previewController) + : base(viewFactory) + { + this.selfProfile = selfProfile; + this.expressionConfig = expressionConfig; + this.applier = applier; + this.inputBlock = inputBlock; + this.cursor = cursor; + this.mvcManager = mvcManager; + this.eventBus = eventBus; + this.previewController = previewController; + + DCLInput input = DCLInput.Instance; + shortcutsInput = input.Shortcuts; + faceExpressionsInput = input.FaceExpressions; + wheelInput = input.FaceExpressionsWheel; + + shortcutsInput.FaceExpression.canceled += OnFaceExpressionShortcutReleased; + ListenToSlotsInput(faceExpressionsInput, OnFaceExpressionsQuickApply); + } + + public override void Dispose() + { + base.Dispose(); + + shortcutsInput.FaceExpression.canceled -= OnFaceExpressionShortcutReleased; + UnregisterSlotsInput(faceExpressionsInput, OnFaceExpressionsQuickApply); + UnregisterSlotsInput(wheelInput, OnSlotNumberPressed); + + fetchProfileCts.SafeCancelAndDispose(); + previewController.Dispose(); + } + + protected override void OnViewInstantiated() + { + viewInstance!.Closed += Close; + viewInstance.EmotesTabButton.onClick.AddListener(SwapToEmotes); + viewInstance.CurrentExpressionName.text = string.Empty; + + for (var i = 0; i < viewInstance.Slots.Length; i++) + { + Sprite icon = i < expressionConfig.Expressions.Length + ? expressionConfig.Expressions[i].Icon + : null!; + + viewInstance.Slots[i].Setup(i, icon, OnSlotPlay, OnSlotHover, OnSlotFocusLeave); + } + + viewInstance.EyebrowsCycler.OnCycle += delta => CycleChannel(ref pendingEyebrowsIndex, delta, viewInstance.EyebrowsCycler); + viewInstance.EyesCycler.OnCycle += delta => CycleChannel(ref pendingEyesIndex, delta, viewInstance.EyesCycler); + viewInstance.MouthCycler.OnCycle += delta => CycleChannel(ref pendingMouthIndex, delta, viewInstance.MouthCycler); + } + + protected override void OnBeforeViewShow() + { + pendingChanged = false; + selectedSlot = -1; + + // Enable the wheel-only number map (1-9/0 + Esc) and quiet the gameplay maps that would + // otherwise compete with mouse focus on the wheel UI. + inputBlock.Disable(InputMapComponent.Kind.EMOTES); + inputBlock.Disable(InputMapComponent.Kind.EMOTE_WHEEL); + inputBlock.Enable(InputMapComponent.Kind.FACE_EXPRESSIONS_WHEEL); + + cursor.Unlock(); + + ListenToSlotsInput(wheelInput, OnSlotNumberPressed); + + previewController.OnBeforeShow(); + + fetchProfileCts = fetchProfileCts.SafeRestart(); + InitializePreviewAsync(fetchProfileCts.Token).Forget(); + return; + + async UniTaskVoid InitializePreviewAsync(CancellationToken ct) + { + Profile? profile = selfProfile.OwnProfile ?? await selfProfile.ProfileAsync(ct); + + if (profile == null) + { + ReportHub.LogError(new ReportData(ReportCategory.AVATAR), + "Could not initialize facial expressions wheel preview, profile is null"); + return; + } + + previewController.Initialize(profile.Avatar, Vector3.zero); + previewController.OnShow(); + + ApplyExpressionToPreview(slot: 0); + } + } + + protected override void OnViewClose() + { + // Restore gameplay input maps. Counter-balance every Disable in OnBeforeViewShow so + // open/close cycles don't leak the FACE_EXPRESSIONS_WHEEL/EMOTE_WHEEL block counters. + inputBlock.Disable(InputMapComponent.Kind.FACE_EXPRESSIONS_WHEEL); + inputBlock.Enable(InputMapComponent.Kind.EMOTES); + inputBlock.Enable(InputMapComponent.Kind.EMOTE_WHEEL); + + UnregisterSlotsInput(wheelInput, OnSlotNumberPressed); + + previewController.OnHide(); + + if (pendingChanged) + applier.Apply((byte)pendingEyebrowsIndex, (byte)pendingEyesIndex, (byte)pendingMouthIndex); + } + + protected override UniTask WaitForCloseIntentAsync(CancellationToken ct) + { + closeViewTask?.TrySetCanceled(ct); + closeViewTask = new UniTaskCompletionSource(); + return closeViewTask.Task.AttachExternalCancellation(ct); + } + + public void Close() => + closeViewTask?.TrySetResult(); + + private void OnSlotPlay(int slot) + { + ApplyExpressionToPreview(slot); + HighlightSlot(slot); + pendingChanged = true; + lockUntilTime = Time.time + QUICK_APPLY_LOCK_TIME; + } + + private void OnSlotHover(int slot) => + viewInstance!.CurrentExpressionName.text = expressionConfig.Expressions[slot].Name; + + private void OnSlotFocusLeave(int _) => + viewInstance!.CurrentExpressionName.text = selectedSlot >= 0 + ? expressionConfig.Expressions[selectedSlot].Name + : string.Empty; + + private void CycleChannel(ref int currentIndex, int delta, FaceChannelCyclerView cyclerView) + { + currentIndex = FacialExpressionWheelUtils.WrapChannelIndex(currentIndex, delta, CHANNEL_ATLAS_SIZE); + cyclerView.SetIndex(currentIndex + 1, CHANNEL_ATLAS_SIZE); + + HighlightSlot(-1); + viewInstance!.CurrentExpressionName.text = string.Empty; + + previewController.SetFace(pendingEyebrowsIndex, pendingEyesIndex, pendingMouthIndex); + pendingChanged = true; + } + + private void OnSlotNumberPressed(InputAction.CallbackContext context) + { + int slot = FacialExpressionWheelUtils.SlotIndexFromActionName(context.action.name); + ApplyExpressionToPreview(slot); + HighlightSlot(slot); + pendingChanged = true; + } + + private void OnFaceExpressionsQuickApply(InputAction.CallbackContext context) + { + int slot = FacialExpressionWheelUtils.SlotIndexFromActionName(context.action.name); + AvatarFaceExpressionDefinition def = expressionConfig.Expressions[slot]; + + applier.Apply((byte)def.EyebrowsIndex, (byte)def.EyesIndex, (byte)def.MouthIndex); + + if (State != ControllerState.ViewHidden && State != ControllerState.ViewHiding) + { + // Face already applied via shortcut; skip the on-close commit. + pendingChanged = false; + Close(); + } + else + { + ignoreNextRelease = true; + } + } + + private void OnFaceExpressionShortcutReleased(InputAction.CallbackContext _) + { + if (ignoreNextRelease) + { + ignoreNextRelease = false; + return; + } + + if (Time.time < lockUntilTime) + { + lockUntilTime = 0f; + return; + } + + if (State != ControllerState.ViewHidden && State != ControllerState.ViewHiding) + Close(); + else + mvcManager.ShowAndForget(IssueCommand()); + } + + private void SwapToEmotes() + { + // Swap discards pending face changes; user is bailing out of the face wheel. + pendingChanged = false; + Close(); + eventBus.Publish(new RequestToggleEmoteWheelEvent()); + } + + private void ApplyExpressionToPreview(int slot) + { + AvatarFaceExpressionDefinition def = expressionConfig.Expressions[slot]; + pendingEyebrowsIndex = def.EyebrowsIndex; + pendingEyesIndex = def.EyesIndex; + pendingMouthIndex = def.MouthIndex; + + previewController.SetFace(pendingEyebrowsIndex, pendingEyesIndex, pendingMouthIndex); + + viewInstance!.EyebrowsCycler.SetIndex(pendingEyebrowsIndex + 1, CHANNEL_ATLAS_SIZE); + viewInstance.EyesCycler.SetIndex(pendingEyesIndex + 1, CHANNEL_ATLAS_SIZE); + viewInstance.MouthCycler.SetIndex(pendingMouthIndex + 1, CHANNEL_ATLAS_SIZE); + viewInstance.CurrentExpressionName.text = def.Name; + } + + private void HighlightSlot(int slot) + { + if (selectedSlot == slot) return; + + if (selectedSlot >= 0 && selectedSlot < viewInstance!.Slots.Length) + viewInstance.Slots[selectedSlot].SetSelected(false); + + selectedSlot = slot; + + if (slot >= 0 && slot < viewInstance!.Slots.Length) + viewInstance.Slots[slot].SetSelected(true); + } + + private static void ListenToSlotsInput(InputActionMap map, Action handler) + { + for (var i = 0; i < SLOT_COUNT; i++) + map.FindAction(FacialExpressionWheelUtils.GetSlotActionName(i)).started += handler; + } + + private static void UnregisterSlotsInput(InputActionMap map, Action handler) + { + for (var i = 0; i < SLOT_COUNT; i++) + map.FindAction(FacialExpressionWheelUtils.GetSlotActionName(i)).started -= handler; + } + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs.meta new file mode 100644 index 00000000000..1a41ece4ce8 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0d11f5fb09c45e742b8ccdba4fdc5779 \ No newline at end of file diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelView.cs b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelView.cs new file mode 100644 index 00000000000..459822ac494 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelView.cs @@ -0,0 +1,83 @@ +using Cysharp.Threading.Tasks; +using DCL.Audio; +using DCL.CharacterPreview; +using DCL.UI; +using MVC; +using System; +using System.Threading; +using TMPro; +using UnityEngine; +using UnityEngine.UI; + +namespace DCL.FacialExpressionsWheel +{ + public class FacialExpressionsWheelView : ViewBase, IView + { + // Mirrors EmotesWheelView: lets graphic raycaster + slot input work before the open + // animation finishes, so users can commit a slot the instant it's visible. + private const float ANIMATION_LOCK_DURATION = 0.05f; + + public event Action? Closed; + + [SerializeField] + private Button[] closeButtons = null!; + + [field: SerializeField] + public Button EmotesTabButton { get; private set; } = null!; + + [field: SerializeField] + public Button FacialExpressionsTabButton { get; private set; } = null!; + + [field: SerializeField] + public FacialExpressionWheelSlotView[] Slots { get; private set; } = null!; + + [field: SerializeField] + public FaceChannelCyclerView EyebrowsCycler { get; private set; } = null!; + + [field: SerializeField] + public FaceChannelCyclerView EyesCycler { get; private set; } = null!; + + [field: SerializeField] + public FaceChannelCyclerView MouthCycler { get; private set; } = null!; + + [field: SerializeField] + public CharacterPreviewView CharacterPreview { get; private set; } = null!; + + [field: SerializeField] + public TMP_Text CurrentExpressionName { get; private set; } = null!; + + [field: SerializeField] + public Animator WheelAnimator { get; private set; } = null!; + + [field: Header("Audio")] + [field: SerializeField] + public AudioClipConfig OpenAudio { get; private set; } = null!; + + [field: SerializeField] + public AudioClipConfig CloseAudio { get; private set; } = null!; + + private void Awake() + { + foreach (Button button in closeButtons) + button.onClick.AddListener(() => Closed?.Invoke()); + } + + private void OnEnable() => + UIAudioEventsBus.Instance.SendPlayAudioEvent(OpenAudio); + + private void OnDisable() => + UIAudioEventsBus.Instance.SendPlayAudioEvent(CloseAudio); + + protected override UniTask PlayShowAnimationAsync(CancellationToken ct) => + UniTask.WaitUntil(() => WheelAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime > ANIMATION_LOCK_DURATION, + cancellationToken: ct); + + protected override UniTask PlayHideAnimationAsync(CancellationToken ct) + { + WheelAnimator.SetTrigger(UIAnimationHashes.OUT); + + return UniTask.WaitUntil(() => WheelAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime > 1, + cancellationToken: ct); + } + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelView.cs.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelView.cs.meta new file mode 100644 index 00000000000..cd762e5f32d --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelView.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a2d86c5623ba20640930fee622f0d1e1 \ No newline at end of file diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures.meta new file mode 100644 index 00000000000..30b3e0b4004 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 79614b1a4cb16cd478e8711af775c155 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons.meta new file mode 100644 index 00000000000..23ebb32f0c5 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0865dcaf67dc37a47a10b35e33e1557d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Angry.png b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Angry.png new file mode 100644 index 00000000000..14d924c34ce --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Angry.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6731c048c991e04e695bda948442a593b272357d23564ca254b966346468371 +size 1322 diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Angry.png.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Angry.png.meta new file mode 100644 index 00000000000..cd028fea25c --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Angry.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: d32628cd806b94f44b8de91e17649985 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 0 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Dizzy.png b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Dizzy.png new file mode 100644 index 00000000000..8f90f3cb392 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Dizzy.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb512ac36c22c9b672a11b2a93011bd9bf667899ebdb685f78d5eb4735ed4e90 +size 1743 diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Dizzy.png.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Dizzy.png.meta new file mode 100644 index 00000000000..038bab6c8fb --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Dizzy.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 1a0800345f0594d45896dea31252fefb +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 0 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotHover.png b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotHover.png new file mode 100644 index 00000000000..a4d80340809 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotHover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6c94e264392c1b348d4758a35e0857bebb29dc34a80188331bc9d981dafa930 +size 7064 diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotHover.png.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotHover.png.meta new file mode 100644 index 00000000000..8e036101865 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotHover.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 5604813e08c884c43a90cb5492c7fdb0 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 0 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotIdle.png b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotIdle.png new file mode 100644 index 00000000000..f4c22d9e487 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotIdle.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dbe0ede6982c793e9cf570809c093e7a03e112e085b5b07895bcb491d65c3041 +size 3249 diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotIdle.png.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotIdle.png.meta new file mode 100644 index 00000000000..f7a3c889b62 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotIdle.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 5a1ead256ed3f0c449e897aff3076362 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 0 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotSelected.png b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotSelected.png new file mode 100644 index 00000000000..ddc67715430 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotSelected.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b0da4a289b189dbd67a985cdeddb06dc0c294016e285d39dcf55b2f7b181274 +size 2894 diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotSelected.png.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotSelected.png.meta new file mode 100644 index 00000000000..3db06899c4c --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/ExpressionSlotSelected.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: c380e7a05885b254d877bfabec1eb0c5 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 0 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Happy.png b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Happy.png new file mode 100644 index 00000000000..f118cde6a5a --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Happy.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef47fe06a619ce4c034b234f6cb7ba11c4056d7f8dee583f697f194da7784fcd +size 1418 diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Happy.png.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Happy.png.meta new file mode 100644 index 00000000000..953d212b31d --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Happy.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 6ba8f0c6358b99a42b8bcd62ecf17c42 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 0 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Idle.png b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Idle.png new file mode 100644 index 00000000000..a096d4616e5 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Idle.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79000b0da0a9739f508f94cd6f2dfc2fbcd291c9dbfb4edcd72a4110e825aa6c +size 1272 diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Idle.png.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Idle.png.meta new file mode 100644 index 00000000000..d1e06e3c939 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Idle.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 40e73f0f90309014e85648642b450b35 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 0 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Relaxed.png b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Relaxed.png new file mode 100644 index 00000000000..3be893cdfe2 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Relaxed.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33236422e0df33596b58d47977fd44d126605ed9db69e077a4e8515630b9b62c +size 1358 diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Relaxed.png.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Relaxed.png.meta new file mode 100644 index 00000000000..94b55117d65 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Relaxed.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 1b4569768c863f34ea705315c8058272 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 0 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Sad.png b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Sad.png new file mode 100644 index 00000000000..93e1b049313 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Sad.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33426955ff7f5c3a7ad57b805731ab1f5ceb7da2bd081ff6fc0cad19b258f2a2 +size 1579 diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Sad.png.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Sad.png.meta new file mode 100644 index 00000000000..dd99a22fa0b --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Sad.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 0483d6feaa8d13742bd909baaf3eb082 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 0 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Smirk.png b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Smirk.png new file mode 100644 index 00000000000..3f07f4b1d8b --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Smirk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3e56c2fd046102b08b96766958b2e031c46644b49df7a45c11fa5c8717f636d +size 1365 diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Smirk.png.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Smirk.png.meta new file mode 100644 index 00000000000..a44fff80f1e --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Smirk.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: bf2b52c591cb3674fad42d0e8fb2c23a +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 0 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Surprised.png b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Surprised.png new file mode 100644 index 00000000000..b837db6c996 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Surprised.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f4d47feacb20b5f342f6b2c75d128f7f0cd3da1e811f30b02af82df41e9792b +size 1437 diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Surprised.png.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Surprised.png.meta new file mode 100644 index 00000000000..29a6839c740 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/Surprised.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 56e05927f5bf6884482bbc76405c1f4c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 0 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/WinkLeft.png b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/WinkLeft.png new file mode 100644 index 00000000000..8ed427e909e --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/WinkLeft.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21d8f5e4c1b37617b356ef5e616ca228a4090b66eb192516d02e44a5e068fc54 +size 1371 diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/WinkLeft.png.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/WinkLeft.png.meta new file mode 100644 index 00000000000..aa15a6b85e2 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/WinkLeft.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 903044891eae81d4786012f510483810 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 0 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/WinkRight.png b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/WinkRight.png new file mode 100644 index 00000000000..3c7ed24aceb --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/WinkRight.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22df810fb05d0f4c5b898348f1a703bea83a0e85a4ffa8a67b005482b35727d2 +size 1372 diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/WinkRight.png.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/WinkRight.png.meta new file mode 100644 index 00000000000..5fcd083afa9 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Textures/ExpressionIcons/WinkRight.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 2b0f4104a439bf649932844d3cd11b75 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 0 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/Input/UnityInputSystem/DCLInput.cs b/Explorer/Assets/DCL/Input/UnityInputSystem/DCLInput.cs index a8966ba5269..dd62cf31c29 100644 --- a/Explorer/Assets/DCL/Input/UnityInputSystem/DCLInput.cs +++ b/Explorer/Assets/DCL/Input/UnityInputSystem/DCLInput.cs @@ -2283,6 +2283,15 @@ public @DCLInput() ""interactions"": """", ""initialStateCheck"": false }, + { + ""name"": ""FaceExpression"", + ""type"": ""Button"", + ""id"": ""feeb0c11-cb40-43d3-a316-304e55aaa81d"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, { ""name"": ""ToggleAvatarBubbles"", ""type"": ""Button"", @@ -2459,6 +2468,17 @@ public @DCLInput() ""isComposite"": false, ""isPartOfComposite"": false }, + { + ""name"": """", + ""id"": ""feeb0c11-17b4-412c-a2f2-e4477bb2d88a"", + ""path"": ""/y"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""FaceExpression"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, { ""name"": """", ""id"": ""025e5590-7e11-4f49-8719-954bafe5ccc3"", @@ -4012,6 +4032,15 @@ public @DCLInput() ""processors"": """", ""interactions"": """", ""initialStateCheck"": false + }, + { + ""name"": ""Slot 0"", + ""type"": ""Button"", + ""id"": ""fe100001-0000-4000-a000-000000000000"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false } ], ""bindings"": [ @@ -4311,6 +4340,267 @@ public @DCLInput() ""action"": ""Slot 9"", ""isComposite"": false, ""isPartOfComposite"": true + }, + { + ""name"": ""One Modifier"", + ""id"": ""fe200000-0000-4000-b000-000000000001"", + ""path"": ""OneModifier"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 0"", + ""isComposite"": true, + ""isPartOfComposite"": false + }, + { + ""name"": ""modifier"", + ""id"": ""fe200000-0000-4000-b000-000000000002"", + ""path"": ""/y"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 0"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""binding"", + ""id"": ""fe200000-0000-4000-b000-000000000003"", + ""path"": ""/0"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 0"", + ""isComposite"": false, + ""isPartOfComposite"": true + } + ] + }, + { + ""name"": ""FaceExpressionsWheel"", + ""id"": ""b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e"", + ""actions"": [ + { + ""name"": ""Close"", + ""type"": ""Button"", + ""id"": ""fee00000-0000-4000-c000-00000000c105"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""Slot 0"", + ""type"": ""Button"", + ""id"": ""fee00000-0000-4000-c000-000000000000"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""Slot 1"", + ""type"": ""Button"", + ""id"": ""fee00000-0000-4000-c000-000000000001"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""Slot 2"", + ""type"": ""Button"", + ""id"": ""fee00000-0000-4000-c000-000000000002"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""Slot 3"", + ""type"": ""Button"", + ""id"": ""fee00000-0000-4000-c000-000000000003"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""Slot 4"", + ""type"": ""Button"", + ""id"": ""fee00000-0000-4000-c000-000000000004"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""Slot 5"", + ""type"": ""Button"", + ""id"": ""fee00000-0000-4000-c000-000000000005"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""Slot 6"", + ""type"": ""Button"", + ""id"": ""fee00000-0000-4000-c000-000000000006"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""Slot 7"", + ""type"": ""Button"", + ""id"": ""fee00000-0000-4000-c000-000000000007"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""Slot 8"", + ""type"": ""Button"", + ""id"": ""fee00000-0000-4000-c000-000000000008"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + }, + { + ""name"": ""Slot 9"", + ""type"": ""Button"", + ""id"": ""fee00000-0000-4000-c000-000000000009"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + } + ], + ""bindings"": [ + { + ""name"": """", + ""id"": ""fee10000-0000-4000-d000-00000000c105"", + ""path"": ""/escape"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Close"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""fee10000-0000-4000-d000-000000000000"", + ""path"": ""/0"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 0"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""fee10000-0000-4000-d000-000000000001"", + ""path"": ""/1"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 1"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""fee10000-0000-4000-d000-000000000002"", + ""path"": ""/2"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 2"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""fee10000-0000-4000-d000-000000000003"", + ""path"": ""/3"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 3"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""fee10000-0000-4000-d000-000000000004"", + ""path"": ""/4"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 4"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""fee10000-0000-4000-d000-000000000005"", + ""path"": ""/5"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 5"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""fee10000-0000-4000-d000-000000000006"", + ""path"": ""/6"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 6"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""fee10000-0000-4000-d000-000000000007"", + ""path"": ""/7"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 7"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""fee10000-0000-4000-d000-000000000008"", + ""path"": ""/8"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 8"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""fee10000-0000-4000-d000-000000000009"", + ""path"": ""/9"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Slot 9"", + ""isComposite"": false, + ""isPartOfComposite"": false } ] } @@ -4392,6 +4682,7 @@ public @DCLInput() m_Shortcuts_Settings = m_Shortcuts.FindAction("Settings", throwIfNotFound: true); m_Shortcuts_ToggleUI = m_Shortcuts.FindAction("ToggleUI", throwIfNotFound: true); m_Shortcuts_EmoteWheel = m_Shortcuts.FindAction("EmoteWheel", throwIfNotFound: true); + m_Shortcuts_FaceExpression = m_Shortcuts.FindAction("FaceExpression", throwIfNotFound: true); m_Shortcuts_ToggleAvatarBubbles = m_Shortcuts.FindAction("ToggleAvatarBubbles", throwIfNotFound: true); m_Shortcuts_ShowHideUI = m_Shortcuts.FindAction("ShowHideUI", throwIfNotFound: true); m_Shortcuts_ToggleNametags = m_Shortcuts.FindAction("ToggleNametags", throwIfNotFound: true); @@ -4459,6 +4750,20 @@ public @DCLInput() m_FaceExpressions_Slot7 = m_FaceExpressions.FindAction("Slot 7", throwIfNotFound: true); m_FaceExpressions_Slot8 = m_FaceExpressions.FindAction("Slot 8", throwIfNotFound: true); m_FaceExpressions_Slot9 = m_FaceExpressions.FindAction("Slot 9", throwIfNotFound: true); + m_FaceExpressions_Slot0 = m_FaceExpressions.FindAction("Slot 0", throwIfNotFound: true); + // FaceExpressionsWheel + m_FaceExpressionsWheel = asset.FindActionMap("FaceExpressionsWheel", throwIfNotFound: true); + m_FaceExpressionsWheel_Close = m_FaceExpressionsWheel.FindAction("Close", throwIfNotFound: true); + m_FaceExpressionsWheel_Slot0 = m_FaceExpressionsWheel.FindAction("Slot 0", throwIfNotFound: true); + m_FaceExpressionsWheel_Slot1 = m_FaceExpressionsWheel.FindAction("Slot 1", throwIfNotFound: true); + m_FaceExpressionsWheel_Slot2 = m_FaceExpressionsWheel.FindAction("Slot 2", throwIfNotFound: true); + m_FaceExpressionsWheel_Slot3 = m_FaceExpressionsWheel.FindAction("Slot 3", throwIfNotFound: true); + m_FaceExpressionsWheel_Slot4 = m_FaceExpressionsWheel.FindAction("Slot 4", throwIfNotFound: true); + m_FaceExpressionsWheel_Slot5 = m_FaceExpressionsWheel.FindAction("Slot 5", throwIfNotFound: true); + m_FaceExpressionsWheel_Slot6 = m_FaceExpressionsWheel.FindAction("Slot 6", throwIfNotFound: true); + m_FaceExpressionsWheel_Slot7 = m_FaceExpressionsWheel.FindAction("Slot 7", throwIfNotFound: true); + m_FaceExpressionsWheel_Slot8 = m_FaceExpressionsWheel.FindAction("Slot 8", throwIfNotFound: true); + m_FaceExpressionsWheel_Slot9 = m_FaceExpressionsWheel.FindAction("Slot 9", throwIfNotFound: true); } ~@DCLInput() @@ -4473,6 +4778,7 @@ public @DCLInput() UnityEngine.Debug.Assert(!m_InWorldCamera.enabled, "This will cause a leak and performance issues, DCLInput.InWorldCamera.Disable() has not been called."); UnityEngine.Debug.Assert(!m_VoiceChat.enabled, "This will cause a leak and performance issues, DCLInput.VoiceChat.Disable() has not been called."); UnityEngine.Debug.Assert(!m_FaceExpressions.enabled, "This will cause a leak and performance issues, DCLInput.FaceExpressions.Disable() has not been called."); + UnityEngine.Debug.Assert(!m_FaceExpressionsWheel.enabled, "This will cause a leak and performance issues, DCLInput.FaceExpressionsWheel.Disable() has not been called."); } /// @@ -5477,6 +5783,7 @@ public void SetCallbacks(IUIActions instance) private readonly InputAction m_Shortcuts_Settings; private readonly InputAction m_Shortcuts_ToggleUI; private readonly InputAction m_Shortcuts_EmoteWheel; + private readonly InputAction m_Shortcuts_FaceExpression; private readonly InputAction m_Shortcuts_ToggleAvatarBubbles; private readonly InputAction m_Shortcuts_ShowHideUI; private readonly InputAction m_Shortcuts_ToggleNametags; @@ -5525,6 +5832,10 @@ public struct ShortcutsActions /// public InputAction @EmoteWheel => m_Wrapper.m_Shortcuts_EmoteWheel; /// + /// Provides access to the underlying input action "Shortcuts/FaceExpression". + /// + public InputAction @FaceExpression => m_Wrapper.m_Shortcuts_FaceExpression; + /// /// Provides access to the underlying input action "Shortcuts/ToggleAvatarBubbles". /// public InputAction @ToggleAvatarBubbles => m_Wrapper.m_Shortcuts_ToggleAvatarBubbles; @@ -5616,6 +5927,9 @@ public void AddCallbacks(IShortcutsActions instance) @EmoteWheel.started += instance.OnEmoteWheel; @EmoteWheel.performed += instance.OnEmoteWheel; @EmoteWheel.canceled += instance.OnEmoteWheel; + @FaceExpression.started += instance.OnFaceExpression; + @FaceExpression.performed += instance.OnFaceExpression; + @FaceExpression.canceled += instance.OnFaceExpression; @ToggleAvatarBubbles.started += instance.OnToggleAvatarBubbles; @ToggleAvatarBubbles.performed += instance.OnToggleAvatarBubbles; @ToggleAvatarBubbles.canceled += instance.OnToggleAvatarBubbles; @@ -5681,6 +5995,9 @@ private void UnregisterCallbacks(IShortcutsActions instance) @EmoteWheel.started -= instance.OnEmoteWheel; @EmoteWheel.performed -= instance.OnEmoteWheel; @EmoteWheel.canceled -= instance.OnEmoteWheel; + @FaceExpression.started -= instance.OnFaceExpression; + @FaceExpression.performed -= instance.OnFaceExpression; + @FaceExpression.canceled -= instance.OnFaceExpression; @ToggleAvatarBubbles.started -= instance.OnToggleAvatarBubbles; @ToggleAvatarBubbles.performed -= instance.OnToggleAvatarBubbles; @ToggleAvatarBubbles.canceled -= instance.OnToggleAvatarBubbles; @@ -6499,6 +6816,7 @@ public void SetCallbacks(IVoiceChatActions instance) private readonly InputAction m_FaceExpressions_Slot7; private readonly InputAction m_FaceExpressions_Slot8; private readonly InputAction m_FaceExpressions_Slot9; + private readonly InputAction m_FaceExpressions_Slot0; /// /// Provides access to input actions defined in input action map "FaceExpressions". /// @@ -6547,6 +6865,10 @@ public struct FaceExpressionsActions /// public InputAction @Slot9 => m_Wrapper.m_FaceExpressions_Slot9; /// + /// Provides access to the underlying input action "FaceExpressions/Slot0". + /// + public InputAction @Slot0 => m_Wrapper.m_FaceExpressions_Slot0; + /// /// Provides access to the underlying input action map instance. /// public InputActionMap Get() { return m_Wrapper.m_FaceExpressions; } @@ -6599,6 +6921,9 @@ public void AddCallbacks(IFaceExpressionsActions instance) @Slot9.started += instance.OnSlot9; @Slot9.performed += instance.OnSlot9; @Slot9.canceled += instance.OnSlot9; + @Slot0.started += instance.OnSlot0; + @Slot0.performed += instance.OnSlot0; + @Slot0.canceled += instance.OnSlot0; } /// @@ -6637,6 +6962,9 @@ private void UnregisterCallbacks(IFaceExpressionsActions instance) @Slot9.started -= instance.OnSlot9; @Slot9.performed -= instance.OnSlot9; @Slot9.canceled -= instance.OnSlot9; + @Slot0.started -= instance.OnSlot0; + @Slot0.performed -= instance.OnSlot0; + @Slot0.canceled -= instance.OnSlot0; } /// @@ -6670,6 +6998,212 @@ public void SetCallbacks(IFaceExpressionsActions instance) /// Provides a new instance referencing this action map. /// public FaceExpressionsActions @FaceExpressions => new FaceExpressionsActions(this); + + // FaceExpressionsWheel + private readonly InputActionMap m_FaceExpressionsWheel; + private List m_FaceExpressionsWheelActionsCallbackInterfaces = new List(); + private readonly InputAction m_FaceExpressionsWheel_Close; + private readonly InputAction m_FaceExpressionsWheel_Slot0; + private readonly InputAction m_FaceExpressionsWheel_Slot1; + private readonly InputAction m_FaceExpressionsWheel_Slot2; + private readonly InputAction m_FaceExpressionsWheel_Slot3; + private readonly InputAction m_FaceExpressionsWheel_Slot4; + private readonly InputAction m_FaceExpressionsWheel_Slot5; + private readonly InputAction m_FaceExpressionsWheel_Slot6; + private readonly InputAction m_FaceExpressionsWheel_Slot7; + private readonly InputAction m_FaceExpressionsWheel_Slot8; + private readonly InputAction m_FaceExpressionsWheel_Slot9; + /// + /// Provides access to input actions defined in input action map "FaceExpressionsWheel". + /// + public struct FaceExpressionsWheelActions + { + private @DCLInput m_Wrapper; + + /// + /// Construct a new instance of the input action map wrapper class. + /// + public FaceExpressionsWheelActions(@DCLInput wrapper) { m_Wrapper = wrapper; } + /// + /// Provides access to the underlying input action "FaceExpressionsWheel/Close". + /// + public InputAction @Close => m_Wrapper.m_FaceExpressionsWheel_Close; + /// + /// Provides access to the underlying input action "FaceExpressionsWheel/Slot0". + /// + public InputAction @Slot0 => m_Wrapper.m_FaceExpressionsWheel_Slot0; + /// + /// Provides access to the underlying input action "FaceExpressionsWheel/Slot1". + /// + public InputAction @Slot1 => m_Wrapper.m_FaceExpressionsWheel_Slot1; + /// + /// Provides access to the underlying input action "FaceExpressionsWheel/Slot2". + /// + public InputAction @Slot2 => m_Wrapper.m_FaceExpressionsWheel_Slot2; + /// + /// Provides access to the underlying input action "FaceExpressionsWheel/Slot3". + /// + public InputAction @Slot3 => m_Wrapper.m_FaceExpressionsWheel_Slot3; + /// + /// Provides access to the underlying input action "FaceExpressionsWheel/Slot4". + /// + public InputAction @Slot4 => m_Wrapper.m_FaceExpressionsWheel_Slot4; + /// + /// Provides access to the underlying input action "FaceExpressionsWheel/Slot5". + /// + public InputAction @Slot5 => m_Wrapper.m_FaceExpressionsWheel_Slot5; + /// + /// Provides access to the underlying input action "FaceExpressionsWheel/Slot6". + /// + public InputAction @Slot6 => m_Wrapper.m_FaceExpressionsWheel_Slot6; + /// + /// Provides access to the underlying input action "FaceExpressionsWheel/Slot7". + /// + public InputAction @Slot7 => m_Wrapper.m_FaceExpressionsWheel_Slot7; + /// + /// Provides access to the underlying input action "FaceExpressionsWheel/Slot8". + /// + public InputAction @Slot8 => m_Wrapper.m_FaceExpressionsWheel_Slot8; + /// + /// Provides access to the underlying input action "FaceExpressionsWheel/Slot9". + /// + public InputAction @Slot9 => m_Wrapper.m_FaceExpressionsWheel_Slot9; + /// + /// Provides access to the underlying input action map instance. + /// + public InputActionMap Get() { return m_Wrapper.m_FaceExpressionsWheel; } + /// + public void Enable() { Get().Enable(); } + /// + public void Disable() { Get().Disable(); } + /// + public bool enabled => Get().enabled; + /// + /// Implicitly converts an to an instance. + /// + public static implicit operator InputActionMap(FaceExpressionsWheelActions set) { return set.Get(); } + /// + /// Adds , and callbacks provided via on all input actions contained in this map. + /// + /// Callback instance. + /// + /// If is null or have already been added this method does nothing. + /// + /// + public void AddCallbacks(IFaceExpressionsWheelActions instance) + { + if (instance == null || m_Wrapper.m_FaceExpressionsWheelActionsCallbackInterfaces.Contains(instance)) return; + m_Wrapper.m_FaceExpressionsWheelActionsCallbackInterfaces.Add(instance); + @Close.started += instance.OnClose; + @Close.performed += instance.OnClose; + @Close.canceled += instance.OnClose; + @Slot0.started += instance.OnSlot0; + @Slot0.performed += instance.OnSlot0; + @Slot0.canceled += instance.OnSlot0; + @Slot1.started += instance.OnSlot1; + @Slot1.performed += instance.OnSlot1; + @Slot1.canceled += instance.OnSlot1; + @Slot2.started += instance.OnSlot2; + @Slot2.performed += instance.OnSlot2; + @Slot2.canceled += instance.OnSlot2; + @Slot3.started += instance.OnSlot3; + @Slot3.performed += instance.OnSlot3; + @Slot3.canceled += instance.OnSlot3; + @Slot4.started += instance.OnSlot4; + @Slot4.performed += instance.OnSlot4; + @Slot4.canceled += instance.OnSlot4; + @Slot5.started += instance.OnSlot5; + @Slot5.performed += instance.OnSlot5; + @Slot5.canceled += instance.OnSlot5; + @Slot6.started += instance.OnSlot6; + @Slot6.performed += instance.OnSlot6; + @Slot6.canceled += instance.OnSlot6; + @Slot7.started += instance.OnSlot7; + @Slot7.performed += instance.OnSlot7; + @Slot7.canceled += instance.OnSlot7; + @Slot8.started += instance.OnSlot8; + @Slot8.performed += instance.OnSlot8; + @Slot8.canceled += instance.OnSlot8; + @Slot9.started += instance.OnSlot9; + @Slot9.performed += instance.OnSlot9; + @Slot9.canceled += instance.OnSlot9; + } + + /// + /// Removes , and callbacks provided via on all input actions contained in this map. + /// + /// + /// Calling this method when have not previously been registered has no side-effects. + /// + /// + private void UnregisterCallbacks(IFaceExpressionsWheelActions instance) + { + @Close.started -= instance.OnClose; + @Close.performed -= instance.OnClose; + @Close.canceled -= instance.OnClose; + @Slot0.started -= instance.OnSlot0; + @Slot0.performed -= instance.OnSlot0; + @Slot0.canceled -= instance.OnSlot0; + @Slot1.started -= instance.OnSlot1; + @Slot1.performed -= instance.OnSlot1; + @Slot1.canceled -= instance.OnSlot1; + @Slot2.started -= instance.OnSlot2; + @Slot2.performed -= instance.OnSlot2; + @Slot2.canceled -= instance.OnSlot2; + @Slot3.started -= instance.OnSlot3; + @Slot3.performed -= instance.OnSlot3; + @Slot3.canceled -= instance.OnSlot3; + @Slot4.started -= instance.OnSlot4; + @Slot4.performed -= instance.OnSlot4; + @Slot4.canceled -= instance.OnSlot4; + @Slot5.started -= instance.OnSlot5; + @Slot5.performed -= instance.OnSlot5; + @Slot5.canceled -= instance.OnSlot5; + @Slot6.started -= instance.OnSlot6; + @Slot6.performed -= instance.OnSlot6; + @Slot6.canceled -= instance.OnSlot6; + @Slot7.started -= instance.OnSlot7; + @Slot7.performed -= instance.OnSlot7; + @Slot7.canceled -= instance.OnSlot7; + @Slot8.started -= instance.OnSlot8; + @Slot8.performed -= instance.OnSlot8; + @Slot8.canceled -= instance.OnSlot8; + @Slot9.started -= instance.OnSlot9; + @Slot9.performed -= instance.OnSlot9; + @Slot9.canceled -= instance.OnSlot9; + } + + /// + /// Unregisters and unregisters all input action callbacks via . + /// + /// + public void RemoveCallbacks(IFaceExpressionsWheelActions instance) + { + if (m_Wrapper.m_FaceExpressionsWheelActionsCallbackInterfaces.Remove(instance)) + UnregisterCallbacks(instance); + } + + /// + /// Replaces all existing callback instances and previously registered input action callbacks associated with them with callbacks provided via . + /// + /// + /// If is null, calling this method will only unregister all existing callbacks but not register any new callbacks. + /// + /// + /// + /// + public void SetCallbacks(IFaceExpressionsWheelActions instance) + { + foreach (var item in m_Wrapper.m_FaceExpressionsWheelActionsCallbackInterfaces) + UnregisterCallbacks(item); + m_Wrapper.m_FaceExpressionsWheelActionsCallbackInterfaces.Clear(); + AddCallbacks(instance); + } + } + /// + /// Provides a new instance referencing this action map. + /// + public FaceExpressionsWheelActions @FaceExpressionsWheel => new FaceExpressionsWheelActions(this); private int m_DesktopSchemeIndex = -1; /// /// Provides access to the input control scheme. @@ -7136,6 +7670,13 @@ public interface IShortcutsActions /// void OnEmoteWheel(InputAction.CallbackContext context); /// + /// Method invoked when associated input action "FaceExpression" is either , or . + /// + /// + /// + /// + void OnFaceExpression(InputAction.CallbackContext context); + /// /// Method invoked when associated input action "ToggleAvatarBubbles" is either , or . /// /// @@ -7574,5 +8115,97 @@ public interface IFaceExpressionsActions /// /// void OnSlot9(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 0" is either , or . + /// + /// + /// + /// + void OnSlot0(InputAction.CallbackContext context); + } + /// + /// Interface to implement callback methods for all input action callbacks associated with input actions defined by "FaceExpressionsWheel" which allows adding and removing callbacks. + /// + /// + /// + public interface IFaceExpressionsWheelActions + { + /// + /// Method invoked when associated input action "Close" is either , or . + /// + /// + /// + /// + void OnClose(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 0" is either , or . + /// + /// + /// + /// + void OnSlot0(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 1" is either , or . + /// + /// + /// + /// + void OnSlot1(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 2" is either , or . + /// + /// + /// + /// + void OnSlot2(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 3" is either , or . + /// + /// + /// + /// + void OnSlot3(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 4" is either , or . + /// + /// + /// + /// + void OnSlot4(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 5" is either , or . + /// + /// + /// + /// + void OnSlot5(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 6" is either , or . + /// + /// + /// + /// + void OnSlot6(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 7" is either , or . + /// + /// + /// + /// + void OnSlot7(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 8" is either , or . + /// + /// + /// + /// + void OnSlot8(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Slot 9" is either , or . + /// + /// + /// + /// + void OnSlot9(InputAction.CallbackContext context); } } diff --git a/Explorer/Assets/DCL/Input/UnityInputSystem/DCLInput.inputactions b/Explorer/Assets/DCL/Input/UnityInputSystem/DCLInput.inputactions index d7f0b838912..2388ac8d6c9 100644 --- a/Explorer/Assets/DCL/Input/UnityInputSystem/DCLInput.inputactions +++ b/Explorer/Assets/DCL/Input/UnityInputSystem/DCLInput.inputactions @@ -2197,6 +2197,15 @@ "interactions": "", "initialStateCheck": false }, + { + "name": "FaceExpression", + "type": "Button", + "id": "feeb0c11-cb40-43d3-a316-304e55aaa81d", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, { "name": "ToggleAvatarBubbles", "type": "Button", @@ -2373,6 +2382,17 @@ "isComposite": false, "isPartOfComposite": false }, + { + "name": "", + "id": "feeb0c11-17b4-412c-a2f2-e4477bb2d88a", + "path": "/y", + "interactions": "", + "processors": "", + "groups": "", + "action": "FaceExpression", + "isComposite": false, + "isPartOfComposite": false + }, { "name": "", "id": "025e5590-7e11-4f49-8719-954bafe5ccc3", @@ -3926,6 +3946,15 @@ "processors": "", "interactions": "", "initialStateCheck": false + }, + { + "name": "Slot 0", + "type": "Button", + "id": "fe100001-0000-4000-a000-000000000000", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false } ], "bindings": [ @@ -4225,6 +4254,267 @@ "action": "Slot 9", "isComposite": false, "isPartOfComposite": true + }, + { + "name": "One Modifier", + "id": "fe200000-0000-4000-b000-000000000001", + "path": "OneModifier", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 0", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "modifier", + "id": "fe200000-0000-4000-b000-000000000002", + "path": "/y", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 0", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "binding", + "id": "fe200000-0000-4000-b000-000000000003", + "path": "/0", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 0", + "isComposite": false, + "isPartOfComposite": true + } + ] + }, + { + "name": "FaceExpressionsWheel", + "id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e", + "actions": [ + { + "name": "Close", + "type": "Button", + "id": "fee00000-0000-4000-c000-00000000c105", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Slot 0", + "type": "Button", + "id": "fee00000-0000-4000-c000-000000000000", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Slot 1", + "type": "Button", + "id": "fee00000-0000-4000-c000-000000000001", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Slot 2", + "type": "Button", + "id": "fee00000-0000-4000-c000-000000000002", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Slot 3", + "type": "Button", + "id": "fee00000-0000-4000-c000-000000000003", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Slot 4", + "type": "Button", + "id": "fee00000-0000-4000-c000-000000000004", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Slot 5", + "type": "Button", + "id": "fee00000-0000-4000-c000-000000000005", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Slot 6", + "type": "Button", + "id": "fee00000-0000-4000-c000-000000000006", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Slot 7", + "type": "Button", + "id": "fee00000-0000-4000-c000-000000000007", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Slot 8", + "type": "Button", + "id": "fee00000-0000-4000-c000-000000000008", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Slot 9", + "type": "Button", + "id": "fee00000-0000-4000-c000-000000000009", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "", + "id": "fee10000-0000-4000-d000-00000000c105", + "path": "/escape", + "interactions": "", + "processors": "", + "groups": "", + "action": "Close", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "fee10000-0000-4000-d000-000000000000", + "path": "/0", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 0", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "fee10000-0000-4000-d000-000000000001", + "path": "/1", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 1", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "fee10000-0000-4000-d000-000000000002", + "path": "/2", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 2", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "fee10000-0000-4000-d000-000000000003", + "path": "/3", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 3", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "fee10000-0000-4000-d000-000000000004", + "path": "/4", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 4", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "fee10000-0000-4000-d000-000000000005", + "path": "/5", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 5", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "fee10000-0000-4000-d000-000000000006", + "path": "/6", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 6", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "fee10000-0000-4000-d000-000000000007", + "path": "/7", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 7", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "fee10000-0000-4000-d000-000000000008", + "path": "/8", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 8", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "fee10000-0000-4000-d000-000000000009", + "path": "/9", + "interactions": "", + "processors": "", + "groups": "", + "action": "Slot 9", + "isComposite": false, + "isPartOfComposite": false } ] } diff --git a/Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceExpressionConfig.asset b/Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceExpressionConfig.asset index 87dfa6f0322..af74276115c 100644 --- a/Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceExpressionConfig.asset +++ b/Explorer/Assets/DCL/PluginSystem/Global/AvatarFaceExpressionConfig.asset @@ -14,30 +14,52 @@ MonoBehaviour: m_EditorClassIdentifier: AvatarShape::DCL.AvatarRendering.AvatarShape.AvatarFaceExpressionConfig Expressions: - Name: Idle + Icon: {fileID: 21300000, guid: 40e73f0f90309014e85648642b450b35, type: 3} EyebrowsIndex: 0 EyesIndex: 0 MouthIndex: 0 - Name: Happy + Icon: {fileID: 21300000, guid: 6ba8f0c6358b99a42b8bcd62ecf17c42, type: 3} EyebrowsIndex: 1 EyesIndex: 0 MouthIndex: 13 - - Name: Suspicius Left - EyebrowsIndex: 4 - EyesIndex: 7 - MouthIndex: 15 - - Name: Suspicius Right - EyebrowsIndex: 5 - EyesIndex: 6 - MouthIndex: 15 + - Name: Sad + Icon: {fileID: 21300000, guid: 0483d6feaa8d13742bd909baaf3eb082, type: 3} + EyebrowsIndex: 0 + EyesIndex: 0 + MouthIndex: 0 + - Name: Angry + Icon: {fileID: 21300000, guid: d32628cd806b94f44b8de91e17649985, type: 3} + EyebrowsIndex: 0 + EyesIndex: 0 + MouthIndex: 0 - Name: Surprised + Icon: {fileID: 21300000, guid: 56e05927f5bf6884482bbc76405c1f4c, type: 3} EyebrowsIndex: 1 EyesIndex: 3 MouthIndex: 7 - - Name: Stoned - EyebrowsIndex: 3 - EyesIndex: 1 - MouthIndex: 3 - - Name: Surprised - EyebrowsIndex: 3 - EyesIndex: 3 - MouthIndex: 11 + - Name: Dizzy + Icon: {fileID: 21300000, guid: 1a0800345f0594d45896dea31252fefb, type: 3} + EyebrowsIndex: 0 + EyesIndex: 0 + MouthIndex: 0 + - Name: Relaxed + Icon: {fileID: 21300000, guid: 1b4569768c863f34ea705315c8058272, type: 3} + EyebrowsIndex: 0 + EyesIndex: 0 + MouthIndex: 0 + - Name: Smirk + Icon: {fileID: 21300000, guid: bf2b52c591cb3674fad42d0e8fb2c23a, type: 3} + EyebrowsIndex: 0 + EyesIndex: 0 + MouthIndex: 0 + - Name: WinkLeft + Icon: {fileID: 21300000, guid: 903044891eae81d4786012f510483810, type: 3} + EyebrowsIndex: 0 + EyesIndex: 0 + MouthIndex: 0 + - Name: WinkRight + Icon: {fileID: 21300000, guid: 2b0f4104a439bf649932844d3cd11b75, type: 3} + EyebrowsIndex: 0 + EyesIndex: 0 + MouthIndex: 0 From 44173742d3a5a8f69285b96b71098e1656ae41fd Mon Sep 17 00:00:00 2001 From: Alejandro Jimenez Date: Mon, 11 May 2026 11:41:19 +0200 Subject: [PATCH 12/28] feat(avatar): extract face shortcut handler + gate input map Pulls Y-shortcut release and Y+[0-9] quick-apply out of the wheel controller so the wheel stays UI-only. FacialExpressionsWheelShortcutHandler mirrors EmoteWheelShortcutHandler: listens to Shortcuts.FaceExpression.canceled, publishes RequestToggleFacialExpressionsWheelEvent on the event bus (subscriber is the wheel plugin, follow-up). Exposes NotifyExpressionPlayed so the ECS input system can suppress the next Y release after a quick-apply. UpdateFacialExpressionInputSystem replaces the old UpdateFaceExpressionInputSystem: listens to the FaceExpressions map, writes TriggerFacialExpressionIntent on the local player, notifies the handler so the upcoming Y release is swallowed. The FaceExpressions map was previously always-on (it had no entry in ApplyInputMapsSystem) which meant Y+[0-9] fired in chat input, menus, and any state that disables player input. Adds InputMapComponent.Kind FACE_EXPRESSIONS, wires it through ApplyInputMapsSystem, and includes it in the default-enabled set in MainSceneLoader so blocking emotes also blocks face quick-apply. AvatarPlugin now owns the handler lifecycle (created when the face expression config loads, disposed with the plugin) and injects the new ECS input system. DynamicWorldContainer passes the shared emotesEventBus to AvatarPlugin so the handler and the wheel use the same event channel. --- .../TriggerFacialExpressionIntent.cs | 15 ++ .../TriggerFacialExpressionIntent.cs.meta | 2 + .../AvatarShape/FacialExpression.meta | 8 + .../DCL.AvatarShape.FacialExpression.asmref | 3 + ...L.AvatarShape.FacialExpression.asmref.meta | 7 + .../FacialExpressionApplier.cs | 27 +++ .../FacialExpressionApplier.cs.meta | 2 + .../FacialExpressionTriggerSource.cs | 11 + .../FacialExpressionTriggerSource.cs.meta | 2 + .../FacialExpressionsWheelShortcutHandler.cs | 66 ++++++ ...ialExpressionsWheelShortcutHandler.cs.meta | 2 + .../IFacialExpressionApplier.cs | 12 + .../IFacialExpressionApplier.cs.meta | 2 + ...equestToggleFacialExpressionsWheelEvent.cs | 9 + ...tToggleFacialExpressionsWheelEvent.cs.meta | 2 + .../ApplyFacialExpressionIntentSystem.cs | 67 ++++++ .../ApplyFacialExpressionIntentSystem.cs.meta | 2 + .../FacialExpression/MouthAnimationSystem.cs | 222 ++++++++++++++++++ .../MouthAnimationSystem.cs.meta | 2 + .../UpdateFaceExpressionInputSystem.cs | 125 ---------- .../UpdateFaceExpressionInputSystem.cs.meta | 2 - .../UpdateFacialExpressionInputSystem.cs | 111 +++++++++ .../UpdateFacialExpressionInputSystem.cs.meta | 2 + .../FacialExpressionsWheelController.cs | 66 +----- .../Global/Dynamic/DynamicWorldContainer.cs | 5 +- .../Global/Dynamic/MainSceneLoader.cs | 5 +- .../DCL/Input/Component/InputMapComponent.cs | 2 + .../DCL/Input/Systems/ApplyInputMapsSystem.cs | 6 + .../DCL/PluginSystem/Global/AvatarPlugin.cs | 19 +- .../Global/MouthAnimationPlugin.cs | 27 +++ .../Global/MouthAnimationPlugin.cs.meta | 2 + 31 files changed, 636 insertions(+), 199 deletions(-) create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/TriggerFacialExpressionIntent.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/TriggerFacialExpressionIntent.cs.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/DCL.AvatarShape.FacialExpression.asmref create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/DCL.AvatarShape.FacialExpression.asmref.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionApplier.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionApplier.cs.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionTriggerSource.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionTriggerSource.cs.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionsWheelShortcutHandler.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionsWheelShortcutHandler.cs.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/IFacialExpressionApplier.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/IFacialExpressionApplier.cs.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/RequestToggleFacialExpressionsWheelEvent.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/RequestToggleFacialExpressionsWheelEvent.cs.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/ApplyFacialExpressionIntentSystem.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/ApplyFacialExpressionIntentSystem.cs.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/MouthAnimationSystem.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/MouthAnimationSystem.cs.meta delete mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFaceExpressionInputSystem.cs delete mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFaceExpressionInputSystem.cs.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFacialExpressionInputSystem.cs create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFacialExpressionInputSystem.cs.meta create mode 100644 Explorer/Assets/DCL/PluginSystem/Global/MouthAnimationPlugin.cs create mode 100644 Explorer/Assets/DCL/PluginSystem/Global/MouthAnimationPlugin.cs.meta diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/TriggerFacialExpressionIntent.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/TriggerFacialExpressionIntent.cs new file mode 100644 index 00000000000..7da6e6133e6 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/TriggerFacialExpressionIntent.cs @@ -0,0 +1,15 @@ +namespace DCL.AvatarRendering.AvatarShape.Components +{ + /// + /// One-frame intent placed on the local player to apply a face pose. The shape mirrors the + /// network payload (3 atlas indices) so the wheel/shortcut writers don't need the + /// AvatarFaceExpressionDefinition table — they translate slot → indices upstream. + /// Consumed by . + /// + public struct TriggerFacialExpressionIntent + { + public byte EyebrowsIndex; + public byte EyesIndex; + public byte MouthIndex; + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/TriggerFacialExpressionIntent.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/TriggerFacialExpressionIntent.cs.meta new file mode 100644 index 00000000000..442b200cf9d --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Components/TriggerFacialExpressionIntent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 036fb31d787c86d42b9e3e98a73dfde2 \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression.meta new file mode 100644 index 00000000000..0d448ba3b42 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3f53c2a9e5ca54f4a8390ec6b0150b20 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/DCL.AvatarShape.FacialExpression.asmref b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/DCL.AvatarShape.FacialExpression.asmref new file mode 100644 index 00000000000..b24e4ef9e3d --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/DCL.AvatarShape.FacialExpression.asmref @@ -0,0 +1,3 @@ +{ + "reference": "GUID:fc4fd35fb877e904d8cedee73b2256f6" +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/DCL.AvatarShape.FacialExpression.asmref.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/DCL.AvatarShape.FacialExpression.asmref.meta new file mode 100644 index 00000000000..7bc92274cea --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/DCL.AvatarShape.FacialExpression.asmref.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 215d2bc374736a04797c1e8b34c90852 +AssemblyDefinitionReferenceImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionApplier.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionApplier.cs new file mode 100644 index 00000000000..524fe77b7f6 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionApplier.cs @@ -0,0 +1,27 @@ +using Arch.Core; +using DCL.AvatarRendering.AvatarShape.Components; + +namespace DCL.AvatarRendering.AvatarShape.FacialExpression +{ + public class FacialExpressionApplier : IFacialExpressionApplier + { + private readonly World world; + private readonly Entity playerEntity; + + public FacialExpressionApplier(World world, Entity playerEntity) + { + this.world = world; + this.playerEntity = playerEntity; + } + + public void Apply(byte eyebrowsIndex, byte eyesIndex, byte mouthIndex) + { + world.AddOrGet(playerEntity, new TriggerFacialExpressionIntent + { + EyebrowsIndex = eyebrowsIndex, + EyesIndex = eyesIndex, + MouthIndex = mouthIndex, + }); + } + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionApplier.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionApplier.cs.meta new file mode 100644 index 00000000000..11a8186c5e3 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionApplier.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 98b4b0b30cd532f49a1941398015bbe6 \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionTriggerSource.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionTriggerSource.cs new file mode 100644 index 00000000000..74245dcf8d5 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionTriggerSource.cs @@ -0,0 +1,11 @@ +namespace DCL.AvatarRendering.AvatarShape.FacialExpression +{ + public enum FacialExpressionTriggerSource + { + /// Click on a wheel slot, press [0-9], or use a cycler while the wheel is open. + WHEEL_SLOT, + + /// Press Y+[0-9] while the wheel is closed. + SHORTCUT, + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionTriggerSource.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionTriggerSource.cs.meta new file mode 100644 index 00000000000..ad323ea158e --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionTriggerSource.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3562ae6ee1c567045bee9bad363829d0 \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionsWheelShortcutHandler.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionsWheelShortcutHandler.cs new file mode 100644 index 00000000000..ee1c30abf04 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionsWheelShortcutHandler.cs @@ -0,0 +1,66 @@ +using System; +using UnityEngine; +using Utility; +using InputAction = UnityEngine.InputSystem.InputAction; + +namespace DCL.AvatarRendering.AvatarShape.FacialExpression +{ + /// + /// Owns the Y key (facial expressions shortcut) release handling. Receives expression-played + /// notifications via ; when Y is released, applies + /// ignore-next-release and time-based lock, then publishes + /// . + /// + public class FacialExpressionsWheelShortcutHandler : IDisposable + { + private const float QUICK_APPLY_LOCK_TIME = 0.5f; + + private readonly IEventBus eventBus; + private readonly DCLInput dclInput; + + private bool ignoreNextRelease; + private float lockUntilTime; + + public FacialExpressionsWheelShortcutHandler(IEventBus eventBus) + { + this.eventBus = eventBus; + dclInput = DCLInput.Instance; + dclInput.Shortcuts.FaceExpression.canceled += OnShortcutReleased; + } + + public void Dispose() => + dclInput.Shortcuts.FaceExpression.canceled -= OnShortcutReleased; + + public virtual void NotifyExpressionPlayed(FacialExpressionTriggerSource source) + { + switch (source) + { + case FacialExpressionTriggerSource.SHORTCUT: + ignoreNextRelease = true; + break; + case FacialExpressionTriggerSource.WHEEL_SLOT: + lockUntilTime = Time.time + QUICK_APPLY_LOCK_TIME; + break; + default: + throw new ArgumentOutOfRangeException(nameof(source), source, null); + } + } + + private void OnShortcutReleased(InputAction.CallbackContext _) + { + if (ignoreNextRelease) + { + ignoreNextRelease = false; + return; + } + + if (Time.time < lockUntilTime) + { + lockUntilTime = 0f; + return; + } + + eventBus.Publish(new RequestToggleFacialExpressionsWheelEvent()); + } + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionsWheelShortcutHandler.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionsWheelShortcutHandler.cs.meta new file mode 100644 index 00000000000..f9e949486cf --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionsWheelShortcutHandler.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: cd675c62e648e134986bf9cec8fb0068 \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/IFacialExpressionApplier.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/IFacialExpressionApplier.cs new file mode 100644 index 00000000000..7c97a9da1cb --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/IFacialExpressionApplier.cs @@ -0,0 +1,12 @@ +namespace DCL.AvatarRendering.AvatarShape.FacialExpression +{ + /// + /// Single seam between non-ECS layers (wheel controller) and the player entity: + /// writes a the next frame. + /// Lets callers stay world-free. + /// + public interface IFacialExpressionApplier + { + void Apply(byte eyebrowsIndex, byte eyesIndex, byte mouthIndex); + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/IFacialExpressionApplier.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/IFacialExpressionApplier.cs.meta new file mode 100644 index 00000000000..1fb12003a0a --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/IFacialExpressionApplier.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e6304dd24dafd6248ab67252edbcbc17 \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/RequestToggleFacialExpressionsWheelEvent.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/RequestToggleFacialExpressionsWheelEvent.cs new file mode 100644 index 00000000000..308d0abff0c --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/RequestToggleFacialExpressionsWheelEvent.cs @@ -0,0 +1,9 @@ +namespace DCL.AvatarRendering.AvatarShape.FacialExpression +{ + /// + /// Published on the generic event bus when requesting to toggle the facial expressions wheel. + /// + public struct RequestToggleFacialExpressionsWheelEvent + { + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/RequestToggleFacialExpressionsWheelEvent.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/RequestToggleFacialExpressionsWheelEvent.cs.meta new file mode 100644 index 00000000000..5df6b498062 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/RequestToggleFacialExpressionsWheelEvent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d227284a5d4b06b45bf3ad25a32752f7 \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/ApplyFacialExpressionIntentSystem.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/ApplyFacialExpressionIntentSystem.cs new file mode 100644 index 00000000000..72dcd4f05b7 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/ApplyFacialExpressionIntentSystem.cs @@ -0,0 +1,67 @@ +using Arch.Core; +using Arch.System; +using Arch.SystemGroups; +using DCL.AvatarRendering.AvatarShape.Components; +using DCL.Character.Components; +using DCL.Diagnostics; +using DCL.Input; +using DCL.Multiplayer.Movement; +using ECS.Abstract; +using ECS.LifeCycle.Components; + +namespace DCL.AvatarRendering.AvatarShape +{ + /// + /// Consumes on the local player and applies the + /// three atlas indices to (drives rendering) and + /// (drives the network send). The system + /// never sees the expression table — callers (wheel controller, keyboard adapter) translate + /// slot → indices upstream so the data shape mirrors the rfc4 payload. + /// + [UpdateInGroup(typeof(InputGroup))] + [LogCategory(ReportCategory.AVATAR)] + public partial class ApplyFacialExpressionIntentSystem : BaseUnityLoopSystem + { + internal ApplyFacialExpressionIntentSystem(World world) : base(world) { } + + protected override void Update(float t) + { + SetupNetworkExpressionComponentQuery(World); + ApplyIntentQuery(World); + } + + /// + /// Adds to the player entity as soon as + /// is available. Runs at most once per player thanks to + /// the [None] filter. + /// + [Query] + [All(typeof(PlayerComponent), typeof(AvatarFaceComponent))] + [None(typeof(LocalPlayerFacialExpressionComponent), typeof(DeleteEntityIntention))] + private void SetupNetworkExpressionComponent(in Entity entity) + { + World.Add(entity, new LocalPlayerFacialExpressionComponent()); + } + + [Query] + [All(typeof(PlayerComponent), typeof(AvatarFaceComponent))] + [None(typeof(DeleteEntityIntention))] + private void ApplyIntent( + in Entity entity, + ref AvatarFaceComponent face, + ref LocalPlayerFacialExpressionComponent network, + ref TriggerFacialExpressionIntent intent) + { + face.EyebrowsExpressionIndex = intent.EyebrowsIndex; + face.EyesExpressionIndex = intent.EyesIndex; + face.MouthExpressionIndex = intent.MouthIndex; + face.IsDirty = true; + + network.EyebrowsIndex = intent.EyebrowsIndex; + network.EyesIndex = intent.EyesIndex; + network.MouthIndex = intent.MouthIndex; + + World.Remove(entity); + } + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/ApplyFacialExpressionIntentSystem.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/ApplyFacialExpressionIntentSystem.cs.meta new file mode 100644 index 00000000000..eb424ac0a55 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/ApplyFacialExpressionIntentSystem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 12507785487b2ac468a722ff3ccf78e4 \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/MouthAnimationSystem.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/MouthAnimationSystem.cs new file mode 100644 index 00000000000..cee8c657864 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/MouthAnimationSystem.cs @@ -0,0 +1,222 @@ +using Arch.Core; +using Arch.System; +using Arch.SystemGroups; +using DCL.AvatarRendering.AvatarShape.Components; +using DCL.Character.Components; +using DCL.Chat.History; +using DCL.Diagnostics; +using DCL.Input; +using DCL.LiveKit.Public; +using DCL.Utilities; +using DCL.VoiceChat; +using ECS.Abstract; +using ECS.LifeCycle.Components; +using LiveKit.Rooms; +using LiveKit.Rooms.Participants; +using System; +using System.Collections.Generic; + +namespace DCL.AvatarRendering.AvatarShape +{ + /// + /// Single source of mouth-animation input. Listens to chat (text) and voice-chat (LiveKit + /// active speakers + call status) and writes on the + /// matching avatar entity. Per ADR-317 lip-sync is local-only — events are interpreted by + /// each client and never propagated. + /// + /// Per-participant coalescing: many events for the same wallet within one frame collapse + /// to a single dict entry; remote application happens through a single query that drains + /// the dict by . Chat takes priority over voice — + /// handled downstream by AvatarFacialExpressionSystem.StepMouthAnimation which + /// consumes first; the voice loop + /// only resumes when no chat text is animating. + /// + /// + [UpdateInGroup(typeof(InputGroup))] + [LogCategory(ReportCategory.AVATAR)] + public partial class MouthAnimationSystem : BaseUnityLoopSystem + { + public struct PendingInput + { + public string? Message; // null when no chat update happened this frame + public bool? IsSpeaking; // null when no speaking change happened this frame + } + + private readonly IChatHistory chatHistory; + private readonly IRoom voiceChatRoom; + private readonly IDisposable statusSubscription; + + private PendingInput pendingSelf; + private readonly Dictionary pendingByWallet = new (); + + private readonly HashSet activeSpeakers = new (); + private readonly HashSet nextActiveSpeakers = new (); + + internal MouthAnimationSystem( + World world, + IChatHistory chatHistory, + IRoom voiceChatRoom, + IVoiceChatOrchestratorState voiceChatOrchestratorState) : base(world) + { + this.chatHistory = chatHistory; + this.voiceChatRoom = voiceChatRoom; + + chatHistory.MessageAdded += OnChatMessageAdded; + voiceChatRoom.ActiveSpeakers.Updated += OnActiveSpeakersUpdated; + voiceChatRoom.Participants.UpdatesFromParticipant += OnParticipantUpdated; + statusSubscription = voiceChatOrchestratorState.CurrentCallStatus.Subscribe(OnCallStatusChanged); + } + + protected override void OnDispose() + { + chatHistory.MessageAdded -= OnChatMessageAdded; + voiceChatRoom.ActiveSpeakers.Updated -= OnActiveSpeakersUpdated; + voiceChatRoom.Participants.UpdatesFromParticipant -= OnParticipantUpdated; + statusSubscription?.Dispose(); + } + + protected override void Update(float t) + { + if (pendingSelf.Message != null || pendingSelf.IsSpeaking.HasValue) + { + ApplyToSelfQuery(World, pendingSelf); + pendingSelf = default; + } + + if (pendingByWallet.Count > 0) + ApplyToRemoteQuery(World); + } + + [Query] + [All(typeof(PlayerComponent))] + private void ApplyToSelf([Data] PendingInput pending, ref AvatarMouthInputComponent input) + { + ApplyPending(pending, ref input); + } + + /// + /// Iterates remote avatar entities and consumes their pending input from + /// by . Entries with + /// no matching avatar entity stay in the dict and are retried next frame (covers the + /// race where chat/voice events arrive before the avatar is instantiated). + /// + [Query] + [All(typeof(AvatarMouthInputComponent), typeof(AvatarShapeComponent))] + [None(typeof(PlayerComponent), typeof(DeleteEntityIntention))] + private void ApplyToRemote(in AvatarShapeComponent avatarShape, ref AvatarMouthInputComponent input) + { + if (string.IsNullOrEmpty(avatarShape.ID)) return; + + if (!pendingByWallet.Remove(avatarShape.ID, out PendingInput pending)) + return; + + ApplyPending(pending, ref input); + } + + private static void ApplyPending(PendingInput pending, ref AvatarMouthInputComponent input) + { + if (pending.Message != null) + { + input.PendingMessage = pending.Message; + input.MessageIsDirty = true; + } + + if (pending.IsSpeaking.HasValue) + input.IsVoiceChatSpeaking = pending.IsSpeaking.Value; + } + + private void OnChatMessageAdded(ChatChannel _, ChatMessage msg, int __) + { + if (msg.IsSystemMessage) return; + + if (msg.IsSentByOwnUser) + pendingSelf.Message = msg.Message; + else + StashRemoteMessage(msg.SenderWalletAddress, msg.Message); + } + + private void StashRemoteMessage(string walletId, string message) + { + if (pendingByWallet.TryGetValue(walletId, out PendingInput existing)) + { + existing.Message = message; + pendingByWallet[walletId] = existing; + } + else + pendingByWallet[walletId] = new PendingInput { Message = message }; + } + + private void StashSpeaking(string walletId, bool isSpeaking, bool isSelf) + { + if (isSelf) + { + pendingSelf.IsSpeaking = isSpeaking; + return; + } + + if (pendingByWallet.TryGetValue(walletId, out PendingInput existing)) + { + existing.IsSpeaking = isSpeaking; + pendingByWallet[walletId] = existing; + } + else + pendingByWallet[walletId] = new PendingInput { IsSpeaking = isSpeaking }; + } + + private void OnActiveSpeakersUpdated() + { + nextActiveSpeakers.Clear(); + + foreach (string speakerId in voiceChatRoom.ActiveSpeakers) + { + nextActiveSpeakers.Add(speakerId); + + if (!activeSpeakers.Contains(speakerId)) + EnqueueSpeaking(speakerId, true); + } + + foreach (string oldSpeakerId in activeSpeakers) + if (!nextActiveSpeakers.Contains(oldSpeakerId)) + EnqueueSpeaking(oldSpeakerId, false); + + activeSpeakers.Clear(); + activeSpeakers.UnionWith(nextActiveSpeakers); + } + + private void EnqueueSpeaking(string participantId, bool isSpeaking) + { + bool isSelf = voiceChatRoom.Participants.LocalParticipant()?.Identity == participantId; + StashSpeaking(participantId, isSpeaking, isSelf); + } + + private void OnParticipantUpdated(LKParticipant participant, UpdateFromParticipant update) + { + if (update != UpdateFromParticipant.Disconnected) return; + + StashSpeaking(participant.Identity, false, isSelf: false); + activeSpeakers.Remove(participant.Identity); + } + + private void OnCallStatusChanged(VoiceChatStatus status) + { + switch (status) + { + case VoiceChatStatus.VOICE_CHAT_IN_CALL: + pendingSelf.IsSpeaking = false; + OnActiveSpeakersUpdated(); + break; + + case VoiceChatStatus.VOICE_CHAT_ENDING_CALL: + case VoiceChatStatus.DISCONNECTED: + case VoiceChatStatus.VOICE_CHAT_GENERIC_ERROR: + pendingSelf.IsSpeaking = false; + activeSpeakers.Clear(); + + foreach ((string participantId, _) in voiceChatRoom.Participants.RemoteParticipantIdentities()) + StashSpeaking(participantId, false, isSelf: false); + + break; + } + } + } +} diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/MouthAnimationSystem.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/MouthAnimationSystem.cs.meta new file mode 100644 index 00000000000..dd7ca7f4ea0 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/MouthAnimationSystem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c8f3a4abcb44e2e4aac6a4cbae534626 \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFaceExpressionInputSystem.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFaceExpressionInputSystem.cs deleted file mode 100644 index a4422d583d6..00000000000 --- a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFaceExpressionInputSystem.cs +++ /dev/null @@ -1,125 +0,0 @@ -using Arch.Core; -using Arch.System; -using Arch.SystemGroups; -using DCL.AvatarRendering.AvatarShape.Components; -using DCL.Character.Components; -using DCL.Diagnostics; -using DCL.Input; -using DCL.Multiplayer.Movement; -using ECS.Abstract; -using ECS.LifeCycle.Components; -using System; -using UnityEngine.InputSystem; -using InputAction = UnityEngine.InputSystem.InputAction; - -namespace DCL.AvatarRendering.AvatarShape -{ - /// - /// Listens to the Y + 1-9 shortcut and applies the corresponding face expression to the local - /// player's avatar (mirrors the emote slot pattern). Writes both - /// (drives rendering) and - /// (drives the network send). - /// - [UpdateInGroup(typeof(InputGroup))] - [LogCategory(ReportCategory.AVATAR)] - public partial class UpdateFaceExpressionInputSystem : BaseUnityLoopSystem - { - private const int SLOT_COUNT = 9; - - private readonly AvatarFaceExpressionDefinition[] expressions; - private readonly DCLInput.FaceExpressionsActions faceExpressionsActions; - private readonly Action[] slotCallbacks = new Action[SLOT_COUNT]; - - // One-frame buffer for the input event. Set on the input thread by the slot callback, - // consumed in Update. Same shape as UpdateEmoteInputSystem.triggeredEmote. - private int pendingExpressionIndex = -1; - - internal UpdateFaceExpressionInputSystem(World world, AvatarFaceExpressionDefinition[] expressions) : base(world) - { - this.expressions = expressions; - faceExpressionsActions = DCLInput.Instance.FaceExpressions; - - InputActionMap actionMap = faceExpressionsActions.Get(); - - for (var i = 0; i < SLOT_COUNT; i++) - { - int expressionIndex = i; - slotCallbacks[i] = _ => pendingExpressionIndex = expressionIndex; - - try - { - InputAction action = actionMap.FindAction($"Slot {i + 1}"); - action.started += slotCallbacks[i]; - } - catch (Exception e) { ReportHub.LogException(e, GetReportData()); } - } - } - - protected override void OnDispose() - { - InputActionMap actionMap = faceExpressionsActions.Get(); - - for (var i = 0; i < SLOT_COUNT; i++) - { - try - { - InputAction action = actionMap.FindAction($"Slot {i + 1}"); - action.started -= slotCallbacks[i]; - } - catch (Exception e) { ReportHub.LogException(e, GetReportData()); } - } - } - - protected override void Update(float t) - { - // Ensure LocalPlayerFacialExpressionComponent exists before the apply query runs. - SetupNetworkExpressionComponentQuery(World); - - if (pendingExpressionIndex < 0) - return; - - // Out of range (no expression configured for this slot) — drop the input. - if (pendingExpressionIndex >= expressions.Length) - { - pendingExpressionIndex = -1; - return; - } - - ApplyExpressionToPlayerQuery(World, pendingExpressionIndex); - pendingExpressionIndex = -1; - } - - /// - /// Adds to the player entity as soon as - /// is available (i.e. after avatar load). Runs at most - /// once per player entity thanks to the [None] filter. - /// - [Query] - [All(typeof(PlayerComponent), typeof(AvatarFaceComponent))] - [None(typeof(LocalPlayerFacialExpressionComponent), typeof(DeleteEntityIntention))] - private void SetupNetworkExpressionComponent(in Entity entity) - { - World.Add(entity, new LocalPlayerFacialExpressionComponent()); - } - - [Query] - [All(typeof(PlayerComponent), typeof(AvatarFaceComponent))] - [None(typeof(DeleteEntityIntention))] - private void ApplyExpressionToPlayer( - [Data] int expressionIndex, - ref AvatarFaceComponent face, - ref LocalPlayerFacialExpressionComponent network) - { - AvatarFaceExpressionDefinition def = expressions[expressionIndex]; - - face.EyebrowsExpressionIndex = def.EyebrowsIndex; - face.EyesExpressionIndex = def.EyesIndex; - face.MouthExpressionIndex = def.MouthIndex; - face.IsDirty = true; - - network.EyebrowsIndex = (byte)def.EyebrowsIndex; - network.EyesIndex = (byte)def.EyesIndex; - network.MouthIndex = (byte)def.MouthIndex; - } - } -} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFaceExpressionInputSystem.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFaceExpressionInputSystem.cs.meta deleted file mode 100644 index c9386c19361..00000000000 --- a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFaceExpressionInputSystem.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: ee524cb980161dd4d98e3164d05eedbb \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFacialExpressionInputSystem.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFacialExpressionInputSystem.cs new file mode 100644 index 00000000000..f0829091004 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFacialExpressionInputSystem.cs @@ -0,0 +1,111 @@ +using Arch.Core; +using Arch.System; +using Arch.SystemGroups; +using DCL.AvatarRendering.AvatarShape.Components; +using DCL.AvatarRendering.AvatarShape.FacialExpression; +using DCL.Character.Components; +using DCL.Diagnostics; +using DCL.FacialExpressionsWheel; +using DCL.Input; +using ECS.Abstract; +using ECS.LifeCycle.Components; +using System; +using System.Collections.Generic; +using UnityEngine.InputSystem; +using InputAction = UnityEngine.InputSystem.InputAction; + +namespace DCL.AvatarRendering.AvatarShape +{ + /// + /// Listens to the FaceExpressions input map (Y+[0-9]) and writes a + /// on the local player. Notifies + /// so the upcoming Y release + /// doesn't toggle the wheel. + /// + [LogCategory(ReportCategory.AVATAR)] + [UpdateInGroup(typeof(InputGroup))] + public partial class UpdateFacialExpressionInputSystem : BaseUnityLoopSystem + { + private const int SLOT_COUNT = 10; + + private readonly AvatarFaceExpressionConfig config; + private readonly FacialExpressionsWheelShortcutHandler shortcutHandler; + private readonly DCLInput.FaceExpressionsActions actions; + private readonly Dictionary slotByActionName = new (); + + private int triggeredSlot = -1; + + internal UpdateFacialExpressionInputSystem( + World world, + AvatarFaceExpressionConfig config, + FacialExpressionsWheelShortcutHandler shortcutHandler) : base(world) + { + this.config = config; + this.shortcutHandler = shortcutHandler; + actions = DCLInput.Instance.FaceExpressions; + ListenToSlotsInput(actions.Get()); + } + + protected override void OnDispose() + { + UnregisterSlotsInput(actions.Get()); + } + + protected override void Update(float t) + { + if (triggeredSlot < 0) return; + + if (triggeredSlot < config.Expressions.Length) + { + ApplyFaceQuery(World, triggeredSlot); + shortcutHandler.NotifyExpressionPlayed(FacialExpressionTriggerSource.SHORTCUT); + } + + triggeredSlot = -1; + } + + [Query] + [All(typeof(PlayerComponent))] + [None(typeof(DeleteEntityIntention))] + private void ApplyFace([Data] int slot, in Entity entity) + { + ref AvatarFaceExpressionDefinition def = ref config.Expressions[slot]; + + World.AddOrGet(entity, new TriggerFacialExpressionIntent + { + EyebrowsIndex = (byte)def.EyebrowsIndex, + EyesIndex = (byte)def.EyesIndex, + MouthIndex = (byte)def.MouthIndex, + }); + } + + private void OnSlotPerformed(InputAction.CallbackContext ctx) => + triggeredSlot = slotByActionName[ctx.action.name]; + + private void ListenToSlotsInput(InputActionMap map) + { + for (var i = 0; i < SLOT_COUNT; i++) + { + string name = FacialExpressionWheelUtils.GetSlotActionName(i); + + try + { + InputAction action = map.FindAction(name); + action.started += OnSlotPerformed; + slotByActionName[name] = FacialExpressionWheelUtils.SlotIndexFromActionName(name); + } + catch (Exception e) { ReportHub.LogException(e, GetReportData()); } + } + } + + private void UnregisterSlotsInput(InputActionMap map) + { + for (var i = 0; i < SLOT_COUNT; i++) + { + string name = FacialExpressionWheelUtils.GetSlotActionName(i); + InputAction action = map.FindAction(name); + action.started -= OnSlotPerformed; + } + } + } +} diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFacialExpressionInputSystem.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFacialExpressionInputSystem.cs.meta new file mode 100644 index 00000000000..b537556dcdf --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/UpdateFacialExpressionInputSystem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 398f540048a2ffa4b8ccdb75c2e9fb2a \ No newline at end of file diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs index aa8a5c5a38c..8e106680b0f 100644 --- a/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs @@ -19,10 +19,6 @@ namespace DCL.FacialExpressionsWheel { public class FacialExpressionsWheelController : ControllerBase { - // Mirrors EmoteWheelShortcutHandler.QUICK_EMOTE_LOCK_TIME so a fast Y release after - // a slot click doesn't immediately re-toggle the wheel. - private const float QUICK_APPLY_LOCK_TIME = 0.5f; - // Atlas grid is 4x4 = 16 slices per channel (see AvatarFacialExpressionConstants). private const int CHANNEL_ATLAS_SIZE = 16; @@ -33,11 +29,8 @@ public class FacialExpressionsWheelController : ControllerBase @@ -223,45 +200,6 @@ private void OnSlotNumberPressed(InputAction.CallbackContext context) pendingChanged = true; } - private void OnFaceExpressionsQuickApply(InputAction.CallbackContext context) - { - int slot = FacialExpressionWheelUtils.SlotIndexFromActionName(context.action.name); - AvatarFaceExpressionDefinition def = expressionConfig.Expressions[slot]; - - applier.Apply((byte)def.EyebrowsIndex, (byte)def.EyesIndex, (byte)def.MouthIndex); - - if (State != ControllerState.ViewHidden && State != ControllerState.ViewHiding) - { - // Face already applied via shortcut; skip the on-close commit. - pendingChanged = false; - Close(); - } - else - { - ignoreNextRelease = true; - } - } - - private void OnFaceExpressionShortcutReleased(InputAction.CallbackContext _) - { - if (ignoreNextRelease) - { - ignoreNextRelease = false; - return; - } - - if (Time.time < lockUntilTime) - { - lockUntilTime = 0f; - return; - } - - if (State != ControllerState.ViewHidden && State != ControllerState.ViewHiding) - Close(); - else - mvcManager.ShowAndForget(IssueCommand()); - } - private void SwapToEmotes() { // Swap discards pending face changes; user is bailing out of the face wheel. diff --git a/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs b/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs index afedabdf77a..76a72cacf1b 100644 --- a/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs +++ b/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs @@ -825,7 +825,8 @@ await MapRendererContainer defaultTexturesContainer.TextureArrayContainerFactory, wearableCatalog, userBlockingCache, - includeBannedUsersFromScene), + includeBannedUsersFromScene, + emotesEventBus), new MainUIPlugin(mvcManager, mainUIView, includeFriends), new ProfilePlugin(profilesRepository, profileCache, staticContainer.CacheCleaner), new MapRendererPlugin(mapRendererContainer.MapRenderer), @@ -1152,6 +1153,8 @@ await MapRendererContainer nearbyMuteService) ); + globalPlugins.Add(new MouthAnimationPlugin(chatHistory, roomHub, voiceChatContainer.VoiceChatOrchestrator)); + if (!appArgs.HasDebugFlag() || !appArgs.HasFlagWithValueFalse(AppArgsFlags.LANDSCAPE_TERRAIN_ENABLED)) globalPlugins.Add(terrainContainer.CreatePlugin(staticContainer, bootstrapContainer, mapRendererContainer, debugBuilder)); diff --git a/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/MainSceneLoader.cs b/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/MainSceneLoader.cs index 6cf43b85431..032f0d2a3a1 100644 --- a/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/MainSceneLoader.cs +++ b/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/MainSceneLoader.cs @@ -587,9 +587,10 @@ private void DisableInputs() private void RestoreInputs() { // We enable Inputs through the inputBlock so the block counters can be properly updated and the component Active flags are up-to-date as well - // We restore all inputs except EmoteWheel and FreeCamera as they should be disabled by default + // We restore all inputs except EmoteWheel, FacialExpressionsWheel and FreeCamera as they should be disabled by default staticContainer!.InputBlock.EnableAll(InputMapComponent.Kind.FREE_CAMERA, - InputMapComponent.Kind.EMOTE_WHEEL); + InputMapComponent.Kind.EMOTE_WHEEL, + InputMapComponent.Kind.FACE_EXPRESSIONS_WHEEL); DCLInput.Instance.UI.Enable(); } diff --git a/Explorer/Assets/DCL/Input/Component/InputMapComponent.cs b/Explorer/Assets/DCL/Input/Component/InputMapComponent.cs index 1036fc7cca0..35fc9f2b71e 100644 --- a/Explorer/Assets/DCL/Input/Component/InputMapComponent.cs +++ b/Explorer/Assets/DCL/Input/Component/InputMapComponent.cs @@ -31,6 +31,8 @@ public enum Kind SHORTCUTS = 1 << 5, IN_WORLD_CAMERA = 1 << 6, VOICE_CHAT = 1 << 7, + FACE_EXPRESSIONS_WHEEL = 1 << 8, + FACE_EXPRESSIONS = 1 << 9, } private Kind active; diff --git a/Explorer/Assets/DCL/Input/Systems/ApplyInputMapsSystem.cs b/Explorer/Assets/DCL/Input/Systems/ApplyInputMapsSystem.cs index 032e25d0d69..a2fb0e0c08a 100644 --- a/Explorer/Assets/DCL/Input/Systems/ApplyInputMapsSystem.cs +++ b/Explorer/Assets/DCL/Input/Systems/ApplyInputMapsSystem.cs @@ -65,6 +65,12 @@ protected override void Update(float t) case InputMapComponent.Kind.VOICE_CHAT: SetActionMapEnabled(isActive, DCLInput.Instance.VoiceChat); break; + case InputMapComponent.Kind.FACE_EXPRESSIONS_WHEEL: + SetActionMapEnabled(isActive, DCLInput.Instance.FaceExpressionsWheel); + break; + case InputMapComponent.Kind.FACE_EXPRESSIONS: + SetActionMapEnabled(isActive, DCLInput.Instance.FaceExpressions); + break; } } } diff --git a/Explorer/Assets/DCL/PluginSystem/Global/AvatarPlugin.cs b/Explorer/Assets/DCL/PluginSystem/Global/AvatarPlugin.cs index 3ab313d63f2..34660c99301 100644 --- a/Explorer/Assets/DCL/PluginSystem/Global/AvatarPlugin.cs +++ b/Explorer/Assets/DCL/PluginSystem/Global/AvatarPlugin.cs @@ -23,6 +23,7 @@ using DCL.AvatarRendering.AvatarShape; using DCL.AvatarRendering.AvatarShape.Assets; using DCL.AvatarRendering.AvatarShape.Components; +using DCL.AvatarRendering.AvatarShape.FacialExpression; using DCL.AvatarRendering.AvatarShape.Helpers; using DCL.AvatarRendering.Loading.Assets; using DCL.ECSComponents; @@ -95,7 +96,9 @@ public class AvatarPlugin : IDCLGlobalPlugin private FacialFeaturesTextures[] facialFeaturesTextures; private AvatarFaceAnimationSettings? faceAnimationSettings; - private AvatarFaceExpressionDefinition[] faceExpressions = Array.Empty(); + private AvatarFaceExpressionConfig? faceExpressionConfig; + private FacialExpressionsWheelShortcutHandler? facialExpressionsWheelShortcutHandler; + private readonly IEventBus eventBus; public AvatarPlugin( IComponentPoolsRegistry poolsRegistry, @@ -111,9 +114,11 @@ public AvatarPlugin( TextureArrayContainerFactory textureArrayContainerFactory, IWearableStorage wearableStorage, IUserBlockingCache userBlockingCache, - bool includeBannedUsersFromScene) + bool includeBannedUsersFromScene, + IEventBus eventBus) { this.assetsProvisioner = assetsProvisioner; + this.eventBus = eventBus; this.frameTimeCapBudget = frameTimeCapBudget; this.realmData = realmData; this.mainPlayerAvatarBaseProxy = mainPlayerAvatarBaseProxy; @@ -137,6 +142,7 @@ public void Dispose() { attachmentsAssetsCache.Dispose(); avatarTransformMatrixJobWrapper.Dispose(); + facialExpressionsWheelShortcutHandler?.Dispose(); UnityObjectUtils.SafeDestroyGameObject(poolParent); } @@ -161,8 +167,8 @@ public async UniTask InitializeAsync(AvatarShapeSettings settings, CancellationT if (settings.FaceExpressionConfig != null && !string.IsNullOrEmpty(settings.FaceExpressionConfig.AssetGUID)) { - AvatarFaceExpressionConfig config = (await assetsProvisioner.ProvideMainAssetAsync(settings.FaceExpressionConfig, ct)).Value; - faceExpressions = config.Expressions ?? Array.Empty(); + faceExpressionConfig = (await assetsProvisioner.ProvideMainAssetAsync(settings.FaceExpressionConfig, ct)).Value; + facialExpressionsWheelShortcutHandler = new FacialExpressionsWheelShortcutHandler(eventBus); } debugContainerBuilder.TryAddWidget("Nametags") @@ -209,9 +215,12 @@ public void InjectToWorld(ref ArchSystemsWorldBuilder builder, if (faceAnimationSettings != null) { AvatarFacialExpressionSystem.InjectToWorld(ref builder, faceAnimationSettings, eyebrowsTextureArray: null, eyeTextureArray: null, mouthPoseTextureArray: null); - UpdateFaceExpressionInputSystem.InjectToWorld(ref builder, faceExpressions); + ApplyFacialExpressionIntentSystem.InjectToWorld(ref builder); } + if (faceExpressionConfig != null && facialExpressionsWheelShortcutHandler != null) + UpdateFacialExpressionInputSystem.InjectToWorld(ref builder, faceExpressionConfig, facialExpressionsWheelShortcutHandler); + //Debug scripts InstantiateRandomAvatarsSystem.InjectToWorld(ref builder, debugContainerBuilder, realmData, transformPoolRegistry, avatarRandomizerAsset); #if UNITY_EDITOR diff --git a/Explorer/Assets/DCL/PluginSystem/Global/MouthAnimationPlugin.cs b/Explorer/Assets/DCL/PluginSystem/Global/MouthAnimationPlugin.cs new file mode 100644 index 00000000000..79e9b82a0ff --- /dev/null +++ b/Explorer/Assets/DCL/PluginSystem/Global/MouthAnimationPlugin.cs @@ -0,0 +1,27 @@ +using Arch.SystemGroups; +using DCL.AvatarRendering.AvatarShape; +using DCL.Chat.History; +using DCL.Multiplayer.Connections.RoomHubs; +using DCL.VoiceChat; + +namespace DCL.PluginSystem.Global +{ + public class MouthAnimationPlugin : IDCLGlobalPluginWithoutSettings + { + private readonly IChatHistory chatHistory; + private readonly IRoomHub roomHub; + private readonly IVoiceChatOrchestratorState voiceChatOrchestratorState; + + public MouthAnimationPlugin(IChatHistory chatHistory, IRoomHub roomHub, IVoiceChatOrchestratorState voiceChatOrchestratorState) + { + this.chatHistory = chatHistory; + this.roomHub = roomHub; + this.voiceChatOrchestratorState = voiceChatOrchestratorState; + } + + public void InjectToWorld(ref ArchSystemsWorldBuilder builder, in GlobalPluginArguments arguments) + { + MouthAnimationSystem.InjectToWorld(ref builder, chatHistory, roomHub.VoiceChatRoom().Room(), voiceChatOrchestratorState); + } + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/PluginSystem/Global/MouthAnimationPlugin.cs.meta b/Explorer/Assets/DCL/PluginSystem/Global/MouthAnimationPlugin.cs.meta new file mode 100644 index 00000000000..f46418db0fb --- /dev/null +++ b/Explorer/Assets/DCL/PluginSystem/Global/MouthAnimationPlugin.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6e2316abbbe35db4485d4c8a0db52a01 \ No newline at end of file From 061ecf0880291af6d1740bce85f90845f0391425 Mon Sep 17 00:00:00 2001 From: Alejandro Jimenez Date: Mon, 11 May 2026 12:34:30 +0200 Subject: [PATCH 13/28] refactor(avatar): tighten facial expression seams Inline FacialExpressionApplier as a static util and drop the matching interface; the wheel takes World+Entity directly and calls Apply(). Move the applier out of the FacialExpression subfolder so it lives in the AvatarShape assembly, reachable from the wheel (DCL.Social), which the prior asmref-to-Plugins indirection had silently broken. Relocate LocalPlayerFacialExpressionComponent from DCL.Multiplayer.Movement to DCL.Multiplayer.FacialExpression next to its only consumer (PlayerFacialExpressionNetSendSystem), and fix the stale xmldoc that pointed at the old PlayerMovementNetSendSystem path. In ApplyFacialExpressionIntentSystem: rename the network-flavored query to SetupLocalPlayerFacialExpression, rename the ref param network->local, and drop the redundant `in Entity` per code standards (Entity is a small value type and the query mutates). Fold FacialExpressionTriggerSource into FacialExpressionsWheelShortcutHandler (single-use enum), drop the unjustified virtual on NotifyExpressionPlayed, inline StashRemoteMessage into OnChatMessageAdded, and turn EnqueueSpeaking into a local function inside OnActiveSpeakersUpdated. --- .../FacialExpressionApplier.cs | 27 ------------------- .../FacialExpressionTriggerSource.cs | 11 -------- .../FacialExpressionTriggerSource.cs.meta | 2 -- .../FacialExpressionsWheelShortcutHandler.cs | 11 +++++++- .../IFacialExpressionApplier.cs | 12 --------- .../IFacialExpressionApplier.cs.meta | 2 -- .../AvatarShape/FacialExpressionApplier.cs | 18 +++++++++++++ .../FacialExpressionApplier.cs.meta | 0 .../ApplyFacialExpressionIntentSystem.cs | 16 +++++------ .../FacialExpression/MouthAnimationSystem.cs | 26 +++++++++--------- .../FacialExpressionsWheelController.cs | 12 ++++++--- .../LocalPlayerFacialExpressionComponent.cs | 6 ++--- ...calPlayerFacialExpressionComponent.cs.meta | 0 .../PlayerFacialExpressionNetSendSystem.cs | 1 - 14 files changed, 59 insertions(+), 85 deletions(-) delete mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionApplier.cs delete mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionTriggerSource.cs delete mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionTriggerSource.cs.meta delete mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/IFacialExpressionApplier.cs delete mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/IFacialExpressionApplier.cs.meta create mode 100644 Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpressionApplier.cs rename Explorer/Assets/DCL/AvatarRendering/AvatarShape/{FacialExpression => }/FacialExpressionApplier.cs.meta (100%) rename Explorer/Assets/DCL/Multiplayer/{Movement/Components => FacialExpression}/LocalPlayerFacialExpressionComponent.cs (70%) rename Explorer/Assets/DCL/Multiplayer/{Movement/Components => FacialExpression}/LocalPlayerFacialExpressionComponent.cs.meta (100%) diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionApplier.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionApplier.cs deleted file mode 100644 index 524fe77b7f6..00000000000 --- a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionApplier.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Arch.Core; -using DCL.AvatarRendering.AvatarShape.Components; - -namespace DCL.AvatarRendering.AvatarShape.FacialExpression -{ - public class FacialExpressionApplier : IFacialExpressionApplier - { - private readonly World world; - private readonly Entity playerEntity; - - public FacialExpressionApplier(World world, Entity playerEntity) - { - this.world = world; - this.playerEntity = playerEntity; - } - - public void Apply(byte eyebrowsIndex, byte eyesIndex, byte mouthIndex) - { - world.AddOrGet(playerEntity, new TriggerFacialExpressionIntent - { - EyebrowsIndex = eyebrowsIndex, - EyesIndex = eyesIndex, - MouthIndex = mouthIndex, - }); - } - } -} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionTriggerSource.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionTriggerSource.cs deleted file mode 100644 index 74245dcf8d5..00000000000 --- a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionTriggerSource.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace DCL.AvatarRendering.AvatarShape.FacialExpression -{ - public enum FacialExpressionTriggerSource - { - /// Click on a wheel slot, press [0-9], or use a cycler while the wheel is open. - WHEEL_SLOT, - - /// Press Y+[0-9] while the wheel is closed. - SHORTCUT, - } -} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionTriggerSource.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionTriggerSource.cs.meta deleted file mode 100644 index ad323ea158e..00000000000 --- a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionTriggerSource.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 3562ae6ee1c567045bee9bad363829d0 \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionsWheelShortcutHandler.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionsWheelShortcutHandler.cs index ee1c30abf04..07abfa69b10 100644 --- a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionsWheelShortcutHandler.cs +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionsWheelShortcutHandler.cs @@ -5,6 +5,15 @@ namespace DCL.AvatarRendering.AvatarShape.FacialExpression { + public enum FacialExpressionTriggerSource + { + /// Click on a wheel slot, press [0-9], or use a cycler while the wheel is open. + WHEEL_SLOT, + + /// Press Y+[0-9] while the wheel is closed. + SHORTCUT, + } + /// /// Owns the Y key (facial expressions shortcut) release handling. Receives expression-played /// notifications via ; when Y is released, applies @@ -31,7 +40,7 @@ public FacialExpressionsWheelShortcutHandler(IEventBus eventBus) public void Dispose() => dclInput.Shortcuts.FaceExpression.canceled -= OnShortcutReleased; - public virtual void NotifyExpressionPlayed(FacialExpressionTriggerSource source) + public void NotifyExpressionPlayed(FacialExpressionTriggerSource source) { switch (source) { diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/IFacialExpressionApplier.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/IFacialExpressionApplier.cs deleted file mode 100644 index 7c97a9da1cb..00000000000 --- a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/IFacialExpressionApplier.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace DCL.AvatarRendering.AvatarShape.FacialExpression -{ - /// - /// Single seam between non-ECS layers (wheel controller) and the player entity: - /// writes a the next frame. - /// Lets callers stay world-free. - /// - public interface IFacialExpressionApplier - { - void Apply(byte eyebrowsIndex, byte eyesIndex, byte mouthIndex); - } -} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/IFacialExpressionApplier.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/IFacialExpressionApplier.cs.meta deleted file mode 100644 index 1fb12003a0a..00000000000 --- a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/IFacialExpressionApplier.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: e6304dd24dafd6248ab67252edbcbc17 \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpressionApplier.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpressionApplier.cs new file mode 100644 index 00000000000..b5084d0b172 --- /dev/null +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpressionApplier.cs @@ -0,0 +1,18 @@ +using Arch.Core; +using DCL.AvatarRendering.AvatarShape.Components; + +namespace DCL.AvatarRendering.AvatarShape.FacialExpression +{ + public static class FacialExpressionApplier + { + public static void Apply(World world, Entity playerEntity, byte eyebrowsIndex, byte eyesIndex, byte mouthIndex) + { + world.AddOrGet(playerEntity, new TriggerFacialExpressionIntent + { + EyebrowsIndex = eyebrowsIndex, + EyesIndex = eyesIndex, + MouthIndex = mouthIndex, + }); + } + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionApplier.cs.meta b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpressionApplier.cs.meta similarity index 100% rename from Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionApplier.cs.meta rename to Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpressionApplier.cs.meta diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/ApplyFacialExpressionIntentSystem.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/ApplyFacialExpressionIntentSystem.cs index 72dcd4f05b7..d08aaf8b59c 100644 --- a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/ApplyFacialExpressionIntentSystem.cs +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/ApplyFacialExpressionIntentSystem.cs @@ -5,7 +5,7 @@ using DCL.Character.Components; using DCL.Diagnostics; using DCL.Input; -using DCL.Multiplayer.Movement; +using DCL.Multiplayer.FacialExpression; using ECS.Abstract; using ECS.LifeCycle.Components; @@ -26,7 +26,7 @@ internal ApplyFacialExpressionIntentSystem(World world) : base(world) { } protected override void Update(float t) { - SetupNetworkExpressionComponentQuery(World); + SetupLocalPlayerFacialExpressionQuery(World); ApplyIntentQuery(World); } @@ -38,7 +38,7 @@ protected override void Update(float t) [Query] [All(typeof(PlayerComponent), typeof(AvatarFaceComponent))] [None(typeof(LocalPlayerFacialExpressionComponent), typeof(DeleteEntityIntention))] - private void SetupNetworkExpressionComponent(in Entity entity) + private void SetupLocalPlayerFacialExpression(Entity entity) { World.Add(entity, new LocalPlayerFacialExpressionComponent()); } @@ -47,9 +47,9 @@ private void SetupNetworkExpressionComponent(in Entity entity) [All(typeof(PlayerComponent), typeof(AvatarFaceComponent))] [None(typeof(DeleteEntityIntention))] private void ApplyIntent( - in Entity entity, + Entity entity, ref AvatarFaceComponent face, - ref LocalPlayerFacialExpressionComponent network, + ref LocalPlayerFacialExpressionComponent local, ref TriggerFacialExpressionIntent intent) { face.EyebrowsExpressionIndex = intent.EyebrowsIndex; @@ -57,9 +57,9 @@ private void ApplyIntent( face.MouthExpressionIndex = intent.MouthIndex; face.IsDirty = true; - network.EyebrowsIndex = intent.EyebrowsIndex; - network.EyesIndex = intent.EyesIndex; - network.MouthIndex = intent.MouthIndex; + local.EyebrowsIndex = intent.EyebrowsIndex; + local.EyesIndex = intent.EyesIndex; + local.MouthIndex = intent.MouthIndex; World.Remove(entity); } diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/MouthAnimationSystem.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/MouthAnimationSystem.cs index cee8c657864..97c689e4298 100644 --- a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/MouthAnimationSystem.cs +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Systems/FacialExpression/MouthAnimationSystem.cs @@ -130,20 +130,18 @@ private void OnChatMessageAdded(ChatChannel _, ChatMessage msg, int __) if (msg.IsSystemMessage) return; if (msg.IsSentByOwnUser) + { pendingSelf.Message = msg.Message; - else - StashRemoteMessage(msg.SenderWalletAddress, msg.Message); - } + return; + } - private void StashRemoteMessage(string walletId, string message) - { - if (pendingByWallet.TryGetValue(walletId, out PendingInput existing)) + if (pendingByWallet.TryGetValue(msg.SenderWalletAddress, out PendingInput existing)) { - existing.Message = message; - pendingByWallet[walletId] = existing; + existing.Message = msg.Message; + pendingByWallet[msg.SenderWalletAddress] = existing; } else - pendingByWallet[walletId] = new PendingInput { Message = message }; + pendingByWallet[msg.SenderWalletAddress] = new PendingInput { Message = msg.Message }; } private void StashSpeaking(string walletId, bool isSpeaking, bool isSelf) @@ -181,12 +179,12 @@ private void OnActiveSpeakersUpdated() activeSpeakers.Clear(); activeSpeakers.UnionWith(nextActiveSpeakers); - } - private void EnqueueSpeaking(string participantId, bool isSpeaking) - { - bool isSelf = voiceChatRoom.Participants.LocalParticipant()?.Identity == participantId; - StashSpeaking(participantId, isSpeaking, isSelf); + void EnqueueSpeaking(string participantId, bool isSpeaking) + { + bool isSelf = voiceChatRoom.Participants.LocalParticipant()?.Identity == participantId; + StashSpeaking(participantId, isSpeaking, isSelf); + } } private void OnParticipantUpdated(LKParticipant participant, UpdateFromParticipant update) diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs index 8e106680b0f..3ab4b90f560 100644 --- a/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs @@ -1,3 +1,4 @@ +using Arch.Core; using Cysharp.Threading.Tasks; using DCL.AvatarRendering.AvatarShape; using DCL.AvatarRendering.AvatarShape.FacialExpression; @@ -26,7 +27,8 @@ public class FacialExpressionsWheelController : ControllerBase /// Mirrors the local player's current facial expression indices so - /// can include them in every movement + /// can include them in every outbound /// packet without taking a dependency on the AvatarShape assembly. /// public struct LocalPlayerFacialExpressionComponent @@ -11,4 +11,4 @@ public struct LocalPlayerFacialExpressionComponent public byte EyesIndex; public byte MouthIndex; } -} \ No newline at end of file +} diff --git a/Explorer/Assets/DCL/Multiplayer/Movement/Components/LocalPlayerFacialExpressionComponent.cs.meta b/Explorer/Assets/DCL/Multiplayer/FacialExpression/LocalPlayerFacialExpressionComponent.cs.meta similarity index 100% rename from Explorer/Assets/DCL/Multiplayer/Movement/Components/LocalPlayerFacialExpressionComponent.cs.meta rename to Explorer/Assets/DCL/Multiplayer/FacialExpression/LocalPlayerFacialExpressionComponent.cs.meta diff --git a/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/PlayerFacialExpressionNetSendSystem.cs b/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/PlayerFacialExpressionNetSendSystem.cs index 8866291d4cc..a5fcab8fd08 100644 --- a/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/PlayerFacialExpressionNetSendSystem.cs +++ b/Explorer/Assets/DCL/Multiplayer/FacialExpression/Systems/PlayerFacialExpressionNetSendSystem.cs @@ -3,7 +3,6 @@ using Arch.SystemGroups; using Arch.SystemGroups.DefaultSystemGroups; using DCL.Diagnostics; -using DCL.Multiplayer.Movement; using ECS.Abstract; namespace DCL.Multiplayer.FacialExpression.Systems From ab727fcd3d6a1e39aabc9ecb5d7271e65370da28 Mon Sep 17 00:00:00 2001 From: Alejandro Jimenez Date: Mon, 11 May 2026 17:23:39 +0200 Subject: [PATCH 14/28] feat(avatar): wheel HUD prefab + plugin wiring Slot prefab + HUD prefab with 10 radial slot instances (R=270). Move expression icons to Assets/Textures/FacialExpressionsWheel. Register FacialExpressionsWheelPlugin in DynamicWorldContainer. Qualify UnityEngine.Time to avoid DCL.Time namespace shadow. Cycler buttons not wired yet. --- .../FacialExpressionsWheelShortcutHandler.cs | 6 +- .../{Textures.meta => Assets.meta} | 2 +- .../Assets/FacialExpressionSlot.prefab | 648 +++++ .../Assets/FacialExpressionSlot.prefab.meta | 7 + .../Assets/FacialExpressionsWheelHUD.prefab | 2260 +++++++++++++++++ .../FacialExpressionsWheelHUD.prefab.meta | 7 + .../FacialExpressionsWheelController.cs | 2 +- .../Global/Dynamic/DynamicWorldContainer.cs | 11 + .../Global/FacialExpressionsWheelPlugin.cs | 116 + .../FacialExpressionsWheelPlugin.cs.meta | 2 + .../FacialExpressionsWheel.meta} | 0 .../FacialExpressionsWheel}/Angry.png | 0 .../FacialExpressionsWheel}/Angry.png.meta | 0 .../FacialExpressionsWheel}/Dizzy.png | 0 .../FacialExpressionsWheel}/Dizzy.png.meta | 0 .../ExpressionSlotHover.png | 0 .../ExpressionSlotHover.png.meta | 4 +- .../ExpressionSlotIdle.png | 0 .../ExpressionSlotIdle.png.meta | 4 +- .../ExpressionSlotSelected.png | 0 .../ExpressionSlotSelected.png.meta | 4 +- .../FacialExpressionsWheel}/Happy.png | 0 .../FacialExpressionsWheel}/Happy.png.meta | 0 .../FacialExpressionsWheel}/Idle.png | 0 .../FacialExpressionsWheel}/Idle.png.meta | 0 .../FacialExpressionsWheel}/Relaxed.png | 0 .../FacialExpressionsWheel}/Relaxed.png.meta | 0 .../FacialExpressionsWheel}/Sad.png | 0 .../FacialExpressionsWheel}/Sad.png.meta | 0 .../FacialExpressionsWheel}/Smirk.png | 0 .../FacialExpressionsWheel}/Smirk.png.meta | 0 .../FacialExpressionsWheel}/Surprised.png | 0 .../Surprised.png.meta | 0 .../FacialExpressionsWheel}/WinkLeft.png | 0 .../FacialExpressionsWheel}/WinkLeft.png.meta | 0 .../FacialExpressionsWheel}/WinkRight.png | 0 .../WinkRight.png.meta | 0 37 files changed, 3062 insertions(+), 11 deletions(-) rename Explorer/Assets/DCL/FacialExpressionsWheel/{Textures.meta => Assets.meta} (77%) create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionSlot.prefab create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionSlot.prefab.meta create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionsWheelHUD.prefab create mode 100644 Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionsWheelHUD.prefab.meta create mode 100644 Explorer/Assets/DCL/PluginSystem/Global/FacialExpressionsWheelPlugin.cs create mode 100644 Explorer/Assets/DCL/PluginSystem/Global/FacialExpressionsWheelPlugin.cs.meta rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons.meta => Textures/FacialExpressionsWheel.meta} (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/Angry.png (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/Angry.png.meta (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/Dizzy.png (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/Dizzy.png.meta (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/ExpressionSlotHover.png (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/ExpressionSlotHover.png.meta (98%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/ExpressionSlotIdle.png (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/ExpressionSlotIdle.png.meta (98%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/ExpressionSlotSelected.png (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/ExpressionSlotSelected.png.meta (98%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/Happy.png (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/Happy.png.meta (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/Idle.png (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/Idle.png.meta (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/Relaxed.png (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/Relaxed.png.meta (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/Sad.png (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/Sad.png.meta (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/Smirk.png (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/Smirk.png.meta (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/Surprised.png (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/Surprised.png.meta (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/WinkLeft.png (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/WinkLeft.png.meta (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/WinkRight.png (100%) rename Explorer/Assets/{DCL/FacialExpressionsWheel/Textures/ExpressionIcons => Textures/FacialExpressionsWheel}/WinkRight.png.meta (100%) diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionsWheelShortcutHandler.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionsWheelShortcutHandler.cs index 07abfa69b10..f69f9de109a 100644 --- a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionsWheelShortcutHandler.cs +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/FacialExpression/FacialExpressionsWheelShortcutHandler.cs @@ -48,7 +48,7 @@ public void NotifyExpressionPlayed(FacialExpressionTriggerSource source) ignoreNextRelease = true; break; case FacialExpressionTriggerSource.WHEEL_SLOT: - lockUntilTime = Time.time + QUICK_APPLY_LOCK_TIME; + lockUntilTime = UnityEngine.Time.time + QUICK_APPLY_LOCK_TIME; break; default: throw new ArgumentOutOfRangeException(nameof(source), source, null); @@ -63,7 +63,7 @@ private void OnShortcutReleased(InputAction.CallbackContext _) return; } - if (Time.time < lockUntilTime) + if (UnityEngine.Time.time < lockUntilTime) { lockUntilTime = 0f; return; @@ -72,4 +72,4 @@ private void OnShortcutReleased(InputAction.CallbackContext _) eventBus.Publish(new RequestToggleFacialExpressionsWheelEvent()); } } -} \ No newline at end of file +} diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/Assets.meta similarity index 77% rename from Explorer/Assets/DCL/FacialExpressionsWheel/Textures.meta rename to Explorer/Assets/DCL/FacialExpressionsWheel/Assets.meta index 30b3e0b4004..f6af738daad 100644 --- a/Explorer/Assets/DCL/FacialExpressionsWheel/Textures.meta +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Assets.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 79614b1a4cb16cd478e8711af775c155 +guid: bc021b20a2bc28c4389410603ae147c2 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionSlot.prefab b/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionSlot.prefab new file mode 100644 index 00000000000..48b5a8cd0f3 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionSlot.prefab @@ -0,0 +1,648 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2242939787842482075 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5294823707738111947} + - component: {fileID: 8209566919986367981} + - component: {fileID: 428376574878408969} + m_Layer: 5 + m_Name: Thumbnail + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5294823707738111947 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2242939787842482075} + 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_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 8974564133226285288} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 7} + m_SizeDelta: {x: 90, y: 90} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8209566919986367981 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2242939787842482075} + m_CullTransparentMesh: 1 +--- !u!114 &428376574878408969 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2242939787842482075} + 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: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: d32628cd806b94f44b8de91e17649985, type: 3} + m_Type: 0 + 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 &2404154631228158664 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4063225283202921380} + - component: {fileID: 3925924027178008141} + - component: {fileID: 1072704683713788848} + m_Layer: 5 + m_Name: Key + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4063225283202921380 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2404154631228158664} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8974564133226285288} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 0, y: 8} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0} +--- !u!222 &3925924027178008141 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2404154631228158664} + m_CullTransparentMesh: 0 +--- !u!114 &1072704683713788848 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2404154631228158664} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 1 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 96ae0a2159a39234f858ea23bdcc74ad, type: 2} + m_sharedMaterial: {fileID: 735423033564544980, guid: 96ae0a2159a39234f858ea23bdcc74ad, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4279768342 + m_fontColor: {r: 0.08627451, g: 0.08235294, b: 0.09411765, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 18 + m_fontSizeBase: 18 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 10 + m_fontSizeMax: 12 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_characterHorizontalScale: 1 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &4818858513106688900 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8770129552410141565} + - component: {fileID: 6732855126494316192} + - component: {fileID: 4711060689836340955} + m_Layer: 5 + m_Name: HoverOutline + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &8770129552410141565 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4818858513106688900} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8974564133226285288} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 212, y: 146} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6732855126494316192 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4818858513106688900} + m_CullTransparentMesh: 0 +--- !u!114 &4711060689836340955 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4818858513106688900} + 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: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: c380e7a05885b254d877bfabec1eb0c5, type: 3} + m_Type: 0 + 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 &5545096435911915858 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5343966063347327097} + - component: {fileID: 6807344510761186898} + - component: {fileID: 565546086535874787} + - component: {fileID: 3371400824876200992} + m_Layer: 5 + m_Name: RarityContainer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5343966063347327097 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5545096435911915858} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8974564133226285288} + 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 &6807344510761186898 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5545096435911915858} + m_CullTransparentMesh: 0 +--- !u!114 &565546086535874787 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5545096435911915858} + 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: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 5a1ead256ed3f0c449e897aff3076362, type: 3} + m_Type: 0 + 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!114 &3371400824876200992 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5545096435911915858} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 1, g: 1, b: 1, a: 1} + m_PressedColor: {r: 1, g: 1, b: 1, a: 1} + m_SelectedColor: {r: 1, g: 1, b: 1, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 565546086535874787} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &5558143736811033208 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8974564133226285288} + m_Layer: 5 + m_Name: Container + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8974564133226285288 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5558143736811033208} + 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_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 8770129552410141565} + - {fileID: 5343966063347327097} + - {fileID: 5294823707738111947} + - {fileID: 4063225283202921380} + - {fileID: 1176605725860819126} + m_Father: {fileID: 1895304305689352378} + 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!1 &8978849373333944373 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1895304305689352378} + - component: {fileID: 5590025438760812977} + - component: {fileID: 2066472056369754427} + - component: {fileID: 611709950445522836} + m_Layer: 5 + m_Name: FacialExpressionSlot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1895304305689352378 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8978849373333944373} + 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_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 8974564133226285288} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 212, y: 146} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5590025438760812977 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8978849373333944373} + m_CullTransparentMesh: 0 +--- !u!114 &2066472056369754427 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8978849373333944373} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e9a3d376af46b584db655b1626aa6d54, type: 3} + m_Name: + m_EditorClassIdentifier: + playButton: {fileID: 3371400824876200992} + k__BackingField: {fileID: 428376574878408969} + k__BackingField: {fileID: 1072704683713788848} + hoverBackground: {fileID: 4818858513106688900} + selectedBackground: {fileID: 4818858513106688900} + k__BackingField: {fileID: 611709950445522836} + k__BackingField: {fileID: 11400000, guid: cbbd6a003fc75e24da47c13feacd92c7, type: 2} + k__BackingField: {fileID: 11400000, guid: 8b8a0a6a2ec74774c8d3ccac3b54e0e8, type: 2} +--- !u!95 &611709950445522836 +Animator: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8978849373333944373} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 788a2e8e4c04acf438c5d5f1175fc0cb, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_AnimatePhysics: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!1001 &28633790769039721 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 8974564133226285288} + m_Modifications: + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_RootOrder + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_AnchorMax.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_AnchorMin.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_SizeDelta.x + value: 50 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_SizeDelta.y + value: 50 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_AnchoredPosition.y + value: 8 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: -336.96002 + objectReference: {fileID: 0} + - target: {fileID: 2336035712942851721, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_Name + value: LoadingSpinner + objectReference: {fileID: 0} + - target: {fileID: 2336035712942851721, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} +--- !u!224 &1176605725860819126 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 1166888513132788191, guid: d565b61885fb1ef41b1582a285e748e9, type: 3} + m_PrefabInstance: {fileID: 28633790769039721} + m_PrefabAsset: {fileID: 0} diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionSlot.prefab.meta b/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionSlot.prefab.meta new file mode 100644 index 00000000000..05b4e6eb1d3 --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionSlot.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 784be79c954f1d84081cfbd20de48ee0 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionsWheelHUD.prefab b/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionsWheelHUD.prefab new file mode 100644 index 00000000000..5564359832d --- /dev/null +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionsWheelHUD.prefab @@ -0,0 +1,2260 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1553858409177893017 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4606384253447135439} + - component: {fileID: 3738596849537230179} + - component: {fileID: 100407586518928849} + m_Layer: 5 + m_Name: Hold + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4606384253447135439 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1553858409177893017} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3368308072246989936} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -50} + m_SizeDelta: {x: 190, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3738596849537230179 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1553858409177893017} + m_CullTransparentMesh: 0 +--- !u!114 &100407586518928849 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1553858409177893017} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Hold <#fcfcfc>[b+num] to run an emote while the wheel is + closed. + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 35aa85d68d15435418848a03a2db81ec, type: 2} + m_sharedMaterial: {fileID: 1701868249614554837, guid: 35aa85d68d15435418848a03a2db81ec, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4292136399 + m_fontColor: {r: 0.8117647, g: 0.8039216, b: 0.83137256, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 12 + m_fontSizeBase: 12 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 10 + m_fontSizeMax: 12 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_characterHorizontalScale: 1 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &1752705064142723760 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6092354033751835054} + - component: {fileID: 374315793872558327} + - component: {fileID: 50054618743786208} + - component: {fileID: 1341166584425063779} + m_Layer: 5 + m_Name: EditButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6092354033751835054 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1752705064142723760} + 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_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 186355610268972269} + - {fileID: 7706739768243273297} + m_Father: {fileID: 3368308072246989936} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -6} + m_SizeDelta: {x: 80, y: 32} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &374315793872558327 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1752705064142723760} + m_CullTransparentMesh: 1 +--- !u!114 &50054618743786208 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1752705064142723760} + 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: 1, g: 1, b: 1, a: 0.29803923} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 1dcae7b3183f24eb39310ae8e4c092a5, type: 3} + 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: 3 +--- !u!114 &1341166584425063779 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1752705064142723760} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 0.019607844} + m_HighlightedColor: {r: 1, g: 1, b: 1, a: 0.050980393} + m_PressedColor: {r: 1, g: 1, b: 1, a: 0.019607844} + m_SelectedColor: {r: 1, g: 1, b: 1, a: 0.019607844} + m_DisabledColor: {r: 1, g: 1, b: 1, a: 0.019607844} + m_ColorMultiplier: 1 + m_FadeDuration: 0 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 3021313394658728330} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &2730020739912452495 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7001501268930964302} + - component: {fileID: 5735411371286715404} + - component: {fileID: 143119229750994052} + m_Layer: 5 + m_Name: EmoteName + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7001501268930964302 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2730020739912452495} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3368308072246989936} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 60} + m_SizeDelta: {x: 240, y: 70} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5735411371286715404 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2730020739912452495} + m_CullTransparentMesh: 0 +--- !u!114 &143119229750994052 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2730020739912452495} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Emote name + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 96ae0a2159a39234f858ea23bdcc74ad, type: 2} + m_sharedMaterial: {fileID: 735423033564544980, guid: 96ae0a2159a39234f858ea23bdcc74ad, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294769916 + m_fontColor: {r: 0.9882353, g: 0.9882353, b: 0.9882353, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 18 + m_fontSizeBase: 18 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 10 + m_fontSizeMax: 18 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 1024 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_characterHorizontalScale: 1 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &3228828099108839015 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7955344795505032275} + - component: {fileID: 7050178683807351617} + - component: {fileID: 7899065392233343085} + - component: {fileID: 5211374839953244563} + - component: {fileID: 2493284765828715248} + - component: {fileID: 5435260623791634102} + - component: {fileID: 8229971583099982502} + - component: {fileID: 4956586062160404822} + m_Layer: 5 + m_Name: FacialExpressionsWheelHUD + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7955344795505032275 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3228828099108839015} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2913921208301803433} + - {fileID: 3368308072246989936} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!114 &7050178683807351617 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3228828099108839015} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a2d86c5623ba20640930fee622f0d1e1, type: 3} + m_Name: + m_EditorClassIdentifier: + k__BackingField: {fileID: 7899065392233343085} + k__BackingField: {fileID: 0} + closeButtons: + - {fileID: 5066361607108311281} + - {fileID: 8782135904965761850} + k__BackingField: {fileID: 0} + k__BackingField: {fileID: 0} + k__BackingField: + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + k__BackingField: {fileID: 0} + k__BackingField: {fileID: 0} + k__BackingField: {fileID: 0} + k__BackingField: {fileID: 0} + k__BackingField: {fileID: 0} + k__BackingField: {fileID: 0} + k__BackingField: {fileID: 11400000, guid: 59137f938439a5546aa4f9a63a582583, type: 2} + k__BackingField: {fileID: 11400000, guid: d9055205eadb2454585c619d3fc7a723, type: 2} +--- !u!223 &7899065392233343085 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3228828099108839015} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_UseReflectionProbes: 0 + m_AdditionalShaderChannelsFlag: 25 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!222 &5211374839953244563 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3228828099108839015} + m_CullTransparentMesh: 0 +--- !u!114 &2493284765828715248 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3228828099108839015} + 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!114 &5435260623791634102 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3228828099108839015} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1920, y: 1080} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!95 &8229971583099982502 +Animator: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3228828099108839015} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 255f9f41f88a44d4f90ea1b729bdd522, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_AnimatePhysics: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!225 &4956586062160404822 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3228828099108839015} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &3247684323739948405 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2913921208301803433} + - component: {fileID: 4745836198485645779} + - component: {fileID: 7937820618774625464} + m_Layer: 5 + m_Name: Delete + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &2913921208301803433 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3247684323739948405} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7955344795505032275} + 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 &4745836198485645779 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3247684323739948405} + m_CullTransparentMesh: 1 +--- !u!114 &7937820618774625464 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3247684323739948405} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: dba8824b6fe72463daad7bbc095f895e, type: 3} + m_Type: 0 + 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 &3679844280292778605 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2707180414594536588} + - component: {fileID: 5950188987537430702} + - component: {fileID: 9193821725555312239} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2707180414594536588 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3679844280292778605} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3368308072246989936} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 680, y: 680} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5950188987537430702 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3679844280292778605} + m_CullTransparentMesh: 0 +--- !u!114 &9193821725555312239 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3679844280292778605} + 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, g: 0, b: 0, a: 0.9490196} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: ee4612caf84054bbb9282917b25c1bfc, type: 3} + m_Type: 0 + 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 &3967867082645134450 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6387641994105437130} + - component: {fileID: 6428647394411284262} + - component: {fileID: 6467756172435730145} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6387641994105437130 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3967867082645134450} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2445375703582184909} + 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: -24, y: -24} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6428647394411284262 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3967867082645134450} + m_CullTransparentMesh: 0 +--- !u!114 &6467756172435730145 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3967867082645134450} + 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: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: f49bfce399a8c41568bf017a951a357a, type: 3} + m_Type: 0 + 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 &4979140711266332923 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7706739768243273297} + - component: {fileID: 4081166362944202792} + - component: {fileID: 5782514664531182739} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7706739768243273297 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4979140711266332923} + 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_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 6092354033751835054} + 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 &4081166362944202792 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4979140711266332923} + m_CullTransparentMesh: 0 +--- !u!114 &5782514664531182739 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4979140711266332923} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Edit <#716B7C>[E] + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 96ae0a2159a39234f858ea23bdcc74ad, type: 2} + m_sharedMaterial: {fileID: 735423033564544980, guid: 96ae0a2159a39234f858ea23bdcc74ad, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294769916 + m_fontColor: {r: 0.9882353, g: 0.9882353, b: 0.9882353, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 12 + m_fontSizeBase: 12 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 10 + m_fontSizeMax: 14 + m_fontStyle: 16 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_characterHorizontalScale: 1 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &6941404510284847514 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2445375703582184909} + - component: {fileID: 5505085621591519339} + - component: {fileID: 8746213363341550890} + - component: {fileID: 8782135904965761850} + - component: {fileID: 6630055616766752555} + - component: {fileID: 1479204841276357964} + m_Layer: 5 + m_Name: CloseButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2445375703582184909 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6941404510284847514} + 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_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 6387641994105437130} + m_Father: {fileID: 3368308072246989936} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 300, y: 226} + m_SizeDelta: {x: 36, y: 36} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5505085621591519339 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6941404510284847514} + m_CullTransparentMesh: 0 +--- !u!114 &8746213363341550890 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6941404510284847514} + 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: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 12dd1efc4e826764f9b02be515a9a033, type: 3} + 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: 2.5 +--- !u!114 &8782135904965761850 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6941404510284847514} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 0.08627451, g: 0.08235294, b: 0.09411765, a: 1} + m_HighlightedColor: {r: 0.2627451, g: 0.2509804, b: 0.2901961, a: 1} + m_PressedColor: {r: 0, g: 0, b: 0, a: 1} + m_SelectedColor: {r: 0.08627451, g: 0.08235294, b: 0.09411765, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 8746213363341550890} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!95 &6630055616766752555 +Animator: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6941404510284847514} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: c22edc5eaba53f342bc161d6cbd411de, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_AnimatePhysics: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!114 &1479204841276357964 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6941404510284847514} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6a66e979ca644f3d91fd0980c5cd5f5f, type: 3} + m_Name: + m_EditorClassIdentifier: + public class FacialExpressionsCharacterPreviewController : CharacterPreviewControllerBase { + private readonly List shortenedWearables = new (); + private readonly World ownWorld; + public FacialExpressionsCharacterPreviewController( CharacterPreviewView view, ICharacterPreviewFactory previewFactory, World world, CharacterPreviewEventBus characterPreviewEventBus) - : base(view, previewFactory, world, isPreviewPlatformActive: false, characterPreviewEventBus) { } + : base(view, previewFactory, world, isPreviewPlatformActive: false, characterPreviewEventBus) + { + ownWorld = world; + } + + public override void Initialize(Avatar avatar, Vector3 position) + { + shortenedWearables.Clear(); + + foreach (URN urn in avatar.Wearables) + shortenedWearables.Add(urn.Shorten()); + + previewAvatarModel.Wearables = shortenedWearables; + + base.Initialize(avatar, position); + } public void SetFace(int eyebrowsIndex, int eyesIndex, int mouthIndex) => previewController?.TrySetFace(eyebrowsIndex, eyesIndex, mouthIndex); + + /// + /// Same as but waits until is attached + /// to the preview entity, so the initial seed (called right after OnShow while + /// wearables are still instantiating async) actually lands instead of silently no-opping. + /// + public async UniTask SetFaceWhenReadyAsync(int eyebrowsIndex, int eyesIndex, int mouthIndex, CancellationToken ct) + { + await UniTask.WaitUntil(IsFaceReady, cancellationToken: ct); + + previewController?.TrySetFace(eyebrowsIndex, eyesIndex, mouthIndex); + } + + private bool IsFaceReady() + { + if (!previewController.HasValue) return false; + + Entity entity = previewController.Value.PreviewEntity; + return ownWorld.IsAlive(entity) && ownWorld.Has(entity); + } } } \ No newline at end of file diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs index 804a02abd95..4bcebb93907 100644 --- a/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelController.cs @@ -1,6 +1,7 @@ using Arch.Core; using Cysharp.Threading.Tasks; using DCL.AvatarRendering.AvatarShape; +using DCL.AvatarRendering.AvatarShape.Components; using DCL.AvatarRendering.AvatarShape.FacialExpression; using DCL.AvatarRendering.Emotes; using DCL.Diagnostics; @@ -38,9 +39,9 @@ public class FacialExpressionsWheelController : ControllerBase CycleChannel(ref pendingEyebrowsIndex, delta, viewInstance.EyebrowsCycler); - viewInstance.EyesCycler.OnCycle += delta => CycleChannel(ref pendingEyesIndex, delta, viewInstance.EyesCycler); - viewInstance.MouthCycler.OnCycle += delta => CycleChannel(ref pendingMouthIndex, delta, viewInstance.MouthCycler); + eyebrowsCycler = new NumericCyclerController(viewInstance.EyebrowsCycler, CHANNEL_ATLAS_SIZE); + eyesCycler = new NumericCyclerController(viewInstance.EyesCycler, CHANNEL_ATLAS_SIZE); + mouthCycler = new NumericCyclerController(viewInstance.MouthCycler, CHANNEL_ATLAS_SIZE); + + eyebrowsCycler.OnIndexChanged += OnChannelCycled; + eyesCycler.OnIndexChanged += OnChannelCycled; + mouthCycler.OnIndexChanged += OnChannelCycled; } protected override void OnBeforeViewShow() @@ -139,7 +148,29 @@ async UniTaskVoid InitializePreviewAsync(CancellationToken ct) previewController.Initialize(profile.Avatar, Vector3.zero); previewController.OnShow(); - ApplyExpressionToPreview(slot: 0); + int eb = 0, ey = 0, mo = 0; + + if (world.IsAlive(playerEntity) && world.Has(playerEntity)) + { + AvatarFaceComponent face = world.Get(playerEntity); + eb = face.EyebrowsExpressionIndex; + ey = face.EyesExpressionIndex; + mo = face.MouthExpressionIndex; + } + + eyebrowsCycler!.SetIndex(eb); + eyesCycler!.SetIndex(ey); + mouthCycler!.SetIndex(mo); + + int matchedSlot = FindMatchingExpressionSlot(eb, ey, mo); + HighlightSlot(matchedSlot); + + viewInstance!.CurrentExpressionName.text = matchedSlot >= 0 ? expressionConfig.Expressions[matchedSlot].Name : "Custom"; + + // Preview avatar's AvatarFaceComponent is added async by AvatarFacialExpressionSystem + // after wearables instantiate. Wait for it before pushing the seed indices, otherwise + // TrySetFace silently no-ops on first open. + await previewController.SetFaceWhenReadyAsync(eb, ey, mo, ct); } } @@ -156,7 +187,7 @@ protected override void OnViewClose() previewController.OnHide(); if (pendingChanged) - FacialExpressionApplier.Apply(world, playerEntity, (byte)pendingEyebrowsIndex, (byte)pendingEyesIndex, (byte)pendingMouthIndex); + FacialExpressionApplier.Apply(world, playerEntity, (byte)eyebrowsCycler!.CurrentIndex, (byte)eyesCycler!.CurrentIndex, (byte)mouthCycler!.CurrentIndex); } protected override UniTask WaitForCloseIntentAsync(CancellationToken ct) @@ -180,22 +211,43 @@ private void OnSlotHover(int slot) => viewInstance!.CurrentExpressionName.text = expressionConfig.Expressions[slot].Name; private void OnSlotFocusLeave(int _) => - viewInstance!.CurrentExpressionName.text = selectedSlot >= 0 - ? expressionConfig.Expressions[selectedSlot].Name - : string.Empty; + viewInstance!.CurrentExpressionName.text = CurrentExpressionLabel(); - private void CycleChannel(ref int currentIndex, int delta, FaceChannelCyclerView cyclerView) + private void OnChannelCycled(int _) { - currentIndex = FacialExpressionWheelUtils.WrapChannelIndex(currentIndex, delta, CHANNEL_ATLAS_SIZE); - cyclerView.SetIndex(currentIndex + 1, CHANNEL_ATLAS_SIZE); + int eb = eyebrowsCycler!.CurrentIndex; + int ey = eyesCycler!.CurrentIndex; + int mo = mouthCycler!.CurrentIndex; + + int matchedSlot = FindMatchingExpressionSlot(eb, ey, mo); + HighlightSlot(matchedSlot); - HighlightSlot(-1); - viewInstance!.CurrentExpressionName.text = string.Empty; + viewInstance!.CurrentExpressionName.text = matchedSlot >= 0 + ? expressionConfig.Expressions[matchedSlot].Name + : "Custom"; - previewController.SetFace(pendingEyebrowsIndex, pendingEyesIndex, pendingMouthIndex); + previewController.SetFace(eb, ey, mo); pendingChanged = true; } + private string CurrentExpressionLabel() + { + int matched = FindMatchingExpressionSlot(eyebrowsCycler!.CurrentIndex, eyesCycler!.CurrentIndex, mouthCycler!.CurrentIndex); + return matched >= 0 ? expressionConfig.Expressions[matched].Name : "Custom"; + } + + private int FindMatchingExpressionSlot(int eb, int ey, int mo) + { + for (var i = 0; i < expressionConfig.Expressions.Length; i++) + { + AvatarFaceExpressionDefinition def = expressionConfig.Expressions[i]; + if (def.EyebrowsIndex == eb && def.EyesIndex == ey && def.MouthIndex == mo) + return i; + } + + return -1; + } + private void OnSlotNumberPressed(InputAction.CallbackContext context) { int slot = FacialExpressionWheelUtils.SlotIndexFromActionName(context.action.name); @@ -215,16 +267,14 @@ private void SwapToEmotes() private void ApplyExpressionToPreview(int slot) { AvatarFaceExpressionDefinition def = expressionConfig.Expressions[slot]; - pendingEyebrowsIndex = def.EyebrowsIndex; - pendingEyesIndex = def.EyesIndex; - pendingMouthIndex = def.MouthIndex; - previewController.SetFace(pendingEyebrowsIndex, pendingEyesIndex, pendingMouthIndex); + eyebrowsCycler!.SetIndex(def.EyebrowsIndex); + eyesCycler!.SetIndex(def.EyesIndex); + mouthCycler!.SetIndex(def.MouthIndex); + + previewController.SetFace(def.EyebrowsIndex, def.EyesIndex, def.MouthIndex); - viewInstance!.EyebrowsCycler.SetIndex(pendingEyebrowsIndex + 1, CHANNEL_ATLAS_SIZE); - viewInstance.EyesCycler.SetIndex(pendingEyesIndex + 1, CHANNEL_ATLAS_SIZE); - viewInstance.MouthCycler.SetIndex(pendingMouthIndex + 1, CHANNEL_ATLAS_SIZE); - viewInstance.CurrentExpressionName.text = def.Name; + viewInstance!.CurrentExpressionName.text = def.Name; } private void HighlightSlot(int slot) diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelView.cs b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelView.cs index 459822ac494..16cfb3fcc96 100644 --- a/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelView.cs +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/FacialExpressionsWheelView.cs @@ -25,20 +25,17 @@ public class FacialExpressionsWheelView : ViewBase, IView [field: SerializeField] public Button EmotesTabButton { get; private set; } = null!; - [field: SerializeField] - public Button FacialExpressionsTabButton { get; private set; } = null!; - [field: SerializeField] public FacialExpressionWheelSlotView[] Slots { get; private set; } = null!; [field: SerializeField] - public FaceChannelCyclerView EyebrowsCycler { get; private set; } = null!; + public NumericCyclerView EyebrowsCycler { get; private set; } = null!; [field: SerializeField] - public FaceChannelCyclerView EyesCycler { get; private set; } = null!; + public NumericCyclerView EyesCycler { get; private set; } = null!; [field: SerializeField] - public FaceChannelCyclerView MouthCycler { get; private set; } = null!; + public NumericCyclerView MouthCycler { get; private set; } = null!; [field: SerializeField] public CharacterPreviewView CharacterPreview { get; private set; } = null!; @@ -80,4 +77,4 @@ protected override UniTask PlayHideAnimationAsync(CancellationToken ct) cancellationToken: ct); } } -} \ No newline at end of file +} diff --git a/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs b/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs index 93ed2b8d4cb..c7da5e665b8 100644 --- a/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs +++ b/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs @@ -840,18 +840,17 @@ await MapRendererContainer userBlockingCache, includeBannedUsersFromScene, emotesEventBus), - // FacialExpressionsWheelPlugin: disabled until wearables ship expression atlases. - // new FacialExpressionsWheelPlugin( - // assetsProvisioner, - // selfProfile, - // staticContainer.InputBlock, - // dclCursor, - // emotesEventBus, - // mvcManager, - // globalWorld, - // playerEntity, - // characterPreviewFactory, - // characterPreviewEventBus), + new FacialExpressionsWheelPlugin( + assetsProvisioner, + selfProfile, + staticContainer.InputBlock, + dclCursor, + emotesEventBus, + mvcManager, + globalWorld, + playerEntity, + characterPreviewFactory, + characterPreviewEventBus), new MainUIPlugin(mvcManager, mainUIView, includeFriends), new ProfilePlugin(profilesRepository, profileCache, staticContainer.CacheCleaner), new MapRendererPlugin(mapRendererContainer.MapRenderer), diff --git a/Explorer/Assets/DCL/UI/NumericCycler.meta b/Explorer/Assets/DCL/UI/NumericCycler.meta new file mode 100644 index 00000000000..a180b3008a2 --- /dev/null +++ b/Explorer/Assets/DCL/UI/NumericCycler.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a1a94449c4562424ca831c4a0cf59ed4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/UI/NumericCycler/NumericCycler.prefab b/Explorer/Assets/DCL/UI/NumericCycler/NumericCycler.prefab new file mode 100644 index 00000000000..909859de5b4 --- /dev/null +++ b/Explorer/Assets/DCL/UI/NumericCycler/NumericCycler.prefab @@ -0,0 +1,647 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &799256314393722573 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7797977824454363499} + - component: {fileID: 4872494322489332089} + m_Layer: 5 + m_Name: NumericCycler + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7797977824454363499 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 799256314393722573} + 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_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3517418303353950190} + - {fileID: 6127669976958100343} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 25} + m_SizeDelta: {x: 100, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &4872494322489332089 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 799256314393722573} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7d739f11aea6d2b4a8a26cb8e0cdd6bd, type: 3} + m_Name: + m_EditorClassIdentifier: UI::DCL.UI.NumericCyclerView + k__BackingField: {fileID: 1872954554842714794} + previousButton: {fileID: 4537227259206650587} + nextButton: {fileID: 1117926642747261743} +--- !u!1 &1560242400757491636 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3517418303353950190} + - component: {fileID: 4365522338299148750} + - component: {fileID: 6535751874698011380} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3517418303353950190 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1560242400757491636} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7797977824454363499} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 15} + m_SizeDelta: {x: 100, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4365522338299148750 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1560242400757491636} + m_CullTransparentMesh: 1 +--- !u!114 &6535751874698011380 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1560242400757491636} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: EYEBROWS + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 35aa85d68d15435418848a03a2db81ec, type: 2} + m_sharedMaterial: {fileID: 1701868249614554837, guid: 35aa85d68d15435418848a03a2db81ec, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4292136399 + m_fontColor: {r: 0.8117647, g: 0.8039216, b: 0.83137256, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_characterHorizontalScale: 1 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &2913530435373922484 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6127669976958100343} + - component: {fileID: 746212860481226883} + - component: {fileID: 37948826084899709} + m_Layer: 5 + m_Name: Selector + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6127669976958100343 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2913530435373922484} + 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_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1949684553280265930} + - {fileID: 1284188828989822415} + - {fileID: 2621528687565593615} + m_Father: {fileID: 7797977824454363499} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -10} + m_SizeDelta: {x: 100, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &746212860481226883 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2913530435373922484} + m_CullTransparentMesh: 1 +--- !u!114 &37948826084899709 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2913530435373922484} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 0.8117647, g: 0.8039216, b: 0.83137256, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: -12, y: -12, z: -12, w: -12} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 1071697916, guid: ae9a86f104ff04745b6fad7c9a03abf5, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1.94 +--- !u!1 &4440646023412422823 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1284188828989822415} + - component: {fileID: 2245468442363775044} + - component: {fileID: 4537227259206650587} + - component: {fileID: 8776630067842817694} + m_Layer: 5 + m_Name: Previous + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1284188828989822415 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4440646023412422823} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6127669976958100343} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -42.000023, y: -7} + m_SizeDelta: {x: 8, y: 14} + m_Pivot: {x: 0, y: 0} +--- !u!222 &2245468442363775044 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4440646023412422823} + m_CullTransparentMesh: 1 +--- !u!114 &4537227259206650587 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4440646023412422823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 0.9882353, g: 0.9882353, b: 0.9882353, a: 1} + m_HighlightedColor: {r: 0.9056604, g: 0.9056604, b: 0.9056604, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9882353, g: 0.9882353, b: 0.9882353, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 8776630067842817694} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &8776630067842817694 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4440646023412422823} + 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.8117647, g: 0.8039216, b: 0.83137256, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: -5, y: -5, z: -5, w: -5} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 643485b56259a47ff8f14e9b10fd47bb, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5206762192689197307 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1949684553280265930} + - component: {fileID: 3411588330532201274} + - component: {fileID: 1117926642747261743} + - component: {fileID: 2701416387096856770} + m_Layer: 5 + m_Name: Next + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1949684553280265930 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5206762192689197307} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6127669976958100343} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 41.999977, y: -7} + m_SizeDelta: {x: 8, y: 14} + m_Pivot: {x: 0, y: 0} +--- !u!222 &3411588330532201274 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5206762192689197307} + m_CullTransparentMesh: 1 +--- !u!114 &1117926642747261743 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5206762192689197307} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 0.9882353, g: 0.9882353, b: 0.9882353, a: 1} + m_HighlightedColor: {r: 0.9056604, g: 0.9056604, b: 0.9056604, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9882353, g: 0.9882353, b: 0.9882353, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2701416387096856770} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &2701416387096856770 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5206762192689197307} + 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.8117647, g: 0.8039216, b: 0.83137256, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: -5, y: -5, z: -5, w: -5} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 643485b56259a47ff8f14e9b10fd47bb, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5439206097873667846 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2621528687565593615} + - component: {fileID: 4229383646590805091} + - component: {fileID: 1872954554842714794} + m_Layer: 5 + m_Name: Current + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2621528687565593615 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5439206097873667846} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6127669976958100343} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4229383646590805091 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5439206097873667846} + m_CullTransparentMesh: 1 +--- !u!114 &1872954554842714794 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5439206097873667846} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 1/15 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 35aa85d68d15435418848a03a2db81ec, type: 2} + m_sharedMaterial: {fileID: 1701868249614554837, guid: 35aa85d68d15435418848a03a2db81ec, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_characterHorizontalScale: 1 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} diff --git a/Explorer/Assets/DCL/UI/NumericCycler/NumericCycler.prefab.meta b/Explorer/Assets/DCL/UI/NumericCycler/NumericCycler.prefab.meta new file mode 100644 index 00000000000..a61099cf96e --- /dev/null +++ b/Explorer/Assets/DCL/UI/NumericCycler/NumericCycler.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 02e2551a16632ac4db8e05163d51775b +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Explorer/Assets/DCL/UI/NumericCycler/NumericCyclerController.cs b/Explorer/Assets/DCL/UI/NumericCycler/NumericCyclerController.cs new file mode 100644 index 00000000000..5f887ebf033 --- /dev/null +++ b/Explorer/Assets/DCL/UI/NumericCycler/NumericCyclerController.cs @@ -0,0 +1,53 @@ +using System; + +namespace DCL.UI +{ + /// + /// Stateful pairing for . Owns the current index, wraps on + /// overflow, drives the view's "current/total" text, and raises + /// only when the user steps via the arrows. External calls update the + /// view silently so callers can drive the cycler from outside without re-entering. + /// + public class NumericCyclerController : IDisposable + { + public event Action? OnIndexChanged; + + private readonly NumericCyclerView view; + private readonly int total; + private int currentIndex; + + public int CurrentIndex => currentIndex; + + public NumericCyclerController(NumericCyclerView view, int total, int initialIndex = 0) + { + this.view = view; + this.total = total; + currentIndex = Wrap(initialIndex); + + view.OnCycle += HandleCycle; + UpdateView(); + } + + public void Dispose() => + view.OnCycle -= HandleCycle; + + public void SetIndex(int index) + { + currentIndex = Wrap(index); + UpdateView(); + } + + private void HandleCycle(int delta) + { + currentIndex = Wrap(currentIndex + delta); + UpdateView(); + OnIndexChanged?.Invoke(currentIndex); + } + + private void UpdateView() => + view.SetIndex(currentIndex + 1, total); + + private int Wrap(int index) => + ((index % total) + total) % total; + } +} \ No newline at end of file diff --git a/Explorer/Assets/DCL/UI/NumericCycler/NumericCyclerController.cs.meta b/Explorer/Assets/DCL/UI/NumericCycler/NumericCyclerController.cs.meta new file mode 100644 index 00000000000..0b5563a6067 --- /dev/null +++ b/Explorer/Assets/DCL/UI/NumericCycler/NumericCyclerController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 07d90ad15d045d14d98ab8dd854a3149 \ No newline at end of file diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/FaceChannelCyclerView.cs b/Explorer/Assets/DCL/UI/NumericCycler/NumericCyclerView.cs similarity index 64% rename from Explorer/Assets/DCL/FacialExpressionsWheel/FaceChannelCyclerView.cs rename to Explorer/Assets/DCL/UI/NumericCycler/NumericCyclerView.cs index 1bd26b7c42a..1efc9d3818b 100644 --- a/Explorer/Assets/DCL/FacialExpressionsWheel/FaceChannelCyclerView.cs +++ b/Explorer/Assets/DCL/UI/NumericCycler/NumericCyclerView.cs @@ -3,14 +3,13 @@ using UnityEngine; using UnityEngine.UI; -namespace DCL.FacialExpressionsWheel +namespace DCL.UI { /// - /// One row of the wheel footer (EYEBROWS / EYES / MOUTH). Hosts a label plus prev/next arrows - /// to step through that channel's atlas slices, and a "current/total" index display. - /// The view is dumb: clamping and bounds live in the controller. Label is authored in the prefab. + /// Reusable prev / index / next stepper. Prev and next arrows emit a delta of -1 / +1 on + /// . Storage, wrap and bounds live in . /// - public class FaceChannelCyclerView : MonoBehaviour + public class NumericCyclerView : MonoBehaviour { public event Action? OnCycle; @@ -32,4 +31,4 @@ private void Awake() public void SetIndex(int currentOneBased, int total) => IndexText.text = $"{currentOneBased}/{total}"; } -} \ No newline at end of file +} diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/FaceChannelCyclerView.cs.meta b/Explorer/Assets/DCL/UI/NumericCycler/NumericCyclerView.cs.meta similarity index 100% rename from Explorer/Assets/DCL/FacialExpressionsWheel/FaceChannelCyclerView.cs.meta rename to Explorer/Assets/DCL/UI/NumericCycler/NumericCyclerView.cs.meta diff --git a/Explorer/Assets/Textures/FacialExpressionsWheel/SlidersContainer.png b/Explorer/Assets/Textures/FacialExpressionsWheel/SlidersContainer.png new file mode 100644 index 00000000000..b33dbf77c78 --- /dev/null +++ b/Explorer/Assets/Textures/FacialExpressionsWheel/SlidersContainer.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9dd9dfe644946467942b8a6c9cdc021e805e1bb97012204b9f30a420ec73f4c2 +size 752 diff --git a/Explorer/Assets/Textures/FacialExpressionsWheel/SlidersContainer.png.meta b/Explorer/Assets/Textures/FacialExpressionsWheel/SlidersContainer.png.meta new file mode 100644 index 00000000000..dc12628220a --- /dev/null +++ b/Explorer/Assets/Textures/FacialExpressionsWheel/SlidersContainer.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: ae9a86f104ff04745b6fad7c9a03abf5 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: SlidersContainer_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 200 + height: 60 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 527dcd1ca42f7864ba14695a8cc35500 + internalID: 1071697916 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: d8ae127b7c3eafc4f990837d5e86b82c + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: + SlidersContainer_0: 1071697916 + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: From 9af1533c02c08364564fddec39a786514e2ab042 Mon Sep 17 00:00:00 2001 From: Romina Marchetti Date: Thu, 14 May 2026 14:58:16 +0100 Subject: [PATCH 24/28] Update facial expressions prefabs --- .../Assets/FacialExpressionSlot.prefab | 16 +- .../Assets/FacialExpressionsWheelHUD.prefab | 782 ++++++++++++++---- 2 files changed, 639 insertions(+), 159 deletions(-) diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionSlot.prefab b/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionSlot.prefab index 7afe426bc00..41849cb761e 100644 --- a/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionSlot.prefab +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionSlot.prefab @@ -34,8 +34,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 7} - m_SizeDelta: {x: 51, y: 51} + m_AnchoredPosition: {x: 0, y: 10} + m_SizeDelta: {x: 50, y: 50} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &8209566919986367981 CanvasRenderer: @@ -58,7 +58,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Color: {r: 0.9882353, g: 0.9882353, b: 0.9882353, a: 1} m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -149,8 +149,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} + rgba: 4294769916 + m_fontColor: {r: 0.9882353, g: 0.9882353, b: 0.9882353, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -435,9 +435,9 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 1 m_Children: - - {fileID: 8770129552410141565} - - {fileID: 4254442295287433033} - {fileID: 5343966063347327097} + - {fileID: 4254442295287433033} + - {fileID: 8770129552410141565} - {fileID: 5294823707738111947} - {fileID: 4063225283202921380} - {fileID: 1176605725860819126} @@ -560,7 +560,7 @@ RectTransform: m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 180, y: 124} + m_SizeDelta: {x: 176, y: 124} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &5590025438760812977 CanvasRenderer: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionsWheelHUD.prefab b/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionsWheelHUD.prefab index 897ad2acf0e..23d869fcc86 100644 --- a/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionsWheelHUD.prefab +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionsWheelHUD.prefab @@ -37,8 +37,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 362.00003} - m_SizeDelta: {x: 405, y: 48} + m_AnchoredPosition: {x: 0, y: 370} + m_SizeDelta: {x: 397, y: 48} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &8270544404805069180 CanvasRenderer: @@ -250,11 +250,11 @@ RectTransform: - {fileID: 7245789962748683138} m_Father: {fileID: 5792645443749173149} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 244.5, y: -24} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 132, y: 0} m_SizeDelta: {x: 217, y: 36} - m_Pivot: {x: 0.5, y: 0.5} + m_Pivot: {x: 0, y: 0.5} --- !u!222 &7052039933806547199 CanvasRenderer: m_ObjectHideFlags: 0 @@ -292,7 +292,7 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 2.8 + m_PixelsPerUnitMultiplier: 2 --- !u!114 &2901663262987998658 MonoBehaviour: m_ObjectHideFlags: 0 @@ -320,7 +320,7 @@ MonoBehaviour: m_SelectedColor: {r: 1, g: 1, b: 1, a: 1} m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} m_ColorMultiplier: 1 - m_FadeDuration: 0.1 + m_FadeDuration: 0 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -371,11 +371,11 @@ RectTransform: - {fileID: 676309371854187136} m_Father: {fileID: 5792645443749173149} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 68.66667, y: -24} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 6, y: 0} m_SizeDelta: {x: 120, y: 36} - m_Pivot: {x: 0.5, y: 0.5} + m_Pivot: {x: 0, y: 0.5} --- !u!222 &3196422909405272368 CanvasRenderer: m_ObjectHideFlags: 0 @@ -397,7 +397,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 0.101960786} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -413,7 +413,7 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 2.8 + m_PixelsPerUnitMultiplier: 2 --- !u!114 &40498704131198108 MonoBehaviour: m_ObjectHideFlags: 0 @@ -435,13 +435,13 @@ MonoBehaviour: m_SelectOnRight: {fileID: 0} m_Transition: 1 m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.8867924, g: 0.8867924, b: 0.8867924, a: 1} - m_PressedColor: {r: 1, g: 1, b: 1, a: 1} - m_SelectedColor: {r: 1, g: 1, b: 1, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_NormalColor: {r: 1, g: 1, b: 1, a: 0.03137255} + m_HighlightedColor: {r: 1, g: 1, b: 1, a: 0.050980393} + m_PressedColor: {r: 1, g: 1, b: 1, a: 0.03137255} + m_SelectedColor: {r: 1, g: 1, b: 1, a: 0.03137255} + m_DisabledColor: {r: 1, g: 1, b: 1, a: 0.03137255} m_ColorMultiplier: 1 - m_FadeDuration: 0.1 + m_FadeDuration: 0 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -470,7 +470,7 @@ GameObject: - component: {fileID: 4730844432278786650} - component: {fileID: 3259694945950685829} m_Layer: 5 - m_Name: Text (1) + m_Name: Text m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -485,7 +485,7 @@ RectTransform: m_GameObject: {fileID: 2920095271271486600} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.99999, y: 0.99999, z: 0.99999} + m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3116307744200990130} @@ -523,10 +523,10 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: 'Emotes [B]' + m_text: 'Emotes [B] ' m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 35aa85d68d15435418848a03a2db81ec, type: 2} - m_sharedMaterial: {fileID: 1701868249614554837, guid: 35aa85d68d15435418848a03a2db81ec, type: 2} + m_fontAsset: {fileID: 11400000, guid: 96ae0a2159a39234f858ea23bdcc74ad, type: 2} + m_sharedMaterial: {fileID: 735423033564544980, guid: 96ae0a2159a39234f858ea23bdcc74ad, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -630,7 +630,7 @@ RectTransform: m_LocalScale: {x: 0, y: 0, z: 0} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 2913921208301803433} + - {fileID: 4103288275150215105} - {fileID: 8000000000000000002} - {fileID: 3368308072246989936} m_Father: {fileID: 0} @@ -783,81 +783,6 @@ CanvasGroup: m_Interactable: 1 m_BlocksRaycasts: 1 m_IgnoreParentGroups: 0 ---- !u!1 &3247684323739948405 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2913921208301803433} - - component: {fileID: 4745836198485645779} - - component: {fileID: 7937820618774625464} - m_Layer: 5 - m_Name: Delete - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &2913921208301803433 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3247684323739948405} - 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_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 7955344795505032275} - 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 &4745836198485645779 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3247684323739948405} - m_CullTransparentMesh: 1 ---- !u!114 &7937820618774625464 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3247684323739948405} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 21300000, guid: dba8824b6fe72463daad7bbc095f895e, type: 3} - m_Type: 0 - 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 &3679844280292778605 GameObject: m_ObjectHideFlags: 0 @@ -916,7 +841,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0, g: 0, b: 0, a: 0.8} + m_Color: {r: 0, g: 0, b: 0, a: 0.9019608} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -968,7 +893,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -24, y: -24} + m_SizeDelta: {x: -22, y: -22} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &6428647394411284262 CanvasRenderer: @@ -1048,10 +973,10 @@ RectTransform: - {fileID: 7398030355940628656} m_Father: {fileID: 3368308072246989936} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 1920, y: 1440} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &4685398930661286266 GameObject: @@ -1087,8 +1012,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: -22.99998} - m_SizeDelta: {x: 230, y: 26} + m_AnchoredPosition: {x: 0, y: -37.000023} + m_SizeDelta: {x: 370, y: 26} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &278928452808775299 CanvasRenderer: @@ -1190,6 +1115,81 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &4851870358454341490 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4103288275150215105} + - component: {fileID: 6527380069577850153} + - component: {fileID: 5698806844468054045} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4103288275150215105 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4851870358454341490} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7955344795505032275} + 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 &6527380069577850153 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4851870358454341490} + m_CullTransparentMesh: 1 +--- !u!114 &5698806844468054045 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4851870358454341490} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: b43c60b92bc8743b89429e8c33d93640, type: 3} + m_Type: 0 + 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 &5657412646568098729 GameObject: m_ObjectHideFlags: 0 @@ -1217,7 +1217,7 @@ RectTransform: m_GameObject: {fileID: 5657412646568098729} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.99999, y: 0.99999, z: 0.99999} + m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 307345294855919637} @@ -1255,10 +1255,10 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: 'Facial Expressions [Y]' + m_text: 'Facial Expressions [Y] ' m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 35aa85d68d15435418848a03a2db81ec, type: 2} - m_sharedMaterial: {fileID: 1701868249614554837, guid: 35aa85d68d15435418848a03a2db81ec, type: 2} + m_fontAsset: {fileID: 11400000, guid: 96ae0a2159a39234f858ea23bdcc74ad, type: 2} + m_sharedMaterial: {fileID: 735423033564544980, guid: 96ae0a2159a39234f858ea23bdcc74ad, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -1363,11 +1363,11 @@ RectTransform: - {fileID: 6387641994105437130} m_Father: {fileID: 5792645443749173149} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 378.33334, y: -24} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -6, y: 0} m_SizeDelta: {x: 36, y: 36} - m_Pivot: {x: 0.5, y: 0.5} + m_Pivot: {x: 1, y: 0.5} --- !u!222 &5505085621591519339 CanvasRenderer: m_ObjectHideFlags: 0 @@ -1405,7 +1405,7 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 2.5 + m_PixelsPerUnitMultiplier: 2 --- !u!114 &8782135904965761850 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1427,13 +1427,13 @@ MonoBehaviour: m_SelectOnRight: {fileID: 0} m_Transition: 1 m_Colors: - m_NormalColor: {r: 0.08627451, g: 0.08235294, b: 0.09411765, a: 1} - m_HighlightedColor: {r: 0.2627451, g: 0.2509804, b: 0.2901961, a: 1} - m_PressedColor: {r: 0, g: 0, b: 0, a: 1} - m_SelectedColor: {r: 0.08627451, g: 0.08235294, b: 0.09411765, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_NormalColor: {r: 1, g: 1, b: 1, a: 0.03137255} + m_HighlightedColor: {r: 1, g: 1, b: 1, a: 0.050980393} + m_PressedColor: {r: 1, g: 1, b: 1, a: 0.03137255} + m_SelectedColor: {r: 1, g: 1, b: 1, a: 0.03137255} + m_DisabledColor: {r: 1, g: 1, b: 1, a: 0.03137255} m_ColorMultiplier: 1 - m_FadeDuration: 0.1 + m_FadeDuration: 0 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -1521,11 +1521,11 @@ RectTransform: - {fileID: 2707180414594536588} - {fileID: 6633855569037616094} - {fileID: 3692535545671592} + - {fileID: 3198139474860643893} - {fileID: 6957841578906695823} - {fileID: 1785311924777780728} - {fileID: 770571572399745426} - {fileID: 4606384253447135439} - - {fileID: 3198139474860643893} - {fileID: 5792645443749173149} m_Father: {fileID: 7955344795505032275} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -1938,7 +1938,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6064998454780672223, guid: ef488299c2199b848ad0e35b6b5b019a, type: 3} propertyPath: m_AnchoredPosition.y - value: 85 + value: 78 objectReference: {fileID: 0} - target: {fileID: 6064998454780672223, guid: ef488299c2199b848ad0e35b6b5b019a, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -2307,7 +2307,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_AnchoredPosition.y - value: 248 + value: 259 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -2325,6 +2325,10 @@ PrefabInstance: propertyPath: m_Name value: Slot1 objectReference: {fileID: 0} + - target: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -2354,6 +2358,10 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 6633855569037616094} m_Modifications: + - target: {fileID: 1072704683713788848, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_text + value: 2 + objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Pivot.x value: 0.5 @@ -2408,11 +2416,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_AnchoredPosition.x - value: 145.77074 + value: 151.4 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_AnchoredPosition.y - value: 200.63622 + value: 207.49998 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -2426,10 +2434,62 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: -36 objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.w + value: 0.95105654 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.z + value: 0.309017 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_AnchoredPosition.x + value: 10 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_AnchoredPosition.y + value: 13 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 36 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.w + value: 0.95105654 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.z + value: 0.309017 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 36 + objectReference: {fileID: 0} - target: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Name value: Slot2 objectReference: {fileID: 0} + - target: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -2459,6 +2519,10 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 6633855569037616094} m_Modifications: + - target: {fileID: 1072704683713788848, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_text + value: 3 + objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Pivot.x value: 0.5 @@ -2497,27 +2561,27 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalRotation.w - value: 0.809017 + value: 0.79863554 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalRotation.x - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalRotation.z - value: -0.58778524 + value: -0.60181504 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_AnchoredPosition.x - value: 235.86201 + value: 245.6 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_AnchoredPosition.y - value: 76.63621 + value: 78 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -2529,12 +2593,64 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalEulerAnglesHint.z - value: -72 + value: -74 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.w + value: 0.79863554 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.z + value: 0.60181504 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_AnchoredPosition.x + value: 13 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_AnchoredPosition.y + value: 17 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 74 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.w + value: 0.79863554 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.z + value: 0.60181504 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 74 objectReference: {fileID: 0} - target: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Name value: Slot3 objectReference: {fileID: 0} + - target: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -2564,6 +2680,10 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 6633855569037616094} m_Modifications: + - target: {fileID: 1072704683713788848, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_text + value: 4 + objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Pivot.x value: 0.5 @@ -2618,11 +2738,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_AnchoredPosition.x - value: 235.86201 + value: 243.2 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_AnchoredPosition.y - value: -76.63621 + value: -82 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -2636,10 +2756,62 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: -108 objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.w + value: 0.5877853 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.z + value: 0.80901694 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_AnchoredPosition.x + value: 12 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_AnchoredPosition.y + value: 23 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 108 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.w + value: 0.5877853 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.z + value: 0.80901694 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 108 + objectReference: {fileID: 0} - target: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Name value: Slot4 objectReference: {fileID: 0} + - target: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -2669,6 +2841,10 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 6633855569037616094} m_Modifications: + - target: {fileID: 1072704683713788848, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_text + value: 5 + objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Pivot.x value: 0.5 @@ -2711,11 +2887,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalRotation.x - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalRotation.z @@ -2723,11 +2899,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_AnchoredPosition.x - value: 145.77074 + value: 150 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_AnchoredPosition.y - value: -200.63622 + value: -210 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -2741,6 +2917,54 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: -144 objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.w + value: 0.309017 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.z + value: 0.95105654 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_AnchoredPosition.x + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_AnchoredPosition.y + value: 29 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 144 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.w + value: 0.309017 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.z + value: 0.95105654 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 144 + objectReference: {fileID: 0} - target: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Name value: Slot5 @@ -2774,6 +2998,10 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 6633855569037616094} m_Modifications: + - target: {fileID: 1072704683713788848, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_text + value: 6 + objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Pivot.x value: 0.5 @@ -2832,7 +3060,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_AnchoredPosition.y - value: -248 + value: -260 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -2846,6 +3074,50 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: -180 objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.z + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_AnchoredPosition.y + value: 30 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 180 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.z + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 180 + objectReference: {fileID: 0} - target: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Name value: Slot6 @@ -2879,6 +3151,10 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 6633855569037616094} m_Modifications: + - target: {fileID: 1072704683713788848, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_text + value: 7 + objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Pivot.x value: 0.5 @@ -2925,7 +3201,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalRotation.z @@ -2933,11 +3209,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_AnchoredPosition.x - value: -145.77074 + value: -152 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_AnchoredPosition.y - value: -200.63622 + value: -210 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -2951,6 +3227,54 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: -216 objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.w + value: -0.29237175 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.z + value: 0.9563048 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_AnchoredPosition.x + value: -7 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_AnchoredPosition.y + value: 33 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 214 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.w + value: -0.29237175 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.z + value: 0.9563048 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 214 + objectReference: {fileID: 0} - target: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Name value: Slot7 @@ -2984,6 +3308,10 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 6633855569037616094} m_Modifications: + - target: {fileID: 1072704683713788848, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_text + value: 8 + objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Pivot.x value: 0.5 @@ -3038,11 +3366,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_AnchoredPosition.x - value: -235.86201 + value: -246.1 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_AnchoredPosition.y - value: -76.63621 + value: -80 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -3056,6 +3384,54 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: -252 objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.w + value: -0.5877851 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.z + value: 0.8090171 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_AnchoredPosition.x + value: -10.5 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_AnchoredPosition.y + value: 23.1 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 252 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.w + value: -0.5877851 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.z + value: 0.8090171 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 252 + objectReference: {fileID: 0} - target: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Name value: Slot8 @@ -3089,6 +3465,10 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 6633855569037616094} m_Modifications: + - target: {fileID: 1072704683713788848, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_text + value: 9 + objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Pivot.x value: 0.5 @@ -3143,11 +3523,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_AnchoredPosition.x - value: -235.86201 + value: -246.6 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_AnchoredPosition.y - value: 76.63621 + value: 79.03618 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -3161,6 +3541,54 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: -288 objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.w + value: -0.809017 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.z + value: 0.58778524 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_AnchoredPosition.x + value: -8 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_AnchoredPosition.y + value: 17.5 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 288 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.w + value: -0.809017 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.z + value: 0.58778524 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 288 + objectReference: {fileID: 0} - target: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Name value: Slot9 @@ -3194,6 +3622,10 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 6633855569037616094} m_Modifications: + - target: {fileID: 1072704683713788848, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_text + value: 0 + objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Pivot.x value: 0.5 @@ -3248,11 +3680,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_AnchoredPosition.x - value: -145.77074 + value: -152 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_AnchoredPosition.y - value: 200.63622 + value: 208.39998 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -3266,6 +3698,54 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: -324 objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.w + value: -0.9496991 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.z + value: 0.31316397 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_AnchoredPosition.x + value: -8.2 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_AnchoredPosition.y + value: 11.7 + objectReference: {fileID: 0} + - target: {fileID: 4063225283202921380, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 323.5 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.w + value: -0.9496991 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalRotation.z + value: 0.31316397 + objectReference: {fileID: 0} + - target: {fileID: 5294823707738111947, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 323.5 + objectReference: {fileID: 0} - target: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Name value: Slot0 From 0055be7717930a3c7b33c97b345fb6e7918c93ac Mon Sep 17 00:00:00 2001 From: Romina Marchetti Date: Thu, 14 May 2026 15:26:49 +0100 Subject: [PATCH 25/28] Fix slots animation --- .../Assets/FacialExpressionsWheelHUD.prefab | 402 +++++++++++------- 1 file changed, 245 insertions(+), 157 deletions(-) diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionsWheelHUD.prefab b/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionsWheelHUD.prefab index 23d869fcc86..bd7637a7dc8 100644 --- a/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionsWheelHUD.prefab +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionsWheelHUD.prefab @@ -630,7 +630,6 @@ RectTransform: m_LocalScale: {x: 0, y: 0, z: 0} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 4103288275150215105} - {fileID: 8000000000000000002} - {fileID: 3368308072246989936} m_Father: {fileID: 0} @@ -933,51 +932,6 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!1 &4148380536755520314 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6633855569037616094} - m_Layer: 5 - m_Name: Slots - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &6633855569037616094 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4148380536755520314} - 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_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 7398030355940628667} - - {fileID: 7398030355940628664} - - {fileID: 7398030355940628665} - - {fileID: 7398030355940628670} - - {fileID: 7398030355940628671} - - {fileID: 7398030355940628668} - - {fileID: 7398030355940628669} - - {fileID: 7398030355940628658} - - {fileID: 7398030355940628659} - - {fileID: 7398030355940628656} - m_Father: {fileID: 3368308072246989936} - 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!1 &4685398930661286266 GameObject: m_ObjectHideFlags: 0 @@ -1115,81 +1069,6 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!1 &4851870358454341490 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4103288275150215105} - - component: {fileID: 6527380069577850153} - - component: {fileID: 5698806844468054045} - m_Layer: 5 - m_Name: Image - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &4103288275150215105 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4851870358454341490} - 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_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 7955344795505032275} - 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 &6527380069577850153 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4851870358454341490} - m_CullTransparentMesh: 1 ---- !u!114 &5698806844468054045 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4851870358454341490} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 21300000, guid: b43c60b92bc8743b89429e8c33d93640, type: 3} - m_Type: 0 - 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 &5657412646568098729 GameObject: m_ObjectHideFlags: 0 @@ -1519,7 +1398,6 @@ RectTransform: m_ConstrainProportionsScale: 1 m_Children: - {fileID: 2707180414594536588} - - {fileID: 6633855569037616094} - {fileID: 3692535545671592} - {fileID: 3198139474860643893} - {fileID: 6957841578906695823} @@ -1527,6 +1405,16 @@ RectTransform: - {fileID: 770571572399745426} - {fileID: 4606384253447135439} - {fileID: 5792645443749173149} + - {fileID: 7398030355940628667} + - {fileID: 7398030355940628664} + - {fileID: 7398030355940628665} + - {fileID: 7398030355940628670} + - {fileID: 7398030355940628671} + - {fileID: 7398030355940628668} + - {fileID: 7398030355940628669} + - {fileID: 7398030355940628658} + - {fileID: 7398030355940628659} + - {fileID: 7398030355940628656} m_Father: {fileID: 7955344795505032275} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -2247,7 +2135,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 6633855569037616094} + m_TransformParent: {fileID: 3368308072246989936} m_Modifications: - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_Pivot.x @@ -2332,14 +2220,34 @@ PrefabInstance: m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + insertIndex: -1 + addedObject: {fileID: 6911299261215506529} m_SourcePrefab: {fileID: 100100000, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} +--- !u!1 &35232468202879028 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + m_PrefabInstance: {fileID: 9000000000000000001} + m_PrefabAsset: {fileID: 0} +--- !u!225 &6911299261215506529 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 35232468202879028} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 --- !u!114 &6938913644452557114 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 2066472056369754427, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} m_PrefabInstance: {fileID: 9000000000000000001} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} + m_GameObject: {fileID: 35232468202879028} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: e9a3d376af46b584db655b1626aa6d54, type: 3} @@ -2356,7 +2264,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 6633855569037616094} + m_TransformParent: {fileID: 3368308072246989936} m_Modifications: - target: {fileID: 1072704683713788848, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_text @@ -2493,14 +2401,34 @@ PrefabInstance: m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + insertIndex: -1 + addedObject: {fileID: 2645525006361287743} m_SourcePrefab: {fileID: 100100000, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} +--- !u!1 &35232468202879031 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + m_PrefabInstance: {fileID: 9000000000000000002} + m_PrefabAsset: {fileID: 0} +--- !u!225 &2645525006361287743 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 35232468202879031} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 --- !u!114 &6938913644452557113 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 2066472056369754427, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} m_PrefabInstance: {fileID: 9000000000000000002} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} + m_GameObject: {fileID: 35232468202879031} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: e9a3d376af46b584db655b1626aa6d54, type: 3} @@ -2517,7 +2445,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 6633855569037616094} + m_TransformParent: {fileID: 3368308072246989936} m_Modifications: - target: {fileID: 1072704683713788848, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_text @@ -2565,11 +2493,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalRotation.z @@ -2654,14 +2582,34 @@ PrefabInstance: m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + insertIndex: -1 + addedObject: {fileID: 1809147997550203214} m_SourcePrefab: {fileID: 100100000, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} +--- !u!1 &35232468202879030 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + m_PrefabInstance: {fileID: 9000000000000000003} + m_PrefabAsset: {fileID: 0} +--- !u!225 &1809147997550203214 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 35232468202879030} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 --- !u!114 &6938913644452557112 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 2066472056369754427, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} m_PrefabInstance: {fileID: 9000000000000000003} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} + m_GameObject: {fileID: 35232468202879030} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: e9a3d376af46b584db655b1626aa6d54, type: 3} @@ -2678,7 +2626,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 6633855569037616094} + m_TransformParent: {fileID: 3368308072246989936} m_Modifications: - target: {fileID: 1072704683713788848, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_text @@ -2815,14 +2763,34 @@ PrefabInstance: m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + insertIndex: -1 + addedObject: {fileID: 3343145560675806971} m_SourcePrefab: {fileID: 100100000, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} +--- !u!1 &35232468202879025 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + m_PrefabInstance: {fileID: 9000000000000000004} + m_PrefabAsset: {fileID: 0} +--- !u!225 &3343145560675806971 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 35232468202879025} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 --- !u!114 &6938913644452557119 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 2066472056369754427, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} m_PrefabInstance: {fileID: 9000000000000000004} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} + m_GameObject: {fileID: 35232468202879025} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: e9a3d376af46b584db655b1626aa6d54, type: 3} @@ -2839,7 +2807,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 6633855569037616094} + m_TransformParent: {fileID: 3368308072246989936} m_Modifications: - target: {fileID: 1072704683713788848, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_text @@ -2887,11 +2855,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalRotation.z @@ -2972,14 +2940,34 @@ PrefabInstance: m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + insertIndex: -1 + addedObject: {fileID: 8848504739786790555} m_SourcePrefab: {fileID: 100100000, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} +--- !u!1 &35232468202879024 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + m_PrefabInstance: {fileID: 9000000000000000005} + m_PrefabAsset: {fileID: 0} +--- !u!225 &8848504739786790555 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 35232468202879024} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 --- !u!114 &6938913644452557118 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 2066472056369754427, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} m_PrefabInstance: {fileID: 9000000000000000005} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} + m_GameObject: {fileID: 35232468202879024} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: e9a3d376af46b584db655b1626aa6d54, type: 3} @@ -2996,7 +2984,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 6633855569037616094} + m_TransformParent: {fileID: 3368308072246989936} m_Modifications: - target: {fileID: 1072704683713788848, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_text @@ -3125,14 +3113,34 @@ PrefabInstance: m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + insertIndex: -1 + addedObject: {fileID: 8633921522187405142} m_SourcePrefab: {fileID: 100100000, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} +--- !u!1 &35232468202879027 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + m_PrefabInstance: {fileID: 9000000000000000006} + m_PrefabAsset: {fileID: 0} +--- !u!225 &8633921522187405142 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 35232468202879027} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 --- !u!114 &6938913644452557117 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 2066472056369754427, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} m_PrefabInstance: {fileID: 9000000000000000006} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} + m_GameObject: {fileID: 35232468202879027} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: e9a3d376af46b584db655b1626aa6d54, type: 3} @@ -3149,7 +3157,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 6633855569037616094} + m_TransformParent: {fileID: 3368308072246989936} m_Modifications: - target: {fileID: 1072704683713788848, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_text @@ -3201,7 +3209,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 1895304305689352378, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_LocalRotation.z @@ -3282,14 +3290,34 @@ PrefabInstance: m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + insertIndex: -1 + addedObject: {fileID: 6873265670208652556} m_SourcePrefab: {fileID: 100100000, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} +--- !u!1 &35232468202879026 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + m_PrefabInstance: {fileID: 9000000000000000007} + m_PrefabAsset: {fileID: 0} +--- !u!225 &6873265670208652556 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 35232468202879026} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 --- !u!114 &6938913644452557116 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 2066472056369754427, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} m_PrefabInstance: {fileID: 9000000000000000007} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} + m_GameObject: {fileID: 35232468202879026} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: e9a3d376af46b584db655b1626aa6d54, type: 3} @@ -3306,7 +3334,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 6633855569037616094} + m_TransformParent: {fileID: 3368308072246989936} m_Modifications: - target: {fileID: 1072704683713788848, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_text @@ -3439,14 +3467,34 @@ PrefabInstance: m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + insertIndex: -1 + addedObject: {fileID: 489579307996666993} m_SourcePrefab: {fileID: 100100000, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} +--- !u!1 &35232468202879037 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + m_PrefabInstance: {fileID: 9000000000000000008} + m_PrefabAsset: {fileID: 0} +--- !u!225 &489579307996666993 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 35232468202879037} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 --- !u!114 &6938913644452557107 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 2066472056369754427, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} m_PrefabInstance: {fileID: 9000000000000000008} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} + m_GameObject: {fileID: 35232468202879037} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: e9a3d376af46b584db655b1626aa6d54, type: 3} @@ -3463,7 +3511,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 6633855569037616094} + m_TransformParent: {fileID: 3368308072246989936} m_Modifications: - target: {fileID: 1072704683713788848, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_text @@ -3596,14 +3644,34 @@ PrefabInstance: m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + insertIndex: -1 + addedObject: {fileID: 3231421802605913456} m_SourcePrefab: {fileID: 100100000, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} +--- !u!1 &35232468202879036 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + m_PrefabInstance: {fileID: 9000000000000000009} + m_PrefabAsset: {fileID: 0} +--- !u!225 &3231421802605913456 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 35232468202879036} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 --- !u!114 &6938913644452557106 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 2066472056369754427, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} m_PrefabInstance: {fileID: 9000000000000000009} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} + m_GameObject: {fileID: 35232468202879036} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: e9a3d376af46b584db655b1626aa6d54, type: 3} @@ -3620,7 +3688,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 6633855569037616094} + m_TransformParent: {fileID: 3368308072246989936} m_Modifications: - target: {fileID: 1072704683713788848, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} propertyPath: m_text @@ -3753,14 +3821,34 @@ PrefabInstance: m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + insertIndex: -1 + addedObject: {fileID: 7745728862558909462} m_SourcePrefab: {fileID: 100100000, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} +--- !u!1 &35232468202879039 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8978849373333944373, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} + m_PrefabInstance: {fileID: 9000000000000000010} + m_PrefabAsset: {fileID: 0} +--- !u!225 &7745728862558909462 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 35232468202879039} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 --- !u!114 &6938913644452557105 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 2066472056369754427, guid: 784be79c954f1d84081cfbd20de48ee0, type: 3} m_PrefabInstance: {fileID: 9000000000000000010} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} + m_GameObject: {fileID: 35232468202879039} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: e9a3d376af46b584db655b1626aa6d54, type: 3} From 310ad292d0e2b73ba0bfd83ac3bc18e507018969 Mon Sep 17 00:00:00 2001 From: Romina Marchetti Date: Thu, 14 May 2026 15:51:35 +0100 Subject: [PATCH 26/28] Set to 95 black backgrounds with transparency --- .../EmotesWheel/Assets/EmotesWheelHUD.prefab | 719 +++++++++--------- .../Assets/FacialExpressionsWheelHUD.prefab | 480 +++++++++++- 2 files changed, 818 insertions(+), 381 deletions(-) diff --git a/Explorer/Assets/DCL/EmotesWheel/Assets/EmotesWheelHUD.prefab b/Explorer/Assets/DCL/EmotesWheel/Assets/EmotesWheelHUD.prefab index 030f17acf7d..4a989f4feb3 100644 --- a/Explorer/Assets/DCL/EmotesWheel/Assets/EmotesWheelHUD.prefab +++ b/Explorer/Assets/DCL/EmotesWheel/Assets/EmotesWheelHUD.prefab @@ -215,7 +215,7 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 3 + m_PixelsPerUnitMultiplier: 2.5 --- !u!114 &1341166584425063779 MonoBehaviour: m_ObjectHideFlags: 0 @@ -432,7 +432,6 @@ RectTransform: m_LocalScale: {x: 0, y: 0, z: 0} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 2913921208301803433} - {fileID: 3368308072246989936} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -581,81 +580,6 @@ CanvasGroup: m_Interactable: 1 m_BlocksRaycasts: 1 m_IgnoreParentGroups: 0 ---- !u!1 &3247684323739948405 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2913921208301803433} - - component: {fileID: 4745836198485645779} - - component: {fileID: 7937820618774625464} - m_Layer: 5 - m_Name: Delete - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &2913921208301803433 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3247684323739948405} - 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_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 7955344795505032275} - 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 &4745836198485645779 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3247684323739948405} - m_CullTransparentMesh: 1 ---- !u!114 &7937820618774625464 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3247684323739948405} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 21300000, guid: dba8824b6fe72463daad7bbc095f895e, type: 3} - m_Type: 0 - 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 &3679844280292778605 GameObject: m_ObjectHideFlags: 0 @@ -731,82 +655,7 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!1 &3967867082645134450 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6387641994105437130} - - component: {fileID: 6428647394411284262} - - component: {fileID: 6467756172435730145} - m_Layer: 5 - m_Name: Image - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &6387641994105437130 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3967867082645134450} - 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_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 2445375703582184909} - 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: -24, y: -24} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &6428647394411284262 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3967867082645134450} - m_CullTransparentMesh: 0 ---- !u!114 &6467756172435730145 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3967867082645134450} - 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: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 21300000, guid: f49bfce399a8c41568bf017a951a357a, type: 3} - m_Type: 0 - 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 &4193689391979073077 +--- !u!1 &3932073865174807102 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -814,9 +663,9 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 4269693610902622837} - - component: {fileID: 888999904676161069} - - component: {fileID: 4545782044258756994} + - component: {fileID: 4794220686679903806} + - component: {fileID: 8505923806040835807} + - component: {fileID: 2369410462101712670} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -824,40 +673,40 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &4269693610902622837 +--- !u!224 &4794220686679903806 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4193689391979073077} + m_GameObject: {fileID: 3932073865174807102} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.99999, y: 0.99999, z: 0.99999} + m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 623529305124580425} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -0.000030517578, y: 0} + m_AnchoredPosition: {x: -0.0001449585, y: -0.00005531311} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &888999904676161069 +--- !u!222 &8505923806040835807 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4193689391979073077} + m_GameObject: {fileID: 3932073865174807102} m_CullTransparentMesh: 0 ---- !u!114 &4545782044258756994 +--- !u!114 &2369410462101712670 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4193689391979073077} + m_GameObject: {fileID: 3932073865174807102} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -871,10 +720,10 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: 'Facial Expressions [Y]' + m_text: 'Facial Expressions [Y] ' m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 35aa85d68d15435418848a03a2db81ec, type: 2} - m_sharedMaterial: {fileID: 1701868249614554837, guid: 35aa85d68d15435418848a03a2db81ec, type: 2} + m_fontAsset: {fileID: 11400000, guid: 96ae0a2159a39234f858ea23bdcc74ad, type: 2} + m_sharedMaterial: {fileID: 735423033564544980, guid: 96ae0a2159a39234f858ea23bdcc74ad, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -943,6 +792,81 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &3967867082645134450 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6387641994105437130} + - component: {fileID: 6428647394411284262} + - component: {fileID: 6467756172435730145} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6387641994105437130 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3967867082645134450} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2445375703582184909} + 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: -24, y: -24} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6428647394411284262 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3967867082645134450} + m_CullTransparentMesh: 0 +--- !u!114 &6467756172435730145 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3967867082645134450} + 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: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: f49bfce399a8c41568bf017a951a357a, type: 3} + m_Type: 0 + 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 &4979140711266332923 GameObject: m_ObjectHideFlags: 0 @@ -1091,6 +1015,7 @@ GameObject: - component: {fileID: 6023903367326146379} - component: {fileID: 3926131445273152610} - component: {fileID: 7088067592052326316} + - component: {fileID: 7106644198525987485} m_Layer: 5 m_Name: EmotesButton m_TagString: Untagged @@ -1110,14 +1035,14 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 1 m_Children: - - {fileID: 1393095471465136078} + - {fileID: 3425933121361192302} m_Father: {fileID: 844836543111741865} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 68.66667, y: -24} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 6, y: 0} m_SizeDelta: {x: 120, y: 36} - m_Pivot: {x: 0.5, y: 0.5} + m_Pivot: {x: 0, y: 0.5} --- !u!222 &3926131445273152610 CanvasRenderer: m_ObjectHideFlags: 0 @@ -1155,48 +1080,92 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 2.8 ---- !u!1 &5873845419881500616 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 844836543111741865} - - component: {fileID: 7835879697316485249} - - component: {fileID: 5040959464859691122} - m_Layer: 5 - m_Name: Buttons - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &844836543111741865 -RectTransform: + m_PixelsPerUnitMultiplier: 2 +--- !u!114 &7106644198525987485 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5873845419881500616} - 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_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 6023903367326146379} - - {fileID: 623529305124580425} - - {fileID: 5444716907913731492} - m_Father: {fileID: 3368308072246989936} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 362} - m_SizeDelta: {x: 405, y: 48} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &7835879697316485249 + m_GameObject: {fileID: 5739133538321435758} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.8867924, g: 0.8867924, b: 0.8867924, a: 1} + m_PressedColor: {r: 1, g: 1, b: 1, a: 1} + m_SelectedColor: {r: 1, g: 1, b: 1, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 7088067592052326316} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &5873845419881500616 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 844836543111741865} + - component: {fileID: 7835879697316485249} + - component: {fileID: 5040959464859691122} + m_Layer: 5 + m_Name: Buttons + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &844836543111741865 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5873845419881500616} + 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_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6023903367326146379} + - {fileID: 623529305124580425} + - {fileID: 5444716907913731492} + m_Father: {fileID: 3368308072246989936} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 370} + m_SizeDelta: {x: 397, y: 48} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7835879697316485249 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1217,7 +1186,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image m_Material: {fileID: 0} - m_Color: {r: 0, g: 0, b: 0, a: 0.8} + m_Color: {r: 0, g: 0, b: 0, a: 0.9490196} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -1234,6 +1203,143 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1.5 +--- !u!1 &6662805588403719236 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3425933121361192302} + - component: {fileID: 2754684901851011965} + - component: {fileID: 3992472208725122564} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3425933121361192302 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6662805588403719236} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6023903367326146379} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -0.00016784668, y: -0.00005531311} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2754684901851011965 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6662805588403719236} + m_CullTransparentMesh: 0 +--- !u!114 &3992472208725122564 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6662805588403719236} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 'Emotes [B] ' + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 96ae0a2159a39234f858ea23bdcc74ad, type: 2} + m_sharedMaterial: {fileID: 735423033564544980, guid: 96ae0a2159a39234f858ea23bdcc74ad, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 18 + m_fontSizeBase: 18 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 10 + m_fontSizeMax: 12 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_characterHorizontalScale: 1 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} --- !u!1 &6941404510284847514 GameObject: m_ObjectHideFlags: 0 @@ -1254,7 +1360,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &2445375703582184909 RectTransform: m_ObjectHideFlags: 0 @@ -1531,143 +1637,6 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: [] ---- !u!1 &7203771032550047130 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1393095471465136078} - - component: {fileID: 7981132100156986676} - - component: {fileID: 5627430191444635635} - m_Layer: 5 - m_Name: Text (1) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1393095471465136078 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7203771032550047130} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.99999, y: 0.99999, z: 0.99999} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 6023903367326146379} - 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 &7981132100156986676 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7203771032550047130} - m_CullTransparentMesh: 0 ---- !u!114 &5627430191444635635 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7203771032550047130} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: 'Emotes [B]' - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 35aa85d68d15435418848a03a2db81ec, type: 2} - m_sharedMaterial: {fileID: 1701868249614554837, guid: 35aa85d68d15435418848a03a2db81ec, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 18 - m_fontSizeBase: 18 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 10 - m_fontSizeMax: 12 - m_fontStyle: 0 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_characterHorizontalScale: 1 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_TextWrappingMode: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_EmojiFallbackSupport: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 1 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} --- !u!1 &7786266590875165238 GameObject: m_ObjectHideFlags: 0 @@ -1699,14 +1668,14 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 1 m_Children: - - {fileID: 4269693610902622837} + - {fileID: 4794220686679903806} m_Father: {fileID: 844836543111741865} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 244.5, y: -24} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 132, y: 0} m_SizeDelta: {x: 217, y: 36} - m_Pivot: {x: 0.5, y: 0.5} + m_Pivot: {x: 0, y: 0.5} --- !u!222 &7921829479884777705 CanvasRenderer: m_ObjectHideFlags: 0 @@ -1728,7 +1697,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 0.101960786} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -1744,7 +1713,7 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 2.8 + m_PixelsPerUnitMultiplier: 2 --- !u!114 &2299642542487610113 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1766,13 +1735,13 @@ MonoBehaviour: m_SelectOnRight: {fileID: 0} m_Transition: 1 m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.8867924, g: 0.8867924, b: 0.8867924, a: 1} - m_PressedColor: {r: 1, g: 1, b: 1, a: 1} - m_SelectedColor: {r: 1, g: 1, b: 1, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_NormalColor: {r: 1, g: 1, b: 1, a: 0.03137255} + m_HighlightedColor: {r: 1, g: 1, b: 1, a: 0.050980393} + m_PressedColor: {r: 1, g: 1, b: 1, a: 0.03137255} + m_SelectedColor: {r: 1, g: 1, b: 1, a: 0.03137255} + m_DisabledColor: {r: 1, g: 1, b: 1, a: 0.03137255} m_ColorMultiplier: 1 - m_FadeDuration: 0.1 + m_FadeDuration: 0 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -1825,11 +1794,11 @@ RectTransform: - {fileID: 2573701102370018329} m_Father: {fileID: 844836543111741865} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 378.33334, y: -24} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -6, y: 0} m_SizeDelta: {x: 36, y: 36} - m_Pivot: {x: 0.5, y: 0.5} + m_Pivot: {x: 1, y: 0.5} --- !u!222 &2263726648819706875 CanvasRenderer: m_ObjectHideFlags: 0 @@ -1867,7 +1836,7 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 2.5 + m_PixelsPerUnitMultiplier: 2 --- !u!114 &8151960694815300835 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1889,13 +1858,13 @@ MonoBehaviour: m_SelectOnRight: {fileID: 0} m_Transition: 1 m_Colors: - m_NormalColor: {r: 0.08627451, g: 0.08235294, b: 0.09411765, a: 1} - m_HighlightedColor: {r: 0.2627451, g: 0.2509804, b: 0.2901961, a: 1} - m_PressedColor: {r: 0, g: 0, b: 0, a: 1} - m_SelectedColor: {r: 0.08627451, g: 0.08235294, b: 0.09411765, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_NormalColor: {r: 1, g: 1, b: 1, a: 0.03137255} + m_HighlightedColor: {r: 1, g: 1, b: 1, a: 0.050980393} + m_PressedColor: {r: 1, g: 1, b: 1, a: 0.03137255} + m_SelectedColor: {r: 1, g: 1, b: 1, a: 0.03137255} + m_DisabledColor: {r: 1, g: 1, b: 1, a: 0.03137255} m_ColorMultiplier: 1 - m_FadeDuration: 0.1 + m_FadeDuration: 0 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -2024,7 +1993,7 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 3 + m_PixelsPerUnitMultiplier: 2.5 --- !u!1 &9052593215416864460 GameObject: m_ObjectHideFlags: 0 @@ -2060,7 +2029,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -24, y: -24} + m_SizeDelta: {x: -22, y: -22} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &5418274400243681944 CanvasRenderer: diff --git a/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionsWheelHUD.prefab b/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionsWheelHUD.prefab index bd7637a7dc8..84cd58b22bc 100644 --- a/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionsWheelHUD.prefab +++ b/Explorer/Assets/DCL/FacialExpressionsWheel/Assets/FacialExpressionsWheelHUD.prefab @@ -61,7 +61,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image m_Material: {fileID: 0} - m_Color: {r: 0, g: 0, b: 0, a: 0.8} + m_Color: {r: 0, g: 0, b: 0, a: 0.9490196} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -112,7 +112,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: -140} + m_AnchoredPosition: {x: 0, y: -144.99998} m_SizeDelta: {x: 230, y: 26} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &3738596849537230179 @@ -840,7 +840,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0, g: 0, b: 0, a: 0.9019608} + m_Color: {r: 0, g: 0, b: 0, a: 0.9490196} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -1592,10 +1592,166 @@ PrefabInstance: propertyPath: m_Name value: EyebrowsCycler objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_FadeDuration + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.a + value: 0.5019608 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.a + value: 0.5019608 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_DisabledColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_DisabledColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_DisabledColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.a + value: 0.5019608 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_HighlightedColor.b + value: 0.9882353 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_HighlightedColor.g + value: 0.9882353 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_HighlightedColor.r + value: 0.9882353 + objectReference: {fileID: 0} + - target: {fileID: 3517418303353950190, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_AnchoredPosition.y + value: 18 + objectReference: {fileID: 0} - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} propertyPath: m_TargetGraphic value: objectReference: {fileID: 8463417098735742842} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_FadeDuration + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.a + value: 0.5019608 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.a + value: 0.5019608 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_DisabledColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_DisabledColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_DisabledColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.a + value: 0.5019608 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_HighlightedColor.b + value: 0.9882353 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_HighlightedColor.g + value: 0.9882353 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_HighlightedColor.r + value: 0.9882353 + objectReference: {fileID: 0} - target: {fileID: 7797977824454363499, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} propertyPath: m_Pivot.x value: 0.5 @@ -1662,7 +1818,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7797977824454363499, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} propertyPath: m_AnchoredPosition.y - value: -80 + value: -85 objectReference: {fileID: 0} - target: {fileID: 7797977824454363499, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -1877,10 +2033,166 @@ PrefabInstance: propertyPath: m_Name value: MouthCycler objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_FadeDuration + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.a + value: 0.5019608 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.a + value: 0.5019608 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_DisabledColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_DisabledColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_DisabledColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.a + value: 0.5019608 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_HighlightedColor.b + value: 0.9882353 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_HighlightedColor.g + value: 0.9882353 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_HighlightedColor.r + value: 0.9882353 + objectReference: {fileID: 0} + - target: {fileID: 3517418303353950190, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_AnchoredPosition.y + value: 18 + objectReference: {fileID: 0} - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} propertyPath: m_TargetGraphic value: objectReference: {fileID: 2254825450387275367} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_FadeDuration + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.a + value: 0.5019608 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.a + value: 0.5019608 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_DisabledColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_DisabledColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_DisabledColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.a + value: 0.5019608 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_HighlightedColor.b + value: 0.9882353 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_HighlightedColor.g + value: 0.9882353 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_HighlightedColor.r + value: 0.9882353 + objectReference: {fileID: 0} - target: {fileID: 6535751874698011380, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} propertyPath: m_text value: MOUTH @@ -1951,7 +2263,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7797977824454363499, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} propertyPath: m_AnchoredPosition.y - value: -80 + value: -84.99999 objectReference: {fileID: 0} - target: {fileID: 7797977824454363499, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -2009,10 +2321,166 @@ PrefabInstance: propertyPath: m_Name value: EyesCycler objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_FadeDuration + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.a + value: 0.5019608 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.a + value: 0.5019608 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_DisabledColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_DisabledColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_DisabledColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.a + value: 0.5019608 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_HighlightedColor.b + value: 0.9882353 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_HighlightedColor.g + value: 0.9882353 + objectReference: {fileID: 0} + - target: {fileID: 1117926642747261743, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_HighlightedColor.r + value: 0.9882353 + objectReference: {fileID: 0} + - target: {fileID: 3517418303353950190, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_AnchoredPosition.y + value: 18 + objectReference: {fileID: 0} - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} propertyPath: m_TargetGraphic value: objectReference: {fileID: 954079994904531469} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_FadeDuration + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.a + value: 0.5019608 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_NormalColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.a + value: 0.5019608 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_PressedColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_DisabledColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_DisabledColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_DisabledColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.a + value: 0.5019608 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.g + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_SelectedColor.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_HighlightedColor.b + value: 0.9882353 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_HighlightedColor.g + value: 0.9882353 + objectReference: {fileID: 0} + - target: {fileID: 4537227259206650587, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} + propertyPath: m_Colors.m_HighlightedColor.r + value: 0.9882353 + objectReference: {fileID: 0} - target: {fileID: 6535751874698011380, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} propertyPath: m_text value: EYES @@ -2083,7 +2551,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7797977824454363499, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} propertyPath: m_AnchoredPosition.y - value: -80 + value: -84.99999 objectReference: {fileID: 0} - target: {fileID: 7797977824454363499, guid: 02e2551a16632ac4db8e05163d51775b, type: 3} propertyPath: m_LocalEulerAnglesHint.x From 187780cbdbd90746d4df7a4b5fe38656be122350 Mon Sep 17 00:00:00 2001 From: Romina Marchetti Date: Thu, 14 May 2026 16:12:43 +0100 Subject: [PATCH 27/28] Quit close button scale animation on both wheels --- .../EmotesWheel/Assets/EmotesWheelHUD.prefab | 25 +---- .../Assets/FacialExpressionsWheelHUD.prefab | 97 ++++++++++++++----- 2 files changed, 74 insertions(+), 48 deletions(-) diff --git a/Explorer/Assets/DCL/EmotesWheel/Assets/EmotesWheelHUD.prefab b/Explorer/Assets/DCL/EmotesWheel/Assets/EmotesWheelHUD.prefab index 4a989f4feb3..7f52aba4de2 100644 --- a/Explorer/Assets/DCL/EmotesWheel/Assets/EmotesWheelHUD.prefab +++ b/Explorer/Assets/DCL/EmotesWheel/Assets/EmotesWheelHUD.prefab @@ -1770,7 +1770,6 @@ GameObject: - component: {fileID: 2263726648819706875} - component: {fileID: 354287178198379659} - component: {fileID: 8151960694815300835} - - component: {fileID: 5485597475768002028} - component: {fileID: 7393224432162247879} m_Layer: 5 m_Name: CloseButton @@ -1881,28 +1880,6 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: [] ---- !u!95 &5485597475768002028 -Animator: - serializedVersion: 7 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8712545561102699128} - m_Enabled: 1 - m_Avatar: {fileID: 0} - m_Controller: {fileID: 9100000, guid: c22edc5eaba53f342bc161d6cbd411de, type: 2} - m_CullingMode: 0 - m_UpdateMode: 0 - m_ApplyRootMotion: 0 - m_LinearVelocityBlending: 0 - m_StabilizeFeet: 0 - m_AnimatePhysics: 0 - m_WarningMessage: - m_HasTransformHierarchy: 1 - m_AllowConstantClipSamplingOptimization: 1 - m_KeepAnimatorStateOnDisable: 0 - m_WriteDefaultValuesOnDisable: 0 --- !u!114 &7393224432162247879 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1916,7 +1893,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: