using UnityEngine; using Mirror; namespace Mirror.Examples.CouchCoop { public class CouchPlayerManager : NetworkBehaviour { // reference to UI that should be in the scene public CanvasScript canvasScript; // for multiple player prefabs, currently not implemented, remember to add these into Network Managers Prefab array. public GameObject[] playerPrefabs; public int totalCouchPlayers = 0; // ignore key controls 0, we will always start at 1 public KeyCode[] playerKeyJump; public KeyCode[] playerKeyLeft; public KeyCode[] playerKeyRight; // store a list of players so we know which to remove later // can be non sync-list, but may be useful for future features readonly SyncList couchPlayersList = new SyncList(); public override void OnStartAuthority() { // hook up UI to local player, for cmd communication #if UNITY_2022_2_OR_NEWER canvasScript = GameObject.FindAnyObjectByType(); #else // Deprecated in Unity 2023.1 canvasScript = GameObject.FindObjectOfType(); #endif canvasScript.couchPlayerManager = this; } [Command] public void CmdAddPlayer() { if (totalCouchPlayers >= playerKeyJump.Length-1) { Debug.Log(name + " - No controls setup for further players."); return; } totalCouchPlayers += 1; Transform spawnObj = NetworkManager.startPositions[Random.Range(0, NetworkManager.startPositions.Count)]; GameObject playerObj = Instantiate(playerPrefabs[0], spawnObj.position, spawnObj.rotation); CouchPlayer couchPlayer = playerObj.GetComponent(); couchPlayer.playerNumber = totalCouchPlayers; NetworkServer.Spawn(playerObj, connectionToClient); couchPlayersList.Add(playerObj); } [Command] public void CmdRemovePlayer() { if (totalCouchPlayers <= 0) { Debug.Log(name + " - No players to remove for that connection."); return; } totalCouchPlayers -= 1; NetworkServer.Destroy(couchPlayersList[couchPlayersList.Count - 1]); couchPlayersList.RemoveAt(couchPlayersList.Count - 1); } } }