using Sirenix.OdinInspector; using System.Collections; using Unity.Netcode; using UnityEngine; using Zenject; using ParrelSync; public class GameManager : NetworkBehaviour { [SerializeField] [ReadOnly] [Inject] private PlayerComponent soloRig; [SerializeField] [ReadOnly] private PlayerComponent multiplayerRig; public PlayerComponent LocalPlayer => multiplayerRig ?? soloRig; [SerializeField] [ReadOnly] [Inject] private NetworkManager networkManager; [SerializeField] private bool autoConnectOrHost = true; private void Start() { networkManager.OnClientConnectedCallback += OnClientConnectedCallback; networkManager.OnClientDisconnectCallback += OnClientDisconnectCallback; if (autoConnectOrHost) { if (ClonesManager.IsClone()) { networkManager.StartClient(); } else { networkManager.StartHost(); } } } private void OnClientConnectedCallback(ulong clientId) { Debug.Log($"Client-{clientId} is connected and can spawn {nameof(NetworkObject)}s."); if (networkManager.LocalClientId == clientId) { StartCoroutine(SwitchSoloMultiplayerRig(false)); } } private IEnumerator SwitchSoloMultiplayerRig(bool toSolo) { yield return new WaitForEndOfFrame(); if (toSolo) { soloRig.Toggle(toSolo); soloRig.Teleport(multiplayerRig.Position, multiplayerRig.Position); multiplayerRig.DestroyDependencies(); multiplayerRig = null; } else { soloRig.Toggle(toSolo); var playerObject = networkManager.LocalClient.PlayerObject; multiplayerRig = playerObject.GetComponent(); multiplayerRig.Teleport(soloRig.Position, soloRig.Position); multiplayerRig.ToggleAudioListener(true); } } private void OnClientDisconnectCallback(ulong clientId) { Debug.Log($"Client-{clientId} is disconnected"); if (networkManager.LocalClientId == clientId) { StartCoroutine(SwitchSoloMultiplayerRig(true)); } } }