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

时间:2016-07-30 11:03:46

标签: c# unity3d client-server

我一直在努力做一个简单的网络,我可以将消息从一个设备发送到另一个设备。我的第一个想法是“我需要付钱才能使用统一的多人游戏功能吗?”所以我发现这个article似乎很清楚并且直接解释了我需要如何进行联网才能保持代表我的零成本。在进一步搜索之后,我发现了this位统一文档,它似乎解释了如何以前一篇文章中描述的相同方式进行网络连接,并避开了我想要的简单的低级API消息发送。 [重要说明:我在C#工作]

但是我似乎已经停止了这次探索之旅,因为我没有发现任何其他文章或视频来指导我并回答我的问题,我仍然知道这是如何运作的。

因此今天我在问:

A - 您是否知道有任何其他文章或视频可以指导我完成这项工作?

B - 我完全走错了方向吗?

C - 你能回答我的任何关键问题吗?

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

    NetworkServer.Listen(4444);

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

    myClient.Connect(“127.0.0.1”,4444);

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

  4. 非常感谢您阅读我的问题,我希望看起来很清楚,请检查链接,以便这对您有意义。非常感谢任何答案,以便我可以继续我的理解之旅。

2 个答案:

答案 0 :(得分:0)

首先,你不必为了在Unity游戏中获得多人游戏功能而付费(至少达到某一点)。最终,如果您需要,您将需要购买或租用服务器来托管游戏的服务器部分。

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

回答"关键问题":

  1. 您不必担心端口转发。 Unity的网络API无需转发端口或任何此类内容即可使用。
  2. 这也不是你应该担心的事情。 Unity将负责这一点,只需阅读文档,您就会看到。
  3. 再次阅读我提供的文档链接,它应该变得清晰。在你的情况下,因为你想避免额外的成本,你可能会选择1名玩家成为"服务器"同时也是一个客户。我可以在这里进入,但是教程将提供比我能给出的更好的解释。
  4. 祝你的项目好运,我希望它能帮到你。

    • AE

答案 1 :(得分:0)

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

这取决于你。您可以使用任何所需的端口。正确的方法是为您的游戏选择约10个端口,然后选择1端口作为默认端口。例如,让我们从端口10000选择10010。让我们将端口10000设为您的默认游戏端口。

如果您尝试使用10000连接到默认值(NetworkServer.Listen(10000)),但是有另一个使用该端口的软件或端口无法使用,NetworkServer.Listen将返回{ {1}}并抛出以下异常:

  

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

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

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

实施(阅读代码中的评论):

10010

用法:

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;
}
  
      
  1. 在创建客户端时,即下面,我应该使用哪个i.p地址?我认为这是客户端的设备,但我怎么知道它是什么   是?
  2.   

在过去,您必须使用UDP将IP广播到网络。为简短起见,您可以从计算机获取IP地址,然后将其广播到void Start() { int serverPort = createServer(); if (serverPort != -1) { Debug.Log("Server created on port : " + serverPort); } else { Debug.Log("Failed to create Server"); } }

您还可以广播到您的IP地址的修改版本。假设您的IP是255.255.255.255,您应该删除13(最后一个八位字节)并将其替换为255然后将您的IP广播到192.168.1.13。我更多地解释了here

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

要知道要连接的IP地址,只需在192.168.1.255功能中呼叫服务器端的NetworkDiscovery.StartAsServer()

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

这也应该回答你的#3问题。另外,我很高兴您发现我的other答案很有用。