(对于新项目,应使用 5.1 版中引入的新网络系统。此信息适用于使用旧网络系统的旧版项目。)
可以从 Unity 网站下载所有各个网络服务器的源代码。这些服务器包括连接测试服务器、协调程序服务器、主服务器和代理服务器。
所有源代码包都包括 RakNet 3.732 网络库,该库用于处理基本的网络功能并提供网络服务器使用的插件。
这些代码包中包括可直接进行编译的三种不同类型的项目文件:
Xcode 和 Visual Studio 项目只需打开、编译和构建即可。要使用 Makefile 进行构建,只需运行“make”。此时应该可以使用 Linux 和 Mac OS X 上的标准编译设置,如果具有 _gcc_,应该能正常工作。在 Linux 上,可能需要安装 ncurses 库。
主服务器使用内部_数据库_结构来跟踪主机信息。
主机会发送具有 RUM_UPDATE_OR_ADD_ROW 消息标识符并嵌入了所有主机信息的消息。此过程是在 LightweightDatabaseServer.cpp 文件中的 OnReceive() 函数内处理的。此函数是所有消息最初出现的位置,因此如果要跟踪消息的处理方式,这是一个很好的起点。对于使用 MasterServer.RegisterHost 函数设置的每种_游戏类型_,将在数据库结构中创建一个表。所有游戏类型都将分组在一个表中,如果该表不存在,则会在 CreateDefaultTable() 函数中动态创建该表。
主机信息数据将由主服务器进行修改。正在注册的游戏的 IP 和端口(如主服务器所见)将注入到主机数据中。因此,在主机使用私有地址(NAT 地址)的情况下,我们可以确定检测到正确的外部 IP 和端口。游戏服务器发送的主机数据中的 IP 和端口是私有地址和端口,这些信息将存储起来供以后使用。如果主服务器检测到客户端正在请求某个游戏服务器的主机数据,并且该服务器具有_相同_的 IP 地址,则会使用服务器的私有地址而不是外部地址。这是为了应对客户端和服务器位于同一本地网络上的情况(使用具有 NAT 地址的相同路由器)。因此,它们将具有相同的外部地址,不能通过该路由器相互连接,它们需要使用私有地址,在这种情况下将正常工作。
客户端将发送包含 ID_DATABASE_QUERY_REQUEST 消息标识符以及客户端要查找的游戏类型的消息。此情况下将从数据库结构获取表或主机列表并将其发送到客户端。如果找不到主机列表,将发送空列表。
发送给主服务器的所有消息都必须包含 CheckVersion() 函数中检查的版本信息。目前,Unity 的每个版本都将在内部设置一个新的主服务器版本,并在此处进行检查。因此,如果主服务器通信例程将在任何时候发生变化,它将能够在此处检测旧版本并可能引用主服务器的另一个版本(如果需要)或修改该消息的处理以解决差异问题。
协调程序直接使用 RakNet 的 NAT 穿透插件,无需进行修改。协调程序本质上只是一个在加载了 NAT 穿透插件的端口上进行监听的对等端。当具有 NAT 地址的服务器和客户端都连接到此对等端时,它们将能够执行 NAT 穿透以相互连接。Network.InitializeServer 使用 NAT 时,将自动为您设置连接。