今天简单来说下unity3d网络开发(一),首先个人说说题外话,Unity3d使用的网络库核心是用C++实现的一款商业网络游戏引擎库,

RakNet。所以对于移动设备来 说,用Unity3d来写服务器是完全可以的,并且内建网络库的各项功能封装完善。

对于一款ARGP都可以轻松的上手来写 服务器,游戏对象的处理或者同步对象使用RPC,

对于一般的手游来说省了不少的麻烦事。

其网络性能也不亚于普通的HTTP传输协议

Unity3d中的内建网络核心是使用Network函数,使用Network可以创建一个服务器,

也可以建立一个到服务器的连接, 使用Network.InitalizeServer(int maxConns, listenPort, boo useNat)来初始化一个服务器,

这里只是指定了本地服务器 的端口,并没有指定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的内建功能当服务器时,可以直接缓存公告

直到玩家上线,然后给玩家展示。

还有比如,有玩家下线。对于当前玩家的游戏即时缓存已经没有了作用,并且会占用服务器的资源。

你可以在回调函数里直接销毁任何玩家有当前下线玩家信息的玩家。然后通知服务器自己来销毁。

这也是RPC的强大之处。

还有ARPG游戏中创建房间是一件比较麻烦头痛的事情,而在Unity3d内建网络库里,你可以直接迁移主机信息,

可以暂时将服务器由客户端来托管。还有网络数据同步回调,特别对NetworkView,可以说用Unity3d来写服务器

是一个很不错的选择。相信Unity3d,他不是一个免费软件。

自动写了一个简单的服务器创建与客户端连接的实例:


  1. public void StartSvr () {
  2.     if (Network.peerType == NetworkPeerType.Disconnected) {
  3.       print("start init & start svr.");

  4.       Network.InitializeServer(32, port, false);
  5.     }
  6.   }

  7.   public void StartUsr () {
  8. // if (Network.peerType == NetworkPeerType.Connecting) {
  9.     print("svr running noramlize.");
  10.     Network.Connect("192.168.6.185", port);
  11. // }
  12.   }



  13.   // callback state for svr
  14.   void OnServerInitialized() {
  15.     print("Server initialized and ready.");
  16.   }

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

  22.   private int playerCount = 0;
  23.   void OnPlayerConnected(NetworkPlayer player) {
  24.     Debug.Log("Player " + playerCount++ + " connected from " + player.ipAddress + ":" + player.port);
  25.   }
  26.   // callback svr end


  27.   // callback state for usr
  28.   void OnConnectedToServer() {
  29.     Debug.Log("Connected to server");
  30.   }

  31.   void OnDisconnectedFromServer(NetworkDisconnection info) {
  32.     if (Network.isServer)
  33.       Debug.Log("Local server connection disconnected");
  34.     else
  35.       if (info == NetworkDisconnection.LostConnection)
  36.         Debug.Log("Lost connection to the server");
  37.     else
  38.       Debug.Log("Successfully diconnected from the server");
  39.   }

  40.   void OnFailedToConnect(NetworkConnectionError error) {
  41.     Debug.Log("Could not connect to server: " + error);
  42.   }
  43.   // callback usr end