Unity客户端服务器的基本问题

本文关键字:问题 客户端 服务器 Unity | 更新日期: 2023-09-27 17:59:21

我一直在尝试进行简单的网络连接,可以将消息从一个设备发送到另一个设备。我的第一个想法是"使用统一多人游戏功能需要付费吗?"所以我找到了这篇文章,它似乎很清楚,直接解释了我需要如何建立网络,以便代表我保持零成本。在进一步搜索后,我发现了这一点统一文档,它似乎解释了如何以与前一篇文章中描述的相同方式简单地进行网络连接,并避开了我想要的简单的低级别API消息发送。【重要提示:我在C#工作】

但我似乎在这段发现之旅中停了下来,因为我没有找到更多的文章或视频来指导我,也没有回答我仍然存在的关于这是如何运作的问题。

因此,今天我要问:

你知道还有什么其他的文章或视频可以指导我吗?

我是不是走错了方向?

你能回答我下面的任何一个关键问题吗?

  1. 在创建服务器时,即下面,我应该监听哪个端口,我应该担心"端口转发",这是我经常听到的一个短语。

    NetworkServer.Lister(4444);

  2. 创建客户端时,即下面,我应该使用什么i.p地址?我想这是客户端设备的,但我怎么知道它是什么?

    myClient.Connect("127.0.0.1",4444);

  3. 我如何让2台设备连接,我的想法是让任何设备默认成为客户端,然后以某种方式"检查服务器",如果没有,它会创建自己的服务器和本地客户端供客户端连接,这样就不会有多余的服务器?

非常感谢你阅读我的问题,我希望它看起来很清楚,请检查链接,这样你就会明白。我们非常感谢您的回答,以便我能够继续我的理解之旅。

Unity客户端服务器的基本问题

  1. 我应该听哪个端口,我应该担心端口吗"转发"这是我经常听到的一句话

这取决于你。你可以使用任何你想要的端口。正确的方法是为游戏选择大约10端口,然后选择1端口作为默认端口。例如,让我们从端口1000010010中进行选择。让我们将端口10000设为默认游戏端口。

如果您尝试使用NetworkServer.Listen(10000)连接到默认(10000),但有其他软件使用该端口或该端口不可用,则NetworkServer.Listen将返回false并引发以下异常:

无法打开ip{*}和端口{10000}上的套接字;请检查您的网络,很可能端口已经被占用

当这种情况发生时,你可以尝试下一个端口,另一个下一个和另一个,直到你达到你的最大游戏端口10010

此外,在游戏说明中,当玩家在连接其他玩家时遇到问题时,您可以指示他们打开端口1000010010

实现(阅读代码中的注释):

int minPort = 10000;
int maxPort = 10010;
int defaultPort = 10000;
//Creates a server then returns the port the server is created with. Returns -1 if server is not created
int createServer()
{
    int serverPort = -1;
    //Connect to default port
    bool serverCreated = NetworkServer.Listen(defaultPort);
    if (serverCreated)
    {
        serverPort = defaultPort;
        Debug.Log("Server Created with deafault port");
    }
    else
    {
        Debug.Log("Failed to create with the default port");
        //Try to create server with other port from min to max except the default port which we trid already
        for (int tempPort = minPort; tempPort <= maxPort; tempPort++)
        {
            //Skip the default port since we have already tried it
            if (tempPort != defaultPort)
            {
                //Exit loop if successfully create a server
                if (NetworkServer.Listen(tempPort))
                {
                    serverPort = tempPort;
                    break;
                }
                //If this is the max port and server is not still created, show, failed to create server error
                if (tempPort == maxPort)
                {
                    Debug.LogError("Failed to create server");
                }
            }
        }
    }
    return serverPort;
}

用法:

void Start()
{
    int serverPort = createServer();
    if (serverPort != -1)
    {
        Debug.Log("Server created on port : " + serverPort);
    }
    else
    {
        Debug.Log("Failed to create Server");
    }
}
  1. 创建客户端时,即下面,我应该使用什么i.p地址?我想是客户的设备,但我怎么知道它是什么是吗

在过去,你必须用UDP将你的IP广播到网络上。简而言之,您可以从计算机中获取IP地址,然后将其广播到255.255.255.255

您也可以广播到您的IP地址的修改版本。假设您的ip是192.168.1.13,您应该删除13(最后一个八位字节)并将其替换为255,然后将您的ip广播到192.168.1.255。我在这里详细解释了这一点。

理解什么是广播很重要,但Unity通过创建广播API NetworkDiscovery使其更简单。

要知道要连接到哪个IP地址,只需在Start()函数中调用服务器端的NetworkDiscovery.StartAsServer()即可。

在客户端,调用NetworkDiscovery.StartAsClient(),然后实现OnReceivedBroadcast(string fromAddress, string data);函数。当在ReceivedBroadcast上找到服务器时(字符串fromAddress,字符串数据);将被调用,然后您可以使用返回的fromAddress值连接到服务器。

这也应该回答你的第三个问题。此外,我很高兴你发现我的另一个答案很有用。

首先,不,您无需付费即可在Unity游戏中获得多人游戏功能(至少在一定程度上)。最终,如果你需要的话,你显然需要购买或租用一台服务器来托管游戏的服务器部分。

自从上次我制作多人游戏以来,Unity Networking API已经改进了很多,文档也是如此。

  • 我建议开始通读,并遵循以下内容:多人游戏教程
  • 此外,您还可以查看:Unity自己的网络游说示例这是一个多人大厅的工作示例,你可以看看。只需创建一个新的Unity项目并导入它即可开始

回答您的"关键问题":

  1. 您不必担心端口转发。Unity的网络API将在不需要您的玩家转发端口或任何此类东西的情况下工作
  2. 这也不是你应该担心的事情。Unity会处理好的,只要通读一下文件,你就会看到
  3. 再次阅读我提供的文档链接,它应该会变得清晰起来。在你的情况下,由于你想避免自己的额外成本,你可能会选择1名玩家成为"服务器",同时也是客户。我可以在这里详细介绍,但教程将提供比我所能提供的更好的解释

祝你的项目好运,我希望它对你成功。

  • AE