CouchPlayerManager.cs 2.42 KB
Newer Older
cann-alberto's avatar
cann-alberto committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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<GameObject> couchPlayersList = new SyncList<GameObject>();

        public override void OnStartAuthority()
        {
            // hook up UI to local player, for cmd communication
#if UNITY_2022_2_OR_NEWER
            canvasScript = GameObject.FindAnyObjectByType<CanvasScript>();
#else
            // Deprecated in Unity 2023.1
            canvasScript = GameObject.FindObjectOfType<CanvasScript>();
#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>();
            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);
     
        }
    }

}