Files
RoomAwareVR/Assets/VRMPAssets/Scripts/UI/OfflineMenu.cs
2025-05-26 00:46:28 +02:00

131 lines
4.0 KiB
C#

using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace XRMultiplayer
{
public class OfflineMenu : MonoBehaviour
{
/// <summary>
/// Colors to choose from for the player.
/// </summary>
[SerializeField, Tooltip("Default name for the player")] Color[] m_PlayerColors;
[Header("Player Info")]
/// <summary>
/// Default name for the player.
/// </summary>
[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<VoiceChatManager>();
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();
}
}
}