feat 客户端
This commit is contained in:
64
Client/Point/Assets/Scripts/Manager/PlayerManager.cs
Normal file
64
Client/Point/Assets/Scripts/Manager/PlayerManager.cs
Normal file
@@ -0,0 +1,64 @@
|
||||
using System.Collections.Generic;
|
||||
using Google.Protobuf;
|
||||
using UnityEngine;
|
||||
|
||||
public class PlayerManager : MonoBehaviour
|
||||
{
|
||||
public GameObject playerPrefab;
|
||||
public Transform playerScene;
|
||||
|
||||
private Dictionary<int, PlayerMove> _players = new();
|
||||
|
||||
public static PlayerManager Instance { get; private set; }
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (Instance != null)
|
||||
{
|
||||
Destroy(gameObject);
|
||||
return;
|
||||
}
|
||||
|
||||
Instance = this;
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
SocketMessageManager.Instance.Subscribe(MessageID.EnterInstance, OnEnterInstance);
|
||||
SocketMessageManager.Instance.Subscribe(MessageID.Position, OnPosition);
|
||||
SocketManager.Instance.Connect();
|
||||
}
|
||||
|
||||
private GameObject AddPlayer(PositionInfo info)
|
||||
{
|
||||
var player = Instantiate(playerPrefab, playerScene);
|
||||
player.GetComponent<PlayerInfo>().uid = info.UID;
|
||||
var move = player.GetComponent<PlayerMove>();
|
||||
move.SetPosition(info.X, info.Y);
|
||||
_players.Add(info.UID, move);
|
||||
return player;
|
||||
}
|
||||
|
||||
private void OnEnterInstance(ByteString msg)
|
||||
{
|
||||
var enterInstance = S2C_EnterInstance.Parser.ParseFrom(msg);
|
||||
var player = AddPlayer(enterInstance.Info);
|
||||
player.AddComponent<PlayerControl>();
|
||||
}
|
||||
|
||||
private void OnPosition(ByteString msg)
|
||||
{
|
||||
var position = S2C_Position.Parser.ParseFrom(msg);
|
||||
foreach (var info in position.Info)
|
||||
{
|
||||
if (!_players.ContainsKey(info.UID))
|
||||
{
|
||||
AddPlayer(info);
|
||||
}
|
||||
else
|
||||
{
|
||||
_players[info.UID].SetPosition(info.X, info.Y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5228fd1670b3455a9900c17b9c1899e6
|
||||
timeCreated: 1765791557
|
||||
70
Client/Point/Assets/Scripts/Manager/SocketManager.cs
Normal file
70
Client/Point/Assets/Scripts/Manager/SocketManager.cs
Normal file
@@ -0,0 +1,70 @@
|
||||
using Google.Protobuf;
|
||||
using NativeWebSocket;
|
||||
using UnityEngine;
|
||||
|
||||
public class SocketManager : MonoBehaviour
|
||||
{
|
||||
private WebSocket _ws;
|
||||
|
||||
public static SocketManager Instance { get; private set; }
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (Instance != null)
|
||||
{
|
||||
Destroy(gameObject);
|
||||
return;
|
||||
}
|
||||
|
||||
Instance = this;
|
||||
}
|
||||
|
||||
public async void Connect()
|
||||
{
|
||||
_ws = new WebSocket($"wss://www.hlsq.asia/ws/?token={Random.Range(1, 1000)}");
|
||||
|
||||
_ws.OnOpen += () =>
|
||||
{
|
||||
Debug.Log("Connection open!");
|
||||
SendMessage(MessageID.EnterInstance, new C2S_EnterInstance
|
||||
{
|
||||
InstanceID = 1
|
||||
});
|
||||
};
|
||||
|
||||
_ws.OnError += (e) => { Debug.Log("Error! " + e); };
|
||||
|
||||
_ws.OnClose += (e) => { Debug.Log("Connection closed!"); };
|
||||
|
||||
_ws.OnMessage += (bytes) =>
|
||||
{
|
||||
var message = Message.Parser.ParseFrom(bytes);
|
||||
Debug.Log("OnMessage: " + message.ID);
|
||||
SocketMessageManager.Instance.TriggerEvent(message.ID, message.Payload);
|
||||
};
|
||||
|
||||
await _ws.Connect();
|
||||
}
|
||||
|
||||
public void SendMessage(MessageID id, IMessage msg)
|
||||
{
|
||||
var m = new Message
|
||||
{
|
||||
ID = id,
|
||||
Payload = ByteString.CopyFrom(msg.ToByteArray())
|
||||
};
|
||||
_ws.Send(m.ToByteArray());
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
#if !UNITY_WEBGL || UNITY_EDITOR
|
||||
_ws?.DispatchMessageQueue();
|
||||
#endif
|
||||
}
|
||||
|
||||
private async void OnApplicationQuit()
|
||||
{
|
||||
await _ws.Close();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d6b127b9486a4f07acfbdcc29fc7d2a5
|
||||
timeCreated: 1765791343
|
||||
55
Client/Point/Assets/Scripts/Manager/SocketMessageManager.cs
Normal file
55
Client/Point/Assets/Scripts/Manager/SocketMessageManager.cs
Normal file
@@ -0,0 +1,55 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Google.Protobuf;
|
||||
using UnityEngine;
|
||||
|
||||
public class SocketMessageManager : MonoBehaviour
|
||||
{
|
||||
// 使用字典存储
|
||||
private Dictionary<MessageID, Action<ByteString>> _eventDictionary;
|
||||
|
||||
public static SocketMessageManager Instance { get; private set; }
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (Instance != null)
|
||||
{
|
||||
Destroy(gameObject);
|
||||
return;
|
||||
}
|
||||
|
||||
Instance = this;
|
||||
_eventDictionary = new Dictionary<MessageID, Action<ByteString>>();
|
||||
}
|
||||
|
||||
// 订阅事件
|
||||
public void Subscribe(MessageID messageID, Action<ByteString> listener)
|
||||
{
|
||||
if (_eventDictionary.ContainsKey(messageID))
|
||||
{
|
||||
_eventDictionary[messageID] += listener;
|
||||
}
|
||||
else
|
||||
{
|
||||
_eventDictionary[messageID] = listener;
|
||||
}
|
||||
}
|
||||
|
||||
// 取消订阅
|
||||
public void Unsubscribe(MessageID messageID, Action<ByteString> listener)
|
||||
{
|
||||
if (_eventDictionary.ContainsKey(messageID))
|
||||
{
|
||||
_eventDictionary[messageID] -= listener;
|
||||
}
|
||||
}
|
||||
|
||||
// 触发事件
|
||||
public void TriggerEvent(MessageID messageID, ByteString data = null)
|
||||
{
|
||||
if (_eventDictionary.ContainsKey(messageID))
|
||||
{
|
||||
_eventDictionary[messageID]?.Invoke(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: afc9630f7f1a49b5b0e8b13bffa9b4ea
|
||||
timeCreated: 1765791087
|
||||
Reference in New Issue
Block a user