CouchPlayerManager.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using UnityEngine;
  2. using Mirror;
  3. namespace Mirror.Examples.CouchCoop
  4. {
  5. public class CouchPlayerManager : NetworkBehaviour
  6. {
  7. // reference to UI that should be in the scene
  8. public CanvasScript canvasScript;
  9. // for multiple player prefabs, currently not implemented, remember to add these into Network Managers Prefab array.
  10. public GameObject[] playerPrefabs;
  11. public int totalCouchPlayers = 0;
  12. // ignore key controls 0, we will always start at 1
  13. public KeyCode[] playerKeyJump;
  14. public KeyCode[] playerKeyLeft;
  15. public KeyCode[] playerKeyRight;
  16. // store a list of players so we know which to remove later
  17. // can be non sync-list, but may be useful for future features
  18. readonly SyncList<GameObject> couchPlayersList = new SyncList<GameObject>();
  19. public override void OnStartAuthority()
  20. {
  21. // hook up UI to local player, for cmd communication
  22. #if UNITY_2021_3_OR_NEWER
  23. canvasScript = GameObject.FindAnyObjectByType<CanvasScript>();
  24. #else
  25. // Deprecated in Unity 2023.1
  26. canvasScript = GameObject.FindObjectOfType<CanvasScript>();
  27. #endif
  28. canvasScript.couchPlayerManager = this;
  29. }
  30. [Command]
  31. public void CmdAddPlayer()
  32. {
  33. if (totalCouchPlayers >= playerKeyJump.Length-1)
  34. {
  35. Debug.Log(name + " - No controls setup for further players.");
  36. return;
  37. }
  38. totalCouchPlayers += 1;
  39. Transform spawnObj = NetworkManager.startPositions[Random.Range(0, NetworkManager.startPositions.Count)];
  40. GameObject playerObj = Instantiate(playerPrefabs[0], spawnObj.position, spawnObj.rotation);
  41. CouchPlayer couchPlayer = playerObj.GetComponent<CouchPlayer>();
  42. couchPlayer.playerNumber = totalCouchPlayers;
  43. NetworkServer.Spawn(playerObj, connectionToClient);
  44. couchPlayersList.Add(playerObj);
  45. }
  46. [Command]
  47. public void CmdRemovePlayer()
  48. {
  49. if (totalCouchPlayers <= 0)
  50. {
  51. Debug.Log(name + " - No players to remove for that connection.");
  52. return;
  53. }
  54. totalCouchPlayers -= 1;
  55. NetworkServer.Destroy(couchPlayersList[couchPlayersList.Count - 1]);
  56. couchPlayersList.RemoveAt(couchPlayersList.Count - 1);
  57. }
  58. }
  59. }