天天看点

[Unity3d] Network 聊天

 在上一个例子基础上,我们构建一个聊天室程序。

1,首先建立一个新项目,文件夹名为chat。

2,给接收请求的脚本所绑定的对象,添加网络视图组件(听起来有点绕口)。我们的服务器脚本是绑定在主摄像机上的,所以点击主摄像机,在菜单上选择component-->miscellaneous-->Net work View。

3,服务器端程序:(C# 脚本)

using UnityEngine;  

using System.Collections;  

public class server : MonoBehaviour {  

    int Port = 10100;  

    string Message = "";  

    //声明一个二维向量   

    Vector2 Sc;   

    //OnGUI方法,所有GUI的绘制都需要在这个方法中实现  

    void OnGUI(){  

        //Network.peerType是端类型的状态:  

        //即disconnected, connecting, server 或 client四种  

        switch(Network.peerType){  

            //禁止客户端连接运行, 服务器未初始化  

            case NetworkPeerType.Disconnected:  

                StartServer();  

                break;  

            //运行于服务器端  

            case NetworkPeerType.Server:  

                OnServer();  

            //运行于客户端  

            case NetworkPeerType.Client:  

            //正在尝试连接到服务器  

            case NetworkPeerType.Connecting:  

        }  

    }  

    void StartServer(){  

        //当用户点击按钮的时候为true  

        if (GUILayout.Button("创建服务器")) {  

            //初始化本机服务器端口,第一个参数就是本机接收多少连接  

            NetworkConnectionError error = Network.InitializeServer(12,Port,false);  

            //连接状态  

            switch(error){  

                case NetworkConnectionError.NoError:  

                    break;  

                default:  

                    Debug.Log("服务端错误"+error);  

            }  

    void OnServer(){  

        GUILayout.Label("服务端已经运行,等待客户端连接");  

        //Network.connections是所有连接的玩家, 数组[]  

        //取客户端连接数.   

        int length = Network.connections.Length;  

        //按数组下标输出每个客户端的IP,Port  

        for (int i=0; i<length; i++)  

        {  

            GUILayout.Label("客户端"+i);  

            GUILayout.Label("客户端ip"+Network.connections[i].ipAddress);  

            GUILayout.Label("客户端端口"+Network.connections[i].port);  

            GUILayout.Label("-------------------------------");  

        if (GUILayout.Button("断开服务器")){  

            Network.Disconnect();  

        //创建开始滚动视图  

        Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(280),GUILayout.Height(400));  

        //绘制纹理, 显示内容  

        GUILayout.Box(Message);  

        //结束滚动视图, 注意, 与开始滚动视图成对出现  

        GUILayout.EndScrollView();    

    //接收请求的方法. 注意要在上面添加[RPC]  

    [RPC]  

    void ReciveMessage(string msg, NetworkMessageInfo info){  

        //刚从网络接收的数据的相关信息,会被保存到NetworkMessageInfo这个结构中  

        Message = "发送端"+info.sender  +"消息"+msg;  

        //+"时间"+info.timestamp +"网络视图"+info.networkView  

    // Use this for initialization  

    void Start () {  

    // Update is called once per frame  

    void Update () {  

}  

4,把脚本拖拽到主摄像机上,绑定。

5,运行程序 File---->Build settings---->Build And Run,选择Web Player

6,服务器端建立完毕,保持服务器端的运行状态。

7,简单起见,我们这里不新建项目。先把摄像机上的服务器脚本删掉,再把下面的客户端脚本拖拽上去。

客户端代码:

public class client : MonoBehaviour {  

    //要连接的服务器地址  

    string IP = "127.0.0.1";  

    //要连接的端口  

    //聊天信息  

        //端类型的状态  

                StartConnect();  

                OnClient();  

    void StartConnect(){  

        if (GUILayout.Button("连接服务器")){  

            NetworkConnectionError error = Network.Connect(IP,Port);  

                    Debug.Log("客户端错误"+error);  

    void OnClient(){  

        //文本框  

        Message = GUILayout.TextArea(Message);  

        if (GUILayout.Button("发送")){  

            //发送给接收的函数, 模式为全部, 参数为信息  

            networkView.RPC("ReciveMessage", RPCMode.All, Message);  

        GUILayout.EndScrollView();  

服务端运行状态:

客户端运行状态:

本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366204,如需转载请自行联系原作者