using TMPro; using UnityEngine; using UnityEngine.UI; namespace LobbyRelaySample.UI { /// /// When inside a lobby, this will show information about a player, whether local or remote. /// public class InLobbyUserUI : UIPanelBase { [SerializeField] TMP_Text m_DisplayNameText; [SerializeField] TMP_Text m_StatusText; [SerializeField] Image m_HostIcon; [SerializeField] Image m_EmoteImage; [SerializeField] Sprite[] m_EmoteIcons; [SerializeField] vivox.VivoxUserHandler m_VivoxUserHandler; public bool IsAssigned => UserId != null; public string UserId { get; set; } LocalPlayer m_LocalPlayer; public void SetUser(LocalPlayer localPlayer) { Show(); m_LocalPlayer = localPlayer; UserId = localPlayer.ID.Value; SetIsHost(localPlayer.IsHost.Value); SetEmote(localPlayer.Emote.Value); SetUserStatus(localPlayer.UserStatus.Value); SetDisplayName(m_LocalPlayer.DisplayName.Value); SubscribeToPlayerUpdates(); m_VivoxUserHandler.SetId(UserId); } void SubscribeToPlayerUpdates() { m_LocalPlayer.DisplayName.onChanged += SetDisplayName; m_LocalPlayer.UserStatus.onChanged += SetUserStatus; m_LocalPlayer.Emote.onChanged += SetEmote; m_LocalPlayer.IsHost.onChanged += SetIsHost; } void UnsubscribeToPlayerUpdates() { if (m_LocalPlayer == null) return; if (m_LocalPlayer.DisplayName?.onChanged != null) m_LocalPlayer.DisplayName.onChanged -= SetDisplayName; if (m_LocalPlayer.UserStatus?.onChanged != null) m_LocalPlayer.UserStatus.onChanged -= SetUserStatus; if (m_LocalPlayer.Emote?.onChanged != null) m_LocalPlayer.Emote.onChanged -= SetEmote; if (m_LocalPlayer.IsHost?.onChanged != null) m_LocalPlayer.IsHost.onChanged -= SetIsHost; } public void ResetUI() { if (m_LocalPlayer == null) return; UserId = null; SetEmote(EmoteType.None); SetUserStatus(PlayerStatus.Lobby); Hide(); UnsubscribeToPlayerUpdates(); m_LocalPlayer = null; } void SetDisplayName(string displayName) { m_DisplayNameText.SetText(displayName); } void SetUserStatus(PlayerStatus statusText) { m_StatusText.SetText(SetStatusFancy(statusText)); } void SetEmote(EmoteType emote) { m_EmoteImage.sprite = EmoteIcon(emote); } void SetIsHost(bool isHost) { m_HostIcon.enabled = isHost; } /// /// EmoteType to Icon Sprite /// m_EmoteIcon[0] = Smile /// m_EmoteIcon[1] = Frown /// m_EmoteIcon[2] = UnAmused /// m_EmoteIcon[3] = Tongue /// Sprite EmoteIcon(EmoteType type) { switch (type) { case EmoteType.None: m_EmoteImage.color = Color.clear; return null; case EmoteType.Smile: m_EmoteImage.color = Color.white; return m_EmoteIcons[0]; case EmoteType.Frown: m_EmoteImage.color = Color.white; return m_EmoteIcons[1]; case EmoteType.Unamused: m_EmoteImage.color = Color.white; return m_EmoteIcons[2]; case EmoteType.Tongue: m_EmoteImage.color = Color.white; return m_EmoteIcons[3]; default: return null; } } string SetStatusFancy(PlayerStatus status) { switch (status) { case PlayerStatus.Lobby: return "In Lobby"; // Light Blue case PlayerStatus.Ready: return "Ready"; // Light Mint case PlayerStatus.Connecting: return "Connecting..."; // Bright Yellow case PlayerStatus.InGame: return "In Game"; // Green default: return ""; } } } }