找回密码
 立即注册
楼主: 多米诺

[网络] Unity中实现网络连接的C#代码 network

[复制链接]
发表于 2012-6-15 12:35 | 显示全部楼层 |阅读模式
  1. using UnityEngine;
  2. using System.Collections;
  3. using System;

  4. public class NPBase : MonoBehaviour {

  5.     public string connectToIp = "127.0.0.1";
  6.     public int connectPort = 80;
  7.     public bool useNAT = false;
  8.     public string ipaddress = "";
  9.     public string port = "";

  10.     string playerName = "<NAME ME>";

  11.     void OnGUI()
  12.     {
  13.                 //Network.peerType:端类型的状态,即disconnected, connecting, server 或 client四种。
  14.         if(Network.peerType==NetworkPeerType.Disconnected)//Network类是网络实现的核心并提供核心函数。
  15.         {
  16.              if (GUILayout.Button("Connect"))
  17.             {
  18.                 if (playerName != "<NAME ME>")
  19.                 {
  20.                    PlayerPrefs.SetString("playerName", playerName);//PlayerPrefs在游戏会话中储存和访问玩家偏好设置。http://3d.ceeger.com/Script/PlayerPrefs/PlayerPrefs.html
  21.                     Network.useNat = useNAT;
  22.                     Network.Connect(connectToIp, connectPort);//连接到特定的主机(IP或域名)和服务器端口。
  23.                     
  24.                 }
  25.              }

  26.                 if (GUILayout.Button("Start Server"))
  27.                 {
  28.                     if (playerName != "<NAME ME>")
  29.                     {
  30.                                                 PlayerPrefs.SetString("playerName", playerName);
  31.                                                 Network.useNat = useNAT;//useNat设置NAT穿透功能。如果你想要这个服务器能够接受连接使用NAT穿透,使用facilitator,设置这个为true。
  32.                                                 
  33.                         Network.InitializeServer(2, connectPort);//初始化服务器。http://3d.ceeger.com/Script/Network/Network.InitializeServer.html
  34.                         foreach (GameObject go in FindObjectsOfType(typeof(GameObject)))//static function FindObjectsOfType (type : Type) : Object[] :查找Type物体,返回Type类型的所有激活的加载的物体列表,它将返回任何资源(网格,纹理,预设,...)或激活的物体。请注意这个函数是非常慢的。不推荐在每帧使用这个函数,大多数情况下你可以使用单例模式代替。
  35.                         {
  36.                             go.SendMessage("OnNetworkLoadedLevel", SendMessageOptions.DontRequireReceiver);//向同级发送消息。在这个游戏物体上的所有MonoBehaviour上调用名称为methodName的方法。接收消息的方法可以通过不要参数的方法来选择忽略参数。当选项被设置为SendMessageOptions.RequireReceiver时,如果消息没有被任何一个组件处理,则会打印一个错误。http://3d.ceeger.com/Script/GameObject/GameObject.SendMessage.html


  37.                         }
  38.                        
  39.                     }
  40.                 }
  41.                 playerName = GUILayout.TextField(playerName);
  42.                 connectToIp = GUILayout.TextField(connectToIp);
  43.                 connectPort = Convert.ToInt32(GUILayout.TextField(connectPort.ToString()));
  44.             
  45.         }
  46.       
  47.         else
  48.         {
  49.             if(Network.peerType==NetworkPeerType.Connecting)//NetworkPeerType:描述作为由Network.peerType返回的网络接口端类型的状态。http://3d.ceeger.com/Script/Enumerations/NetworkPeerType/NetworkPeerType.html
  50.             {
  51.                 GUILayout.Label("Connect Status:Connecting");
  52.             }
  53.             else if(Network.peerType==NetworkPeerType.Client)
  54.             {
  55.                 GUILayout.Label("Connection Status:Client!");
  56.                 GUILayout.Label("Ping to Server: "+Network.GetAveragePing(Network.connections[0]));//Network.GetAveragePing:到给定player的最后平均ping时间,以毫秒计。如果没有发现玩家,返回-1。Ping会每隔几秒自动发出。
  57.             }
  58.             else if(Network.peerType==NetworkPeerType.Server)
  59.             {
  60.                 GUILayout.Label("Connection Status:Server!");
  61.                 GUILayout.Label("Connections: "+Network.connections.Length);
  62.                 if(Network.connections.Length>=1)//Network.connections:所有连接的玩家,在客户端中,该变量只包含服务器。
  63.                 {
  64.                     GUILayout.Label("Ping to Server: "+Network.GetAveragePing(Network.connections[0]));
  65.                 }
  66.             }
  67.             if(GUILayout.Button("Disconnect"))
  68.             {
  69.                 Network.Disconnect(200);//关闭所有开放的连接并关闭网络接口,timeout参数表示网络接口在未收到信号的情况下,多长时间会断开。网络状态,如安全和密码,也会被重置。
  70.             }
  71.             ipaddress = Network.player.ipAddress;//这个玩家使用的IP地址。http://3d.ceeger.com/Script/NetworkPlayer/NetworkPlayer.html
  72.             port = Network.player.port.ToString();//这个玩家使用的端口。Network.player:获取本地NetworkPlayer实例
  73.             GUILayout.Label("IP Address: "+ipaddress+":" +port);
  74.         }
  75.     }

  76.     void OnConnectedToServer()//当你成功连接到服务器时,在客户端调用。
  77.     {
  78.         foreach(GameObject go in FindObjectsOfType(typeof(GameObject)))
  79.         {
  80.             go.SendMessage("OnNetworkLoadedLever",SendMessageOptions.DontRequireReceiver);
  81.         }
  82.     }
  83. }
复制代码
将以上代码附加到Main camera上即可实现。
[cz]有图有真相![/cz]{:soso__11824716995429377336_2:}
各种平台的测试,图片如下:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2012-12-4 13:36 | 显示全部楼层
very good sample
发表于 2012-12-15 08:50 | 显示全部楼层
正在进行网络游戏开发!
发表于 2012-12-15 09:34 | 显示全部楼层
新手学习 谢谢分享
发表于 2012-12-15 15:05 | 显示全部楼层
有图有真相
发表于 2012-12-21 17:27 | 显示全部楼层
求大图啊  看看  学习一下 谢谢
发表于 2017-3-13 20:07 | 显示全部楼层
好帖就是要顶
发表于 2017-3-13 20:08 | 显示全部楼层
难得一见的好帖
发表于 2017-3-13 19:17 | 显示全部楼层
说的非常好
发表于 2017-3-13 20:06 | 显示全部楼层
很好哦
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-22 01:57 , Processed in 0.340452 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表