Game Room Manager
unknown
csharp
a year ago
9.7 kB
13
Indexable
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using Unity.Netcode;
using EditorAttributes;
using System.Collections;
using DG.Tweening;
using Unity.Services.Multiplayer;
using Unity.Collections.LowLevel.Unsafe;
using System.Collections.Generic;
public class LobbyRoomManager : MonoBehaviour
{
WaitForSeconds _oneSecondWaitTime = new(1);
[SerializeField] TextMeshProUGUI _statusText;
Tween _statusTextChangeTween;
[SerializeField] TextMeshProUGUI _lobbyRoomCodeText;
[SerializeField] Button _readyButton;
[Header("Host")]
[SerializeField] TextMeshProUGUI _hostNameText;
[SerializeField] Image _hostLeaderImage;
[SerializeField] GameObject _hostReadyDisplay;
[Header("Guest")]
[SerializeField] TextMeshProUGUI _guestNameText;
[SerializeField] Image _guestLeaderImage;
[SerializeField] GameObject _guestReadyDisplay;
[Space(10)]
[SerializeField] Button _openDeckSelectButton;
[SerializeField] Image _selectedDeckLeaderImage;
[SerializeField] TextMeshProUGUI _selectedDeckNameText;
[SerializeField/*, ReadOnly*/] DeckSO _selectedDeck;
bool _isReady = false;
bool _countingDown = false;
Tween _countdownTween;
//Network Variables
NetworkVariable<int> _hostLeaderId;
NetworkVariable<int> _guestLeaderId;
//Empty Values
[SerializeField] Sprite _emptyDeckImage;
string _emptyDeckName = "Ningun mazo seleccionado";
string _defaultGuestName = "Esperando oponente...";
//Temp
[Header("Temp")]
[SerializeField/*, ReadOnly*/] DeckSO _defaultDeck;
public ISession _currentSession { get; private set; }
public bool RoomFound { get; private set; }
Tween _updateTextOnPlayerJoined;
void Start()
{
_currentSession = null;
_selectedDeck = null;
AddButtonListeners();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Backslash))
_selectedDeck = _defaultDeck;
}
void SetStatusText(string text, float duration = 3f)
{
if (_statusTextChangeTween != null)
{
_statusTextChangeTween.Kill();
}
duration -= 0.3f;
_statusText.text = text;
_statusTextChangeTween = _statusText.DOFade(1, 0.15f).From(0).OnComplete(() =>
{
_statusTextChangeTween = _statusText.DOFade(1, duration).From(1).OnComplete(() =>
{
_statusTextChangeTween = _statusText.DOFade(0, 0.15f).OnComplete(() =>
{
_statusText.text = "";
_statusTextChangeTween = null;
});
});
});
}
void AddButtonListeners()
{
_readyButton.onClick.AddListener(() => { StartCoroutine(ReadyUp()); });
_openDeckSelectButton.onClick.AddListener(() => { SelectDeck(); });
}
public async void CreateRoom()
{
// Check if player is in a lobby already, if so quit it
RoomFound = false;
try
{
var options = new SessionOptions
{
MaxPlayers = 2
}.WithRelayNetwork();
var session = await MultiplayerService.Instance.CreateSessionAsync(options);
RoomFound = true;
_currentSession = session;
session.PlayerPropertiesChanged += UpdatePlayerStatus;
session.CurrentPlayer.SetProperty("PlayerName", new(AuthenticationManager.Instance.PlayerName()));
session.CurrentPlayer.SetProperty("PlayerReady", new("false"));
await session.SaveCurrentPlayerDataAsync();
//_hostNameText.text = AuthenticationManager.Instance.PlayerName();
_lobbyRoomCodeText.text = session.Code;
}
catch (SessionException e)
{
Debug.Log(e);
}
}
public async void JoinRoom(string roomCode)
{
RoomFound = false;
try
{
var session = await MultiplayerService.Instance.JoinSessionByCodeAsync(roomCode);
RoomFound = true;
_currentSession = session;
session.PlayerPropertiesChanged += UpdatePlayerStatus;
session.CurrentPlayer.SetProperty("PlayerName", new(AuthenticationManager.Instance.PlayerName()));
session.CurrentPlayer.SetProperty("PlayerReady", new("false"));
await session.SaveCurrentPlayerDataAsync();
//_guestNameText.text = AuthenticationManager.Instance.PlayerName();
_lobbyRoomCodeText.text = session.Code;
}
catch (SessionException e)
{
Debug.Log(e);
}
}
void UpdatePlayerStatus()
{
float transitionDuration = 0.25f;
bool isGuestReady = false;
bool isHostReady = false;
if (_updateTextOnPlayerJoined != null)
_updateTextOnPlayerJoined.Kill();
_updateTextOnPlayerJoined = _readyButton.image.DOFade(1, transitionDuration).From(1).OnComplete(() =>
{
foreach (var player in _currentSession.Players)
{
var playerId = player.Id;
var playerName = player.Properties["PlayerName"].Value;
var playerReady = bool.Parse(player.Properties["PlayerReady"].Value);
if (_currentSession.Host == playerId)
{
isHostReady = playerReady;
_hostReadyDisplay.SetActive(playerReady);
_hostNameText.text = playerName;
}
else
{
isGuestReady = playerReady;
_guestReadyDisplay.SetActive(playerReady);
_guestNameText.text = playerName;
}
}
CheckForPlayersReady(isGuestReady, isHostReady);
});
}
void CheckForPlayersReady(bool guestReady, bool hostReady)
{
float waitTimeToStart = 5f;
if (!_countingDown)
{
if (guestReady && hostReady)
{
//Start countdown
_countingDown = true;
SetStatusText("Comenzando juego...", waitTimeToStart - 1);
if (_countdownTween != null)
_countdownTween.Kill();
_countdownTween = _updateTextOnPlayerJoined = _readyButton.image.DOFade(1, waitTimeToStart - 1f).From(1).OnComplete(() =>
{
_readyButton.interactable = false;
_countdownTween = _updateTextOnPlayerJoined = _readyButton.image.DOFade(1, 1f).From(1).OnComplete(() =>
{
SetStatusText("Cargando...", 5f);
StartGame();
});
});
}
}
else
{
if (!guestReady || !hostReady)
{
//Game cancelled
SetStatusText("Partida Cancelada...", 5f);
if (_countdownTween != null)
_countdownTween.Kill();
_countdownTween = _updateTextOnPlayerJoined = _readyButton.image.DOFade(1, 1f).From(1).OnComplete(() =>
{
_readyButton.interactable = true;
});
}
}
}
public void QuitLobby()
{
//Remove this player from lobby
//If it's the host, close the lobby and kick guest if any
//Ready = false and make buttons interactable again
//Clear Player Data
_selectedDeckNameText.text = _emptyDeckName;
_selectedDeck = null;
_isReady = false;
if (!_currentSession.IsHost)
_guestNameText.text = _defaultGuestName;
ChangeReadyStatus();
}
public void SelectDeck()
{
}
public void OpenDeckSelectMenu()
{
}
IEnumerator ReadyUp()
{
if (!_isReady)
{
if (_selectedDeck == null)
{
SetStatusText("No hay ningun mazo seleccionado", 2f);
_readyButton.interactable = false;
_openDeckSelectButton.interactable = false;
yield return _oneSecondWaitTime;
yield return _oneSecondWaitTime;
_readyButton.interactable = true;
_openDeckSelectButton.interactable = true;
yield return null;
}
else
{
_isReady = true;
ChangeReadyStatus();
_readyButton.interactable = false;
_openDeckSelectButton.interactable = false;
yield return _oneSecondWaitTime;
_readyButton.interactable = true;
}
}
else
{
_isReady = false;
ChangeReadyStatus();
_readyButton.interactable = false;
yield return _oneSecondWaitTime;
_readyButton.interactable = true;
_openDeckSelectButton.interactable = true;
}
}
async void ChangeReadyStatus()
{
var session = _currentSession;
session.CurrentPlayer.SetProperty("PlayerReady", new(_isReady.ToString()));
await session.SaveCurrentPlayerDataAsync();
}
public void StartGame()
{
Debug.Log("Partida comenzo.");
}
}Editor is loading...
Leave a Comment