|
|
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.Networking;
-
-
- namespace Multiplayer
- {
-
- public class PlayersManager : MonoSingleton<PlayersManager>
- {
- [SerializeField]
- public GameObject LocalPlayerPrefab;
-
- [SerializeField]
- public GameObject RemotePlayerPrefab;
-
- public Dictionary<byte, PlayerData> Players = new Dictionary<byte, PlayerData>();
- public PlayerData LocalPlayer;
-
- private void Start()
- {
- RegisterHandlers();
-
- PlayerData localPlayer = new PlayerData(ClientManager.Instance.ID, ClientManager.Instance.Name, Color.white);
- localPlayer.isLocalPlayer = true;
- Players.Add(localPlayer.ID, localPlayer);
- LocalPlayer = localPlayer;
- }
-
- public void RegisterHandlers()
- {
- ClientManager.Instance.Client.RegisterHandler(PlayerMsgID.Position, RecievePosition);
- ClientManager.Instance.Client.RegisterHandler(LoginMsgID.RemotePlayerJoin, OnRemotePlayerJoin);
- ClientManager.Instance.Client.RegisterHandler(LoginMsgID.RemotePlayerExit, OnRemotePlayerLeave);
- }
-
- public void InstantiatePlayers()
- {
- foreach (PlayerData playerData in Players.Values)
- {
- if (playerData.isLocalPlayer)
- playerData.Instantiate(LocalPlayerPrefab, transform);
- else
- playerData.Instantiate(RemotePlayerPrefab, transform);
- }
- }
-
- public void DestroyPlayers()
- {
- foreach (PlayerData player in Players.Values)
- if (player.Player != null)
- Destroy(player.gameObject);
- }
-
-
- public void SendPosition(Vector3 position)
- {
- ClientManager.Instance.SendMessage(PlayerMsgID.Position, new VectorMsg(ClientManager.Instance.ID, position));
- }
-
- public void RecievePosition(NetworkMessage msg)
- {
-
- VectorMsg vectorMsg;
- if (!Utility.ReadMessage<VectorMsg>(msg, out vectorMsg))
- return;
-
- if (Players.ContainsKey(vectorMsg.ID))
- Players[vectorMsg.ID].SetPosition(vectorMsg.vector);
- }
-
- public void OnRemotePlayerJoin(NetworkMessage msg)
- {
-
- PlayerDataMsg playerMsg;
-
- if (!Utility.ReadMessage<PlayerDataMsg>(msg, out playerMsg))
- return;
-
- if (Players.ContainsKey(playerMsg.ID))
- Debug.Log(Players[playerMsg.ID].Name + ", trying to join twice");
-
- PlayerData newPlayer = new PlayerData(playerMsg.ID, playerMsg.Name, playerMsg.Color);
- Players.Add(playerMsg.ID, newPlayer);
- }
-
- public void OnRemotePlayerLeave(NetworkMessage msg)
- {
- PlayerMsg playerMsg;
-
- if (!Utility.ReadMessage<PlayerMsg>(msg, out playerMsg))
- return;
-
- if (!Players.ContainsKey(playerMsg.ID))
- Debug.Log("Unknown Player Left");
-
- PlayerData leftPlayer = Players[playerMsg.ID];
- Players.Remove(playerMsg.ID);
-
- if (leftPlayer.gameObject != null)
- Destroy(leftPlayer.gameObject);
- }
-
- }
- }
|