前言
Unity 是一款功能非常强大的游戏开发引擎,相信有很多小伙伴使用过。用它来开发单机小游戏,简直不要太爽。可是如果开发网络游戏的话,可能难度就比较大了,Unity有自带的Unet组件可以使用,其使用体验还算过得去。但是因为其灵活度不高,并且传输数据较多,容易占用更多带宽,从而导致游戏网络延迟较高。所以很多人选择用更底层的Socket,普通Socket如果使用得好话,必然爽的歪歪,但是最严重的就是粘包问题难以解决,而且尤其是对于网络编程不太熟悉的同学,要先学习Socket的基础,这无疑是给摇摇欲坠的孩子雪上加霜,不,加砒霜。所以小编这次带来了一款小小程序集,或许可以解决您眼前这一窘迫。
程序集功能
首先在开始之前,让我来给各位看瓜大爷简单说说程序集能实现的功能,如果对功能不满意,或者功能不适用的话,也就没必要往下看了,毕竟您都加班到凌晨3点了,我也不忍心浪费各位吃瓜的时间。
- 完美解决Tcp粘包,半包问题。
- 可发送或接收任意大小的任意可序列化对象(数据大小可以自己设置)。
- 可发送任意大小的字节数组(数据大小可以自己设置)。
- 可发送任意协议的字节数据,接收方可先判断协议,再处理数据(数据大小可以自己设置)。
- 服务器采用单线程工作模式,可处理客户端数量理论无限制(测试5万没有问题)。
- 接收到的数据将会以事件的形式触发,简单易用。
- 客户端可以长连接,也可以短连接。长连接可以随意与服务器互通数据,数据处理效率与连接客户端数量有关,测试连接5万客户端时,处理一条数据仅2ms。短连接可以在服务器接收完数据后立即销毁,也可以回复一条信息后再销毁,数据处理效率仍然与客户端数量有关,测试连接5万连接时,在本地网络回路中,从连接到接收到服务器数据所需时间不足1ms。
准备材料
- VS2017及以上版本
- Internet网络
- 电脑一台
- 基础编程人员一名
- 还有必不可少的程序集。RRQMSocket (该程序集是发布在Nuget网站上的,点击链接,下载最新版本就行,如果链接失效,直接在nuget官网搜索关键字就行)
开始
第一步,下载并解压出程序集
下载程序集,然后用解压工具打开,打开lib文件夹,net30文件夹,直到找到两个文件。
第一个文档就是今天的主角,第二个文档是解释文档。
第二步 创建Unity工程,并引用程序集
创建unity工程,在这里就不讲了,反正就是一直点点点,然后就是说说怎么引用。
1.在Unity文件夹里面新建一个文件夹,命名DLL,为了规范。
2.把刚才的两个文件直接拖进来
3.新建一脚本,命名为UnityClient(别忘了新建一个脚本文件夹,规范。规范)
4.双击打开脚本,首先查看程序集是否已经自动引用,如果没有,那就瞪大眼睛
5.引入命名空间RRQMSocket
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控制台项目,添加引用刚才的程序集
成功以后如图
同上引入命名空间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上了。
10.运行Unity的项目。如图
为了测试该程序集的能力,我们可以直接把SendTest方法放在Update里面,再次运行