Office及VBA技术交流

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1546|回复: 1

Unity客户端服务器端

[复制链接]
  • TA的每日心情
    开心
    2016-3-4 07:46
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    56

    主题

    124

    帖子

    736

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    736
    发表于 2016-10-21 19:46:36 | 显示全部楼层 |阅读模式
      本节unity教程我们使用Unity3d内置Network实现简单的客户端与服务端相连接新建一个场景,废话不说,贴上代码,先添加两个脚本分别为客户端Client和服务端Server,将这两个脚本添加到主摄像机:

    客户端Client代码:


    using UnityEngine;
    using System.Collections;

    public class Client : MonoBehaviour
    {
    private string remoteIP = "127.0.0.1";
    private int remotePort = 10000;
    private bool isExit = false;

    void OnGUI()
    {
    switch (Network.peerType)
    {
    case NetworkPeerType.Disconnected:
    if (GUI.Button(new Rect(Screen.width / 2 + 10, 10, 200, 40), "Connect to the server"))
    {
    NetworkConnectionError error = Network.Connect(remoteIP, remotePort, "UnityNetwork");
    Debug.Log(error);
    }
    break;
    case NetworkPeerType.Client:
    GUI.Label(new Rect(Screen.width / 2 + 10, 10, 200, 40), "Connection is successful");
    if (GUI.Button(new Rect(Screen.width / 2 + 10, 60, 200, 40), "Close the connections") || isExit)
    {
    Network.Disconnect(200);
    }
    break;
    case NetworkPeerType.Connecting:
    GUI.Label(new Rect(Screen.width / 2 + 10, 10, 200, 40), "Connecting......");
    break;
    default:
    break;
    }
    }

    void OnApplicationQuit()
    {
    isExit = true;
    }
    }

    服务器端Server代码:


    using UnityEngine;
    using System.Collections;

    public class Server : MonoBehaviour
    {
    private int connections = 15;
    private int listenPort = 10000;
    private bool useNAT = false;

    void OnGUI()
    {
    switch (Network.peerType)
    {
    case  NetworkPeerType.Disconnected:
    if (GUI.Button(new Rect(10, 10, 200, 40), "Create Server"))
    {
    Network.incomingPassword = "UnityNetwork";
    Network.InitializeServer(connections, listenPort, useNAT);
    }
    break;

    case NetworkPeerType.Server:
    GUILayout.Label("Server is created succesfully");
    int length = Network.connections.Length;
    GUILayout.Label("There are clients that connect to the server ");
    for (int i = 0; i < length; i++)
    {
    GUILayout.Label("The client IP is: " + Network.connections[i].ipAddress);
    GUILayout.Label("The client Port is " + Network.connections[i].port);
    }
    if (GUILayout.Button("Close the connections"))
    {
    Network.Disconnect(200);
    }
    break;

    default:
    break;
    }
    }
    }

    将游戏发布,然后打开游戏程序和Unity编辑器程序,测试。好了,本节unity教程到此结束!
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-3-4 07:46
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    56

    主题

    124

    帖子

    736

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    736
     楼主| 发表于 2016-10-21 21:29:28 | 显示全部楼层
    在网络有些当中服务端负责数据的处理,和逻辑运算。客户端仅仅是负责绘制服务端计算过后的图像下面想大家展示服务端和客户端的代码:



    /*
    * 简单的网络游戏代码
    *
    *  功能:  server端代码
    *  时间:  2012.12.31
    *  开发:  Nick Zhou
    *  
    *
    * 网络游戏中的所有的的逻辑运算和数据处理,全部是由服务器完成的,客户端只负责绘制
    * 在客户端中能看到自己和其他物体的变化
    *
    */


    using UnityEngine;
    using System.Collections;

    public class ServerGame : MonoBehaviour {

            private  int port=1000;  //端口号
            private string message = "";  //聊天的信息
            private string MoveInfo = ""; //移动的信息
             //滚动试图的位置
            Vector2 scrollPosition;


    // Use this for initialization
    //支持中文;
        void OnGUI()
        {
            //网络连接的状态
            switch (Network.peerType)
            {
                case NetworkPeerType.Disconnected:  //服务状态未开启
                     //开启服务状态
                    StartServer();
                    break;
                case  NetworkPeerType.Connecting:    //正在连接
                    break;
                case NetworkPeerType.Server:    //成功连接至服务端
                    OnServer();
                    break;
                case NetworkPeerType.Client:     //成功连接至客户端
                    break;
            }
        }

        //创建服务器
        void StartServer()
        {
            if (GUILayout.Button("创建本机服务器"))
            {
                //创建本机服务器,并允许最大10个客户端连接
                NetworkConnectionError error = Network.InitializeServer(10, port, false);
                //如果连接失败 将错误信息打印出来
                Debug.Log("连接状态:" + error);
            }
        }

        void OnServer()
        {
            GUILayout.Label("服务器创建完毕,等待客户端连接");
            int leng = Network.connections.Length;
            Debug.Log(leng);
            for (int i = 0; i <leng; i++)
            {
                GUILayout.Label("连接服务器客户端Id" + i);
                GUILayout.Label("连接服务器客户端Ip" + Network.connections[i].ipAddress);
                GUILayout.Label("连接服务器客户端端口号" + Network.connections[i].port);
            }
            //断开服务器
            if (GUILayout.Button("断开服务器"))
            {
                Network.Disconnect();
                //重置聊天信息
                message = "";
                MoveInfo = "";
            }
            //创建一个滚动试图,用来显示聊天信息
            scrollPosition = GUILayout.BeginScrollView(scrollPosition, GUILayout.Width(200), GUILayout.Height(Screen.height));
            GUILayout.Box(message);
            //显示玩家移动信息
            GUILayout.Box(MoveInfo);
            GUILayout.EndScrollView();
        }

        //接收消息
        [RPC]
        void RequestMessage(string Message,NetworkMessageInfo Info) {
            message += "\n" + "发送者" + Info.sender + ":" + message;
        }


        //接收模型移动的消息
        [RPC]
        void RequestMove(string message,NetworkMessageInfo Info)
        {
            MoveInfo += "\n" + "移动者" + Info.sender + ":执行了" + message+"移动事件";
        }
    }





    客户端代码:

    /*
    * 简单的网络游戏代码
    *
    *  功能:  client端代码
    *  时间:  2012.12.31
    *  开发:  Nick Zhou
    *  
    *
    * 网络游戏中的所有的的逻辑运算和数据处理,全部是由服务器完成的,客户端只负责绘制
    * 在客户端中能看到自己和其他物体的变化
    *
    */



    using UnityEngine;
    using System.Collections;

    public class ClientGame : MonoBehaviour {

        //服务器的Ip地址
        string Ip = "127.0.0.1";
         //端口
        int port = 1000;
         //输入的信息
        string inputMessage = "请输入信息";
         //接收到的信息
        string ReMessage = "";
         //滚动的试图位置
        Vector2 scrollpostion;
       
          //移动的速度
          float speed = 10.0f;
          //旋转的速度
          float rocationSpeed = 100.0f;
          //主角控制模型
          GameObject cubeContral = null;
          //对方控制模型
          GameObject cubeUnContral = null;


    // Use this for initialization
    //支持中文;
    void Start () {
            cubeContral = GameObject.Find("Cube0");
            cubeUnContral = GameObject.Find("Cube1");

    }

    // Update is called once per frame
    void Update () {

    }
        void FixedUpdate() {
            
            //如果是客户端
            if (Network.isClient)
            {
                float translation = Input.GetAxis("Vertical");
                float roation = Input.GetAxis("Herizontal ");
                if (translation==1)
                {
                    //使用RPC发送向前移动事件
                    networkView.RPC("RequestMove", RPCMode.All, "up");
                }
                if (translation==-1)
                {
                    //使用RPC发送向后移动事件
                    networkView.RPC("RequestMove", RPCMode.All, "down");

                }
                if (roation==1)
                {
                    //使用RPC发送向左旋转事件
                    networkView.RPC("RequestMove", RPCMode.All, "left");

                }
                if (roation==-1)
                {
                    networkView.RPC("RequestMove", RPCMode.All, "right");
                }
            }
        }

        void OnGUI()
        {
            switch (Network.peerType)
            {
                case NetworkPeerType.Client: //成功连接客户端
                    OnClient();
                    break;
                case NetworkPeerType.Connecting: //正在尝试连接
                    break;
                case NetworkPeerType.Disconnected: //服务器未开启
                    StartConnect();
                    break;
                case NetworkPeerType.Server: //成功连接服务端
                    break;
                default:
                    break;
            }
        }

        void StartConnect()
        {
            if (GUILayout.Button("加入游戏"))
            {
                //客户端开始尝试连接服务器
                NetworkConnectionError error = Network.Connect(Ip, port);
                //如果连接失败。将错误信息打印出来
                Debug.Log("连接状态:" + error);
            }
        }

        void OnClient() {
          //创建一个滚动视图,用来显示聊天信息
            scrollpostion = GUILayout.BeginScrollView(scrollpostion,GUILayout.Width(200),GUILayout.Height(500) );
            //显示聊天信息
            GUILayout.Box(ReMessage);
            //创建水平方向视图
            GUILayout.BeginHorizontal();
            inputMessage = GUILayout.TextArea(inputMessage); //编辑输入的内容
            //发送内容
            if (GUILayout.Button("发送消息"))
            {
                networkView.RPC("RequestMessage", RPCMode.All, inputMessage); //使用RPC发送的内容
            }
            //接收水平方向视图
            GUILayout.EndHorizontal();
            //断开连接
            if (GUILayout.Button("断开连接"))
            {
                Network.Disconnect(); //断开连接
                ReMessage = "";  //归零聊天信息
            }
            GUILayout.EndScrollView(); //结束滚动视图
        }

        //接收消息
        [RPC]
        void RequestMessage( string message,NetworkMessageInfo Info) {
           ReMessage+="\n"+"发送者 "+Info.sender+":"+message;
        }
        //接收模型移动消息
        [RPC]
        void RequestMove(string message,NetworkMessageInfo Info)
        {
            string sender = Info.sender.ToString();
            GameObject moveObject = null;
            //自己移动事件
            if (sender == "-1")
            {
                moveObject = cubeContral;
            }
            else
            {
                moveObject = cubeUnContral;
            }
            //根据消息判断事件类型
            int vertical = 0;
            int horizontal = 0;

            switch (message)
            {
                case  "up":
                    vertical = 1;
                    break;
                case "down":
                    vertical = -1;
                    break;
                case "left":
                    horizontal = 1;
                    break;
                case "right":
                    horizontal = -1;
                    break;
                default:
                    break;
            }

            //移动角色
            float translation = vertical * speed * Time.deltaTime;
            float rotation = horizontal * rocationSpeed * Time.deltaTime;
            moveObject.gameObject.transform.Translate(0, 0, translation);
            moveObject.gameObject.transform.Rotate(0, rotation, 0);
        }
    }
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    手机版|小黑屋|Office Master ( 蜀ICP备16003423号 )

    GMT+8, 2019-10-19 02:43 , Processed in 0.242627 second(s), 23 queries .

    Office Master

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