using TMPro; using UnityEngine; using UnityEngine.UI; namespace XRMultiplayer { public class OfflineMenu : MonoBehaviour { /// /// Colors to choose from for the player. /// [SerializeField, Tooltip("Default name for the player")] Color[] m_PlayerColors; [Header("Player Info")] /// /// Default name for the player. /// [SerializeField, Tooltip("Default name for the player")] string m_DefaultPlayerName = "Unity Creator"; [SerializeField] TMP_Text m_PlayerNameText; [SerializeField] TMP_Text m_PlayerInitialText; [SerializeField] Image[] m_PlayerColorIcons; [SerializeField] Image m_VolumeIndicator; [SerializeField] Image m_MicIcon; [SerializeField] Sprite m_MutedSprite; [SerializeField] Sprite m_UnmutedSprite; [Header("Panel Objects")] [SerializeField] GameObject m_CustomizationPanel; [SerializeField] GameObject m_ConnectionPanel; VoiceChatManager m_VoiceChatManager; private void Awake() { XRINetworkGameManager.Connected.Subscribe(OnConnected); XRINetworkGameManager.LocalPlayerName.Subscribe(SetPlayerName); XRINetworkGameManager.LocalPlayerColor.Subscribe(SetPlayerColor); OfflinePlayerAvatar.voiceAmp.Subscribe(UpdateMicIcon); m_VoiceChatManager = FindFirstObjectByType(); m_VoiceChatManager.selfMuted.Subscribe(MutedChanged); SetupPlayerDefaults(); } private void Start() { ShowCustomization(); XRINetworkGameManager.Instance.connectionFailedAction += ConnectionFailed; } private void OnDestroy() { XRINetworkGameManager.Connected.Unsubscribe(OnConnected); XRINetworkGameManager.LocalPlayerName.Unsubscribe(SetPlayerName); XRINetworkGameManager.LocalPlayerColor.Unsubscribe(SetPlayerColor); OfflinePlayerAvatar.voiceAmp.Unsubscribe(UpdateMicIcon); m_VoiceChatManager.selfMuted.Subscribe(MutedChanged); XRINetworkGameManager.Instance.connectionFailedAction -= ConnectionFailed; } void SetupPlayerDefaults() { XRINetworkGameManager.LocalPlayerName.Value = m_DefaultPlayerName; XRINetworkGameManager.LocalPlayerColor.Value = m_PlayerColors[Random.Range(0, m_PlayerColors.Length)]; } void SetPlayerName(string name) { if (name == string.Empty) { SetupPlayerDefaults(); return; } m_PlayerNameText.text = name; m_PlayerInitialText.text = name.Substring(0, 1); m_PlayerNameText.rectTransform.sizeDelta = new Vector2(m_PlayerNameText.preferredWidth * .25f, m_PlayerNameText.rectTransform.sizeDelta.y); } void SetPlayerColor(Color color) { foreach (var c in m_PlayerColorIcons) { c.color = color; } } void UpdateMicIcon(float amp) { m_VolumeIndicator.fillAmount = amp; } void ShowCustomization() { m_CustomizationPanel.SetActive(true); m_ConnectionPanel.SetActive(false); } public void CompleteCustomization() { m_CustomizationPanel.SetActive(false); m_ConnectionPanel.SetActive(true); } void OnConnected(bool connected) { if (connected) { m_CustomizationPanel.SetActive(false); } else { gameObject.SetActive(true); ShowCustomization(); } } void MutedChanged(bool muted) { m_MicIcon.sprite = muted ? m_MutedSprite : m_UnmutedSprite; } void ConnectionFailed(string reason) { CompleteCustomization(); } } }