139 lines
4.4 KiB
C#
139 lines
4.4 KiB
C#
using System.Collections;
|
|
using System.Net;
|
|
using Network.Defines;
|
|
using Network.NetworkApplication;
|
|
using Network.NetworkTransport;
|
|
using UnityEngine;
|
|
using Vector3 = UnityEngine.Vector3;
|
|
|
|
public class NetworkManager : MonoBehaviour
|
|
{
|
|
public static NetworkManager Instance;
|
|
private ReliableUdpTransport _transport;
|
|
private MessageManager _messageManager;
|
|
private IPEndPoint _serverPoint;
|
|
private uint _sequence = 0;
|
|
[SerializeField] private GameObject _wrongWindow;
|
|
|
|
private void Awake()
|
|
{
|
|
Instance = this;
|
|
StartCoroutine(InitNetwork());
|
|
}
|
|
|
|
private IEnumerator InitNetwork()
|
|
{
|
|
_transport = new ReliableUdpTransport("127.0.0.1", 8080);
|
|
yield return _transport.StartAsync();
|
|
_messageManager = new MessageManager(_transport);
|
|
RegisterHandler();
|
|
StartCoroutine(Heartbeat());
|
|
}
|
|
|
|
private IEnumerator Heartbeat()
|
|
{
|
|
while (true)
|
|
{
|
|
if (_serverPoint != null)
|
|
{
|
|
var heartbeat = new Heartbeat();
|
|
_messageManager.SendMessage(heartbeat, MessageType.Heartbeat, _serverPoint);
|
|
}
|
|
|
|
yield return new WaitForSeconds(2.0f);
|
|
}
|
|
}
|
|
|
|
private void RegisterHandler()
|
|
{
|
|
_messageManager.RegisterHandler(MessageType.LoginResponse, HandleLoginResponse);
|
|
_messageManager.RegisterHandler(MessageType.PlayerState, HandlePlayerState);
|
|
_messageManager.RegisterHandler(MessageType.HeartbeatResponse, HandleHeartbeatResponse);
|
|
_messageManager.RegisterHandler(MessageType.LogoutRequest, HandleLogoutRequest);
|
|
_messageManager.RegisterHandler(MessageType.PlayerJoin, HandlePlayerJoin);
|
|
}
|
|
|
|
private void HandleLoginResponse(byte[] data, IPEndPoint sender)
|
|
{
|
|
var response = LoginResponse.Parser.ParseFrom(data);
|
|
_serverPoint = sender;
|
|
if (response.Result)
|
|
{
|
|
MasterManager.Instance.InitPlayersState(response);
|
|
}
|
|
else
|
|
{
|
|
_wrongWindow.SetActive(true);
|
|
Debug.LogError("UserId 已经存在");
|
|
}
|
|
}
|
|
|
|
private void HandlePlayerState(byte[] data, IPEndPoint sender)
|
|
{
|
|
var message = PlayerState.Parser.ParseFrom(data);
|
|
MasterManager.Instance.MovePlayer(message.PlayerId, message);
|
|
Debug.Log($"收到PlayerState::PlayerID={message.PlayerId},Position=" + message.Position.ToVector3().ToString());
|
|
}
|
|
|
|
private void HandleHeartbeatResponse(byte[] data, IPEndPoint sender)
|
|
{
|
|
var response = HeartbeatResponse.Parser.ParseFrom(data);
|
|
var player = MasterManager.Instance.GetCurrentPlayer();
|
|
if (player != null)
|
|
{
|
|
player.SyncTick(response.ServerTick);
|
|
}
|
|
}
|
|
|
|
private void HandleLogoutRequest(byte[] data, IPEndPoint sender)
|
|
{
|
|
var request = LogoutRequest.Parser.ParseFrom(data);
|
|
MasterManager.Instance.UnregisterPlayer(request.PlayerId);
|
|
}
|
|
|
|
private void HandlePlayerJoin(byte[] data, IPEndPoint sender)
|
|
{
|
|
var playerJoin = PlayerJoin.Parser.ParseFrom(data);
|
|
if (MasterManager.Instance.LocalPlayerId == playerJoin.PlayerId) return;
|
|
MasterManager.Instance.RegisterRemotePlayer(playerJoin.PlayerId, playerJoin.Position.ToVector3());
|
|
}
|
|
|
|
public void SendPlayerInput(string playerId, Vector3 input)
|
|
{
|
|
var message = new PlayerInput()
|
|
{
|
|
PlayerId = playerId,
|
|
Input = ProtoExtensions.ToProtoVector3(input)
|
|
};
|
|
_messageManager.SendMessage(message, MessageType.PlayerInput);
|
|
Debug.Log($"PlayerMoveSeq: {_sequence++}");
|
|
}
|
|
|
|
public void SendPlayerInput(PlayerInput message)
|
|
{
|
|
_messageManager.SendMessage(message, MessageType.PlayerInput);
|
|
Debug.Log($"PlayerMoveSeq: {_sequence++}");
|
|
}
|
|
|
|
public void SendLoginRequest(string playerId, int speed)
|
|
{
|
|
var request = new LoginRequest()
|
|
{
|
|
PlayerId = playerId,
|
|
Speed = speed
|
|
};
|
|
_messageManager.SendMessage(request, MessageType.LoginRequest);
|
|
Debug.Log($"Sent login request to player {playerId}");
|
|
}
|
|
|
|
public void SendLogoutRequest(string playerId)
|
|
{
|
|
var request = new LogoutRequest()
|
|
{
|
|
PlayerId = playerId
|
|
};
|
|
_messageManager.SendMessage(request, MessageType.LogoutRequest);
|
|
Debug.Log($"Sent logout request to player {playerId}");
|
|
}
|
|
}
|