70 lines
2.4 KiB
C#
Raw Normal View History

2024-10-17 17:23:05 +03:00
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);
}
}
}