unity3d高级网络连接NetworkServer及NetworkClient(HLA)

您所在的位置:网站首页 unity中服务器和客户端network unity3d高级网络连接NetworkServer及NetworkClient(HLA)

unity3d高级网络连接NetworkServer及NetworkClient(HLA)

2024-07-11 20:30| 来源: 网络整理| 查看: 265

注意:根据unity官方说明文档,例子中使用到的类可能在Unity后面的版本删除。

Unity网络提供高级API(HLA)来处理从低级实现中抽象的网络通信。在此示例中,我们将了解如何创建可与一个或多个客户端通信的服务器。HLA允许我们轻松地序列化类并通过网络发送此类的对象。我们用来序列化的类

这个类必须来自MessageBase,在这个例子中我们只会在这个类中发送一个字符串。

using System; using UnityEngine.Networking; public class MyNetworkMessage : MessageBase { public string message; }

创建服务器

我们创建一个服务器来监听端口9999,允许最多10个连接,并从我们的自定义类的网络中读取对象。

HLA将不同类型的消息与id相关联。 Unity Networking的MsgType类中定义了默认消息类型。例如,连接类型具有id 32,并且当客户端连接到服务器时在服务器中调用它,或者当它连接到服务器时在客户端中调用。您可以注册处理程序来管理不同类型的消息。当您发送自定义类(如我们的情况)时,我们定义一个处理程序,其新ID与我们通过网络发送的类相关联。

using UnityEngine; using System.Collections; using UnityEngine.Networking; public class Server : MonoBehaviour { int port = 9999; int maxConnections = 10; // The id we use to identify our messages and register the handler short messageID = 1000; // Use this for initialization void Start () { // Usually the server doesn't need to draw anything on the screen Application.runInBackground = true; CreateServer(); } void CreateServer() { // Register handlers for the types of messages we can receive RegisterHandlers (); var config = new ConnectionConfig (); // There are different types of channels you can use, check the official documentation config.AddChannel (QosType.ReliableFragmented); config.AddChannel (QosType.UnreliableFragmented); var ht = new HostTopology (config, maxConnections); if (!NetworkServer.Configure (ht)) { Debug.Log ("No server created, error on the configuration definition"); return; } else { // Start listening on the defined port if(NetworkServer.Listen (port)) Debug.Log ("Server created, listening on port: " + port); else Debug.Log ("No server created, could not listen to the port: " + port); } } void OnApplicationQuit() { NetworkServer.Shutdown (); } private void RegisterHandlers () { // Unity have different Messages types defined in MsgType NetworkServer.RegisterHandler (MsgType.Connect, OnClientConnected); NetworkServer.RegisterHandler (MsgType.Disconnect, OnClientDisconnected); // Our message use his own message type. NetworkServer.RegisterHandler (messageID, OnMessageReceived); } private void RegisterHandler(short t, NetworkMessageDelegate handler) { NetworkServer.RegisterHandler (t, handler); } void OnClientConnected(NetworkMessage netMessage) { // Do stuff when a client connects to this server // Send a thank you message to the client that just connected MyNetworkMessage messageContainer = new MyNetworkMessage(); messageContainer.message = "Thanks for joining!"; // This sends a message to a specific client, using the connectionId NetworkServer.SendToClient(netMessage.conn.connectionId,messageID,messageContainer); // Send a message to all the clients connected messageContainer = new MyNetworkMessage(); messageContainer.message = "A new player has conencted to the server"; // Broadcast a message a to everyone connected NetworkServer.SendToAll(messageID,messageContainer); } void OnClientDisconnected(NetworkMessage netMessage) { // Do stuff when a client dissconnects } void OnMessageReceived(NetworkMessage netMessage) { // You can send any object that inherence from MessageBase // The client and server can be on different projects, as long as the MyNetworkMessage or the class you are using have the same implementation on both projects // The first thing we do is deserialize the message to our custom type var objectMessage = netMessage.ReadMessage(); Debug.Log("Message received: " + objectMessage.message); } } 客户端

现在我们创建一个客户端

using System; using UnityEngine; using UnityEngine.Networking; public class Client : MonoBehaviour { int port = 9999; string ip = "localhost"; // The id we use to identify our messages and register the handler short messageID = 1000; // The network client NetworkClient client; public Client () { CreateClient(); } void CreateClient() { var config = new ConnectionConfig (); // Config the Channels we will use config.AddChannel (QosType.ReliableFragmented); config.AddChannel (QosType.UnreliableFragmented); // Create the client ant attach the configuration client = new NetworkClient (); client.Configure (config,1); // Register the handlers for the different network messages RegisterHandlers(); // Connect to the server client.Connect (ip, port); } // Register the handlers for the different message types void RegisterHandlers () { // Unity have different Messages types defined in MsgType client.RegisterHandler (messageID, OnMessageReceived); client.RegisterHandler(MsgType.Connect, OnConnected); client.RegisterHandler(MsgType.Disconnect, OnDisconnected); } void OnConnected(NetworkMessage message) { // Do stuff when connected to the server MyNetworkMessage messageContainer = new MyNetworkMessage(); messageContainer.message = "Hello server!"; // Say hi to the server when connected client.Send(messageID,messageContainer); } void OnDisconnected(NetworkMessage message) { // Do stuff when disconnected to the server } // Message received from the server void OnMessageReceived(NetworkMessage netMessage) { // You can send any object that inherence from MessageBase // The client and server can be on different projects, as long as the MyNetworkMessage or the class you are using have the same implementation on both projects // The first thing we do is deserialize the message to our custom type var objectMessage = netMessage.ReadMessage(); Debug.Log("Message received: " + objectMessage.message); } }

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3