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:
- using UnityEngine;
- using System.Collections;
- public class server : MonoBehaviour {
- int Port = 10000;
- //OnGUI方法,所有GUI的绘制都需要在这个方法中实现
- void OnGUI(){
- //Network.peerType是端类型的状态:
- //即disconnected, connecting, server 或 client四种
- switch(Network.peerType){
- //禁止客户端连接运行, 服务器未初始化
- case NetworkPeerType.Disconnected:
- StartServer();
- break;
- //运行于服务器端
- case NetworkPeerType.Server:
- OnServer();
- break;
- //运行于客户端
- case NetworkPeerType.Client:
- break;
- //正在尝试连接到服务器
- case NetworkPeerType.Connecting:
- break;
- }
- }
- void StartServer(){
- //当用户点击按钮的时候为true
- if (GUILayout.Button("创建服务器")) {
- //初始化本机服务器端口,第一个参数就是本机接收多少连接
- NetworkConnectionError error = Network.InitializeServer(12,Port,false);
- 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);
- }
- //当用户点击按钮的时候为true
- if (GUILayout.Button("断开服务器")){
- Network.Disconnect();
- }
- }
- /* 系统提供的方法,该方法只执行一次 */
- // Use this for initialization
- void Start () {
- }
- // Update is called once per frame
- void Update () {
- }
- }
3,把这个代码拖拽到摄像机上。
4,运行程序 File---->Build settings---->Build And Run,选择Web Player
5,服务器端建立完毕,保持服务器端的运行状态。
6,这里可以再新建立个项目写客户端。嫌麻烦也可以像我这样,先把摄像机上的服务器脚本删掉,再把下面的客户端脚本拖拽上去。
客户端代码如下:
- using UnityEngine;
- using System.Collections;
- public class client : MonoBehaviour {
- //要连接的服务器地址
- string IP = "127.0.0.1";
- //要连接的端口
- int Port = 10000;
- void OnGUI(){
- //端类型的状态
- switch(Network.peerType){
- //禁止客户端连接运行, 服务器未初始化
- case NetworkPeerType.Disconnected:
- StartConnect();
- break;
- //运行于服务器端
- case NetworkPeerType.Server:
- break;
- //运行于客户端
- case NetworkPeerType.Client:
- break;
- //正在尝试连接到服务器
- case NetworkPeerType.Connecting:
- break;
- }
- }
- void StartConnect(){
- if (GUILayout.Button("连接服务器")){
- NetworkConnectionError error = Network.Connect(IP,Port);
- Debug.Log("连接状态"+error);
- }
- }
- // Use this for initialization
- void Start () {
- }
- // Update is called once per frame
- void Update () {
- }
- }
7,运行程序 File---->Build settings---->Build And Run,选择Web Player
8,结果如下,可以通信。
附注: 本文大部分代码出自《Unity 3D 游戏开发》,作者宣雨松。
在上一个例子基础上,我们构建一个聊天室程序。
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:
- 再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow