zoukankan      html  css  js  c++  java
  • Unity 网络通信

    http://blog.csdn.net/chenggong2dm/article/details/7896440


      最新消息:在11月2日的开发者大会上,我问了一下unity的人,会不会对网络层进行封装和改进,unity的人表示,最晚5.0,最快4.x版本里,就会加入新的网络通信接口,他们已经在测试阶段了。 

        翻了半天unity的API,也没有发现可以处理Socket的方法。Unity自己封了个网络处理的类Network,主要用于状态同步。 似乎是要实现MMO级别的网络应用,只能用C#自己去写了。(Unity不像AS,有直接处理数据包、字节级别的底层函数。至少现在没有。如果您要应用于实际,比如做了个网游,那么您需要用unity自带的C#去写一套自定义通信协议来实现。这个我在后面的文章中会写一个示例。)

        我们还是先了解一下Unity,看看用Unity自带的组件,如何编写通信,从最简单的开始。


    1,新建项目。新建一个项目里面会有一个摄像机。

    2,编写服务器代码cs:

     

    [csharp] view plaincopy
     
    1. using UnityEngine;  
    2. using System.Collections;  
    3.   
    4. public class server : MonoBehaviour {  
    5.       
    6.     int Port = 10000;  
    7.       
    8.     //OnGUI方法,所有GUI的绘制都需要在这个方法中实现  
    9.     void OnGUI(){  
    10.         //Network.peerType是端类型的状态:  
    11.         //即disconnected, connecting, server 或 client四种  
    12.         switch(Network.peerType){  
    13.             //禁止客户端连接运行, 服务器未初始化  
    14.             case NetworkPeerType.Disconnected:  
    15.                 StartServer();  
    16.                 break;  
    17.             //运行于服务器端  
    18.             case NetworkPeerType.Server:  
    19.                 OnServer();  
    20.                 break;  
    21.             //运行于客户端  
    22.             case NetworkPeerType.Client:  
    23.                 break;  
    24.             //正在尝试连接到服务器  
    25.             case NetworkPeerType.Connecting:  
    26.                 break;  
    27.         }  
    28.     }  
    29.       
    30.     void StartServer(){  
    31.         //当用户点击按钮的时候为true  
    32.         if (GUILayout.Button("创建服务器")) {  
    33.             //初始化本机服务器端口,第一个参数就是本机接收多少连接  
    34.             NetworkConnectionError error = Network.InitializeServer(12,Port,false);  
    35.             Debug.Log("错误日志"+error);  
    36.         }  
    37.     }  
    38.       
    39.     void OnServer(){  
    40.         GUILayout.Label("服务端已经运行,等待客户端连接");  
    41.         //Network.connections是所有连接的玩家, 数组[]  
    42.         //取客户端连接数.   
    43.         int length = Network.connections.Length;  
    44.         //按数组下标输出每个客户端的IP,Port  
    45.         for (int i=0; i<length; i++)  
    46.         {  
    47.             GUILayout.Label("客户端"+i);  
    48.             GUILayout.Label("客户端ip"+Network.connections[i].ipAddress);  
    49.             GUILayout.Label("客户端端口"+Network.connections[i].port);  
    50.         }  
    51.         //当用户点击按钮的时候为true  
    52.         if (GUILayout.Button("断开服务器")){  
    53.             Network.Disconnect();  
    54.         }  
    55.     }  
    56.       
    57.       
    58.     /* 系统提供的方法,该方法只执行一次 */  
    59.     // Use this for initialization  
    60.     void Start () {  
    61.       
    62.     }  
    63.       
    64.     // Update is called once per frame  
    65.     void Update () {  
    66.       
    67.     }  
    68. }  

     

     

    3,把这个代码拖拽到摄像机上。

     

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

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

    6,这里可以再新建立个项目写客户端。嫌麻烦也可以像我这样,先把摄像机上的服务器脚本删掉,再把下面的客户端脚本拖拽上去。

    客户端代码如下:

     

    [csharp] view plaincopy
     
    1. using UnityEngine;  
    2. using System.Collections;  
    3.   
    4. public class client : MonoBehaviour {  
    5.     //要连接的服务器地址  
    6.     string IP = "127.0.0.1";  
    7.     //要连接的端口  
    8.     int Port = 10000;  
    9.           
    10.     void OnGUI(){  
    11.         //端类型的状态  
    12.         switch(Network.peerType){  
    13.             //禁止客户端连接运行, 服务器未初始化  
    14.             case NetworkPeerType.Disconnected:  
    15.                 StartConnect();  
    16.                 break;  
    17.             //运行于服务器端  
    18.             case NetworkPeerType.Server:  
    19.                 break;  
    20.             //运行于客户端  
    21.             case NetworkPeerType.Client:  
    22.                 break;  
    23.             //正在尝试连接到服务器  
    24.             case NetworkPeerType.Connecting:  
    25.                 break;  
    26.         }  
    27.     }  
    28.           
    29.           
    30.     void StartConnect(){  
    31.         if (GUILayout.Button("连接服务器")){  
    32.             NetworkConnectionError error = Network.Connect(IP,Port);  
    33.             Debug.Log("连接状态"+error);  
    34.         }  
    35.     }  
    36.           
    37.     // Use this for initialization  
    38.     void Start () {  
    39.       
    40.     }  
    41.       
    42.     // Update is called once per frame  
    43.     void Update () {  
    44.       
    45.     }  
    46. }  

     

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

    8,结果如下,可以通信。

     



    附注: 本文大部分代码出自《Unity 3D 游戏开发》,作者宣雨松。



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

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

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

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

    [csharp] view plaincopy
     
    1. using UnityEngine;  
    2. using System.Collections;  
    3.   
    4. public class server : MonoBehaviour {  
    5.       
    6.     int Port = 10100;  
    7.     string Message = "";  
    8.     //声明一个二维向量   
    9.     Vector2 Sc;   
    10.       
    11.     //OnGUI方法,所有GUI的绘制都需要在这个方法中实现  
    12.     void OnGUI(){  
    13.         //Network.peerType是端类型的状态:  
    14.         //即disconnected, connecting, server 或 client四种  
    15.         switch(Network.peerType){  
    16.             //禁止客户端连接运行, 服务器未初始化  
    17.             case NetworkPeerType.Disconnected:  
    18. 再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
  • 相关阅读:
    C# MQTT M2MQTT
    C# MethodInvoker委托的使用
    linux打包/解压-tar
    linux挂载查看、添加与取消
    IE6、火狐不支持a:visited
    js和jquery中的触发事件
    MySQL5.7.9免安装版配置方法
    mysql数据库在Navicat Premium连接的时候出现1862错误
    mysql max_allowed_packet查询和修改
    服务器是windows时tomcat无法打印所有日志配置修改
  • 原文地址:https://www.cnblogs.com/skiwnchiwns/p/10345244.html
Copyright © 2011-2022 走看看