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> 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(); } 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); var playerObject = networkManager.LocalClient.PlayerObject; player = playerObject.GetComponent(); } 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); } }