查看: 1747|回复: 1
打印 上一主题 下一主题

U3d中实现网络连接的C#代码_教程

[复制链接]

2508

主题

2

听众

3万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
32806
精华
12

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2012-6-29 14:25:27 |只看该作者 |倒序浏览



    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,设置这个为***e。

     
                                                   

     
                            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("ing to Server: "+Network.GetAveragePing(Network.connections[0]));//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("ing to Server: "+Network.GetAveragePing(Network.connections[0]));

     
                    }

     
                }

     
                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上即可实现。
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

2317

主题

54

听众

2万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
20645
精华
62

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2012-12-30 04:16:19 |只看该作者
学习了,虽然还是有难度,谢谢楼主的用心
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-7-19 05:45 , Processed in 0.064006 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部