网络客户端和服务器
许多多人游戏将能够使用NetworkManager
来管理连接,但可以直接使用较低级别的NetworkServer
和NetworkClient
类。
使用HLAPI时,每个游戏都必须有一台服务器来托管游戏。因此,多人游戏中的每个参与者可以同时成为客户端,专用服务器或服务器与客户端的组合。这种组合角色是没有专用服务器的多人游戏的常见情况。
对于没有专用服务器的多人游戏,运行游戏的玩家之一充当该游戏的“服务器”。特定玩家的游戏实例将运行“本地客户端”而不是普通的远程客户端。本地客户端使用与服务器相同的Unity场景和对象,并使用消息队列进行内部通信,而不是通过网络发送消息。但是,对于HLAPI代码和系统,本地客户端只是另一个客户端,因此无论客户端是本地还是远程,几乎所有的用户代码都是相同的。这使得使用相同的代码可以很容易地在多人游戏和独立模式下运行游戏。
多人游戏的一个常见模式是拥有一个管理游戏网络状态的对象。以下是NetworkManager
脚本的开始。该脚本将附加到游戏启动场景中的游戏对象。它具有简单的用户界面和键盘处理功能,可以让游戏在不同的网络模式下启动。对于真实的游戏,这可能是一个更具视觉吸引力的菜单,其中包括“开始单人游戏”和“开始多人游戏”等选项。
using UnityEngine;
using UnityEngine.Networking;
public class MyNetworkManager : MonoBehaviour {
public bool isAtStartup = true;
NetworkClient myClient;
void Update ()
{
if (isAtStartup)
{
if (Input.GetKeyDown(KeyCode.S))
{
SetupServer();
}
if (Input.GetKeyDown(KeyCode.C))
{
SetupClient();
}
if (Input.GetKeyDown(KeyCode.B))
{
SetupServer();
SetupLocalClient();
}
}
}
void OnGUI()
{
if (isAtStartup)
{
GUI.Label(new Rect(2, 10, 150, 100), "Press S for server");
GUI.Label(new Rect(2, 30, 150, 100), "Press B for both");
GUI.Label(new Rect(2, 50, 150, 100), "Press C for client");
}
}
}
这个代码框架调用设置函数来完成任务。以下是每个场景的简单设置功能。这些函数为每个场景创建一个服务器或适当类型的客户端。请注意,远程客户端假定服务器在同一台计算机上(127.0.0.1)。对于真正的游戏,这将是一个众所周知的互联网地址,或由Match Making系统提供的东西。
// Create a server and listen on a port
public void SetupServer()
{
NetworkServer.Listen(4444);
isAtStartup = false;
}
// Create a client and connect to the server port
public void SetupClient()
{
myClient = new NetworkClient();
myClient.RegisterHandler(MsgType.Connect, OnConnected);
myClient.Connect("127.0.0.1", 4444);
isAtStartup = false;
}
// Create a local client and connect to the local server
public void SetupLocalClient()
{
myClient = ClientScene.ConnectLocalServer();
myClient.RegisterHandler(MsgType.Connect, OnConnected);
isAtStartup = false;
}
此代码中的客户端为连接事件MsgType.Connect
注册了回调函数。这是客户端连接到服务器时调用的HLAPI内置消息。在这种情况下,客户端上处理程序的代码是:
// client function
public void OnConnected(NetworkMessage netMsg)
{
Debug.Log("Connected to server");
}
这足以让多人游戏应用程序启动并运行。现在可以使用NetworkClient.Send
和NetworkServer.SendToAll
发送网络消息,但发送消息是与系统交互的低级别方式。
?