unity3d网络开发(一)

2015年01月13日 10:03 0 点赞 0 评论 更新于 2025-11-21 14:12

今天,我们来简单探讨一下 Unity3D 网络开发。首先说点题外话,Unity3D 使用的网络库核心是基于 C++ 实现的商业网络游戏引擎库 RakNet。这意味着,对于移动设备而言,使用 Unity3D 编写服务器是完全可行的,而且其内置网络库的各项功能封装十分完善。

对于一款 ARPG 游戏,开发者可以轻松上手使用 Unity3D 编写服务器。在处理游戏对象或同步对象时,可以使用 RPC(Remote Procedure Call,远程过程调用),这为一般手游开发省去了不少麻烦。同时,Unity3D 的网络性能也不逊色于普通的 HTTP 传输协议。

Unity3D 内置网络核心及服务器初始化

Unity3D 中的内置网络核心主要通过 Network 函数实现。使用 Network 函数,我们既可以创建一个服务器,也可以建立到服务器的连接。

服务器初始化

使用 Network.InitializeServer(int maxConns, listenPort, bool useNat) 方法来初始化一个服务器。该方法中,maxConns 表示最大连接数,listenPort 是监听端口,useNat 是一个布尔值,用于指定是否使用 NAT(Network Address Translation,网络地址转换)。需要注意的是,这里仅指定了本地服务器的端口,并未指定 IP 地址。如果是在本机进行测试,可直接使用 127.0.0.1。当电脑联网时,Unity3D 会自动指定公网 IP 地址或 127.0.0.1 作为服务器的默认连接地址。

服务器初始化成功后,Network 的回调函数 void OnServerInitialized() 会被调用;若初始化失败,则会直接抛出错误信息。

连接服务器

使用 Network.Connect(ip, port) 方法可以简单地连接到一个已启动的服务端。如果连接成功,会回调 void OnConnectedToServer() 函数;若连接失败,则会回调 void OnFailedToConnect(NetworkConnectionError error) 函数,该函数封装了详细的错误信息。

Unity3D 网络开发的优势

游戏对象销毁处理

在网络游戏中,对游戏对象的销毁处理十分方便,这减轻了服务器的压力。例如,在一个多人在线网络中,若有即时游戏公告,希望在线玩家和当前不在线的玩家都能看到。使用 Unity3D 的内置功能作为服务器时,可以直接缓存公告,直到玩家上线后再展示给他们。

另外,当有玩家下线时,该玩家的游戏即时缓存就不再有用,还会占用服务器资源。我们可以在回调函数中直接销毁包含该下线玩家信息的相关对象,并通知服务器进行销毁操作,这充分体现了 RPC 的强大之处。

房间创建与主机迁移

在 ARPG 游戏中,创建房间通常是一件比较麻烦的事情。而在 Unity3D 内置网络库中,我们可以直接迁移主机信息,甚至可以暂时将服务器交由客户端托管。此外,网络数据同步回调功能也非常实用,特别是对于 NetworkView 组件。因此,使用 Unity3D 编写服务器是一个不错的选择。

简单的服务器创建与客户端连接实例

以下是一个简单的服务器创建与客户端连接的示例代码:

public void StartSvr () {
if (Network.peerType == NetworkPeerType.Disconnected) {
print("start init & start svr.");
Network.InitializeServer(32, port, false);
}
}

public void StartUsr () {
print("svr running noramlize.");
Network.Connect("192.168.6.185", port);
}

// 服务器回调函数
void OnServerInitialized() {
print("Server initialized and ready.");
}

void OnPlayerDisconnected(NetworkPlayer player) {
Debug.Log("Clean up after player " + player);
Network.RemoveRPCs(player);
Network.DestroyPlayerObjects(player);
}

private int playerCount = 0;
void OnPlayerConnected(NetworkPlayer player) {
Debug.Log("Player " + playerCount++ + " connected from " + player.ipAddress + ":" + player.port);
}

// 客户端回调函数
void OnConnectedToServer() {
Debug.Log("Connected to server");
}

void OnDisconnectedFromServer(NetworkDisconnection info) {
if (Network.isServer)
Debug.Log("Local server connection disconnected");
else
if (info == NetworkDisconnection.LostConnection)
Debug.Log("Lost connection to the server");
else
Debug.Log("Successfully diconnected from the server");
}

void OnFailedToConnect(NetworkConnectionError error) {
Debug.Log("Could not connect to server: " + error);
}

上述代码中,StartSvr 方法用于启动服务器,StartUsr 方法用于启动客户端连接。同时,还包含了服务器和客户端的各种回调函数,用于处理服务器初始化、玩家连接、断开连接以及连接失败等情况。