2016-07-30 53 views
0

我一直在试图做简单的网络,我可以从一个设备发送消息到另一个设备。我的第一个想法是'我需要支付使用统一多人游戏功能吗?'所以我发现这article这似乎很清楚,直接解释了我将如何需要做网络,以保持我的代价为零。在进一步搜索后,我发现this位统一文档似乎解释了如何以前面的文章中描述的相同方式进行网络连接,并避免了我期望的简单的低级API消息发送。 [重要注意事项:我在C#中工作]Unity客户端 - 服务器基本问题

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

因此,今天我要问:

A - 你知道任何进一步的文章或视频,将指导我通过这个的?

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

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

  1. 当创建一个服务器,即下面,我应该听什么端口,我要担心的“端口转发”,这是一个短语我经常看到卡住的。

    NetworkServer.Listen(4444);

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

    myClient.Connect(“127.0.0.1”,4444);

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

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

回答

0
  1. 我应该听什么端口,我应该担心的港口 转发“,这是一个短语我经常看到卡住的。

这是给你的。你可以使用任何你想要的端口。正确的做法是为您的游戏选择约10端口,然后选择1端口作为默认端口。例如,我们从端口1000010010中选择。让我们将端口10000作为您的默认游戏端口。

如果你试图连接到默认的(10000)与NetworkServer.Listen(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"); 
    } 
} 
  • 当创建客户端,即,低于,哪个IP地址我应该使用吗?我认为这是客户的设备,但我怎么知道它是什么 是?
  • 在过去,您必须使用UDP将您的IP广播到网络。简而言之,您可以从您的计算机上获得您的IP地址,然后将其广播到255.255.255.255

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

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

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

    在您的客户端,请致电NetworkDiscovery.StartAsClient(),然后执行OnReceivedBroadcast(string fromAddress, string data);函数。当找到服务器OnReceivedBroadcast(string fromAddress,string data);将被调用,然后您可以使用返回的fromAddress值连接到您的服务器。

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

    +0

    感谢这听起来非常好,我知道写回答需要花费很多时间和精力,我希望这可以用作那些希望按照以前回答的问题所建议的未来服务器客户端联网方法的人员的参考。我目前正在实现你的代码,我会尽快回复你,看看它是否完美。 –

    +0

    我已经添加了我正在使用的代码来测试植入到目前不工作的问题(以我设置的方式,很可能)。 @Programmer –

    +0

    @g_l这个问题实际上并不涉及代码。这是关于如何做的东西,我认为我提供了足够的信息让你开始。你可以问一个关于你的代码不工作的**新**问题。然后我会尝试修复你的代码。编辑问题会更长。把这些代码放在一个新的问题中。 – Programmer

    0

    首先,你不需要支付在Unity游戏中获得多人游戏功能(至少达到某个特定点)。最终你显然需要购买或租用服务器来托管游戏的服务器部分,如果你需要的话。

    自从上次我制作了多人游戏并且具有文档后,Unity Networking API得到了很大改进。

    要回答你的“关键问题”:

    1. 你不应该担心端口转发。 Unity的网络API不需要你的玩家转发端口或任何类似的东西。
    2. 这也不是你应该担心的事情。 Unity会照顾到这一点,只需阅读文档,你就会看到。
    3. 再次阅读我提供的文档链接,它应该变得清晰。在你的情况下,因为你想避免给自己额外的成本,你可能会选择一个玩家成为“服务器”,同时也是一个客户端。我可以在这里进入,但教程将提供比我能给出的更好的解释。

    祝您的项目好运,我希望它能为您效劳。

    • AE
    +0

    非常感谢您的回复,但已阅读第一篇文章,我已经链接了我犹豫不决,因为它明确表示“您可以使用Unity HLAPI而无需付费,只是不要使用Unity match API,那么您赢了不需要支付任何费用。“和“你不应该使用NetworkManager,因为它的大部分功能都依赖于Unity match API。” 要创建一个没有Unity match API的网络游戏,你只需要NetworkServer和NetworkClient类。你能否说服我使用统一API是值得的? –

    +0

    另一个我喜欢的网络服务器和类的特点是它如何发送简单的消息,我觉得它与我的游戏更兼容,我会认为统一API包括,但你可以证实它@AE –