前言

Unity 是一款功能非常强大的游戏开发引擎,相信有很多小伙伴使用过。用它来开发单机小游戏,简直不要太爽。可是如果开发网络游戏的话,可能难度就比较大了,Unity有自带的Unet组件可以使用,其使用体验还算过得去。但是因为其灵活度不高,并且传输数据较多,容易占用更多带宽,从而导致游戏网络延迟较高。所以很多人选择用更底层的Socket,普通Socket如果使用得好话,必然爽的歪歪,但是最严重的就是粘包问题难以解决,而且尤其是对于网络编程不太熟悉的同学,要先学习Socket的基础,这无疑是给摇摇欲坠的孩子雪上加霜,不,加砒霜。所以小编这次带来了一款小小程序集,或许可以解决您眼前这一窘迫。

程序集功能

首先在开始之前,让我来给各位看瓜大爷简单说说程序集能实现的功能,如果对功能不满意,或者功能不适用的话,也就没必要往下看了,毕竟您都加班到凌晨3点了,我也不忍心浪费各位吃瓜的时间。

  1. 完美解决Tcp粘包,半包问题。
  2. 可发送或接收任意大小的任意可序列化对象(数据大小可以自己设置)。
  3. 可发送任意大小的字节数组(数据大小可以自己设置)。
  4. 可发送任意协议的字节数据,接收方可先判断协议,再处理数据(数据大小可以自己设置)。
  5. 服务器采用单线程工作模式,可处理客户端数量理论无限制(测试5万没有问题)。
  6. 接收到的数据将会以事件的形式触发,简单易用。
  7. 客户端可以长连接,也可以短连接。长连接可以随意与服务器互通数据,数据处理效率与连接客户端数量有关,测试连接5万客户端时,处理一条数据仅2ms。短连接可以在服务器接收完数据后立即销毁,也可以回复一条信息后再销毁,数据处理效率仍然与客户端数量有关,测试连接5万连接时,在本地网络回路中,从连接到接收到服务器数据所需时间不足1ms。

准备材料

  1. VS2017及以上版本
  2. Internet网络
  3. 电脑一台
  4. 基础编程人员一名
  5. 还有必不可少的程序集。RRQMSocket (该程序集是发布在Nuget网站上的,点击链接,下载最新版本就行,如果链接失效,直接在nuget官网搜索关键字就行)

开始

第一步,下载并解压出程序集

下载程序集,然后用解压工具打开,打开lib文件夹,net30文件夹,直到找到两个文件。

怎么在unity里用微信云数据库 unity数据包_游戏


第一个文档就是今天的主角,第二个文档是解释文档。

怎么在unity里用微信云数据库 unity数据包_游戏_02

第二步 创建Unity工程,并引用程序集

创建unity工程,在这里就不讲了,反正就是一直点点点,然后就是说说怎么引用。

1.在Unity文件夹里面新建一个文件夹,命名DLL,为了规范。

怎么在unity里用微信云数据库 unity数据包_怎么在unity里用微信云数据库_03


2.把刚才的两个文件直接拖进来

怎么在unity里用微信云数据库 unity数据包_网络_04


3.新建一脚本,命名为UnityClient(别忘了新建一个脚本文件夹,规范。规范)

怎么在unity里用微信云数据库 unity数据包_游戏_05


4.双击打开脚本,首先查看程序集是否已经自动引用,如果没有,那就瞪大眼睛

怎么在unity里用微信云数据库 unity数据包_c#_06


5.引入命名空间RRQMSocket

怎么在unity里用微信云数据库 unity数据包_游戏_07


6.创建客户端实例

假定该实例可能需要多次使用,且短链接,则UnityClient的类不需要继承任何类,单独就可以,创建一个静态方法,用于链接服务器。

public static void SendTest(string mes)
    {
        SimpleRRQMClient client = new SimpleRRQMClient();

        ConfirmSocket confirm = new ConfirmSocket();
        confirm.TargetIP = "192.168.1.104";
        confirm.TargetPort = 8848;
        confirm.WaitingTime = 1;

        ResultStatus result = client.Connect(confirm);
        if (result.Status)
        {
            ResultStatus sendStatus = client.SendObject(mes);
            if (!sendStatus.Status)
            {
                Debug.Log(sendStatus.Message);
            }
        }
        else
        {
            Debug.Log(result.Message);
        }
    }

7.创建服务器实例

新建一个VS控制台项目,添加引用刚才的程序集

怎么在unity里用微信云数据库 unity数据包_游戏_08


成功以后如图

怎么在unity里用微信云数据库 unity数据包_unity3d_09


同上引入命名空间RRQMSocket,并创建服务器类,绑定事件

static void Main(string[] args)
        {
            BaseSetting setting = new BaseSetting();
            setting.IP = "192.168.1.104";
            setting.Port = 8848;

            SimpleRRQMService service = new SimpleRRQMService(setting);//这个是学习版,接收数据有次数限制

            ResultStatus result = service.BindSocket();
            if (result.Status)
            {
                Console.WriteLine("游戏服务已启动");
            }
            else
            {
                Console.WriteLine(result.Message);
            }
            service.ReceiveObject += Service_ReceiveObject;
             Console.ReadKey();//暂停程序
        }

        private static void Service_ReceiveObject(object sender, ObjectEventArgs e)
        {
            Console.WriteLine("接收到数据:" + (string)e.DataObject);
        }

8.在Unity中调用SendTest方法;
新建一个脚本,命名为MainNetWork,在Updata里面调用SendTest;

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MainNetWork : MonoBehaviour
{
   int i = 0;
    float time = 0;
    void Update()
    {
        time += Time.deltaTime;
        if (time > 1)
        {
            UnityClient.SendTest(i++.ToString());
            time = 0;
        }

    }
}

9.开启Vs的服务器,如下图,然后把MainNetWork脚本挂载到任何的一个游戏物体中,小编就挂载到Camera上了。

怎么在unity里用微信云数据库 unity数据包_网络_10


怎么在unity里用微信云数据库 unity数据包_怎么在unity里用微信云数据库_11


10.运行Unity的项目。如图

怎么在unity里用微信云数据库 unity数据包_怎么在unity里用微信云数据库_12


为了测试该程序集的能力,我们可以直接把SendTest方法放在Update里面,再次运行

怎么在unity里用微信云数据库 unity数据包_游戏_13


怎么在unity里用微信云数据库 unity数据包_怎么在unity里用微信云数据库_14