多米诺 发表于 2012-6-15 12:35

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

using UnityEngine;
using System.Collections;
using System;

public class NPBase : MonoBehaviour {

    public string connectToIp = "127.0.0.1";
    public int connectPort = 80;
    public bool useNAT = false;
    public string ipaddress = "";
    public string port = "";

    string playerName = "<NAME ME>";

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

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


                        }
                     
                  }
                }
                playerName = GUILayout.TextField(playerName);
                connectToIp = GUILayout.TextField(connectToIp);
                connectPort = Convert.ToInt32(GUILayout.TextField(connectPort.ToString()));
            
      }
      
      else
      {
            if(Network.peerType==NetworkPeerType.Connecting)//NetworkPeerType:描述作为由Network.peerType返回的网络接口端类型的状态。http://3d.ceeger.com/Script/Enumerations/NetworkPeerType/NetworkPeerType.html
            {
                GUILayout.Label("Connect Status:Connecting");
            }
            else if(Network.peerType==NetworkPeerType.Client)
            {
                GUILayout.Label("Connection Status:Client!");
                GUILayout.Label("Ping to Server: "+Network.GetAveragePing(Network.connections));//Network.GetAveragePing:到给定player的最后平均ping时间,以毫秒计。如果没有发现玩家,返回-1。Ping会每隔几秒自动发出。
            }
            else if(Network.peerType==NetworkPeerType.Server)
            {
                GUILayout.Label("Connection Status:Server!");
                GUILayout.Label("Connections: "+Network.connections.Length);
                if(Network.connections.Length>=1)//Network.connections:所有连接的玩家,在客户端中,该变量只包含服务器。
                {
                  GUILayout.Label("Ping to Server: "+Network.GetAveragePing(Network.connections));
                }
            }
            if(GUILayout.Button("Disconnect"))
            {
                Network.Disconnect(200);//关闭所有开放的连接并关闭网络接口,timeout参数表示网络接口在未收到信号的情况下,多长时间会断开。网络状态,如安全和密码,也会被重置。
            }
            ipaddress = Network.player.ipAddress;//这个玩家使用的IP地址。http://3d.ceeger.com/Script/NetworkPlayer/NetworkPlayer.html
            port = Network.player.port.ToString();//这个玩家使用的端口。Network.player:获取本地NetworkPlayer实例
            GUILayout.Label("IP Address: "+ipaddress+":" +port);
      }
    }

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




mic6033 发表于 2012-12-4 13:36

very good sample

Einhero 发表于 2012-12-15 08:50

正在进行网络游戏开发!

jason 发表于 2012-12-15 09:34

新手学习 谢谢分享

jstones 发表于 2012-12-15 15:05

有图有真相

飞鸽 发表于 2012-12-21 17:27

求大图啊看看学习一下 谢谢

xconer 发表于 2017-3-13 20:07

好帖就是要顶

amykaniya 发表于 2017-3-13 20:08

难得一见的好帖

linghuzijian 发表于 2017-3-13 19:17

说的非常好

zzjxb 发表于 2017-3-13 20:06

很好哦
页: [1]
查看完整版本: Unity中实现网络连接的C#代码 network