Files
dungeons/Assets/Scripts/Managers/GameManager.cs

148 lines
3.6 KiB
C#

using Sirenix.OdinInspector;
using System.Collections;
using Unity.Netcode;
using UnityEngine;
using Zenject;
using ParrelSync;
using UnityEngine.Events;
using System.Collections.Generic;
public class GameManager : NetworkBehaviour
{
[SerializeField]
private GameObject rigPrefab;
[SerializeField]
[ReadOnly]
private PlayerComponent player;
public PlayerComponent LocalPlayer => player;
[SerializeField]
[ReadOnly]
[Inject]
private NetworkManager networkManager;
[SerializeField]
private bool autoConnectOrHost = true;
public bool IsMultiplayer => networkManager.IsConnectedClient;
public NetworkClient LocalClient => networkManager.LocalClient;
public UnityEvent OnConnected;
public UnityEvent OnDisconnected;
public UnityEvent<IReadOnlyList<NetworkClient>> OnClientsChanged;
private void Start()
{
networkManager.OnClientStarted += OnClientStarted;
networkManager.OnClientStopped += OnClientStopped;
networkManager.OnClientConnectedCallback += OnClientConnectedCallback;
networkManager.OnClientDisconnectCallback += OnClientDisconnectCallback;
player = SpawnSoloRig();
if (autoConnectOrHost)
{
if (ClonesManager.IsClone())
{
JoinGame("");
}
else
{
HostGame();
}
}
}
private PlayerComponent SpawnSoloRig()
{
return Instantiate(rigPrefab).GetComponent<PlayerComponent>();
}
public void JoinGame(string code)
{
networkManager.StartClient();
}
public void HostGame()
{
networkManager.StartHost();
}
public void LeaveGame()
{
networkManager.Shutdown(true);
//if (networkManager.IsHost)
//{
// networkManager.Shutdown(true);
//}
//else
//{
// networkManager.
//}
}
private void OnClientStarted()
{
OnConnected?.Invoke();
OnClientsChanged.Invoke(networkManager.ConnectedClientsList);
}
private void OnClientStopped(bool wasHost)
{
OnDisconnected?.Invoke();
OnClientsChanged.Invoke(networkManager.ConnectedClientsList);
}
private void OnClientConnectedCallback(ulong clientId)
{
Debug.Log($"Client-{clientId} is connected and can spawn {nameof(NetworkObject)}s.");
if (networkManager.LocalClientId == clientId)
{
StartCoroutine(SwitchSoloMultiplayerRig(false));
}
OnClientsChanged.Invoke(networkManager.ConnectedClientsList);
}
private IEnumerator SwitchSoloMultiplayerRig(bool toSolo)
{
yield return new WaitForEndOfFrame();
var position = player.Position;
var rotation = player.Rotation;
player.DestroyDependencies();
if (toSolo)
{
yield return new WaitForEndOfFrame();
player = SpawnSoloRig();
}
else
{
Destroy(player.gameObject);
yield return new WaitForEndOfFrame();
var playerObject = networkManager.LocalClient.PlayerObject;
player = playerObject.GetComponent<PlayerComponent>();
}
player.Teleport(position, rotation);
}
private void OnClientDisconnectCallback(ulong clientId)
{
Debug.Log($"Client-{clientId} is disconnected");
if (networkManager.LocalClientId == clientId)
{
StartCoroutine(SwitchSoloMultiplayerRig(true));
}
OnClientsChanged.Invoke(networkManager.ConnectedClientsList);
}
}