前言
Unity 是一款功能非常強大的遊戲開發引擎,相信有很多小夥伴使用過。用它來開發單機小遊戲,簡直不要太爽。可是如果開發網絡遊戲的話,可能難度就比較大了,Unity有自帶的Unet組件可以使用,其使用體驗還算過得去。但是因爲其靈活度不高,並且傳輸數據較多,容易佔用更多帶寬,從而導致遊戲網絡延遲較高。所以很多人選擇用更底層的Socket,普通Socket如果使用得好話,必然爽的歪歪,但是最嚴重的就是粘包問題難以解決,而且尤其是對於網絡編程不太熟悉的同學,要先學習Socket的基礎,這無疑是給搖搖欲墜的孩子雪上加霜,不,加砒霜。所以小編這次帶來了一款小小程序集,或許可以解決您眼前這一窘迫。
程序集功能
首先在開始之前,讓我來給各位看瓜大爺簡單說說程序集能實現的功能,如果對功能不滿意,或者功能不適用的話,也就沒必要往下看了,畢竟您都加班到凌晨3點了,我也不忍心浪費各位吃瓜的時間。
- 完美解決Tcp粘包,半包問題。
- 可發送或接收任意大小的任意可序列化對象(數據大小可以自己設置)。
- 可發送任意大小的字節數組(數據大小可以自己設置)。
- 可發送任意協議的字節數據,接收方可先判斷協議,再處理數據(數據大小可以自己設置)。
- 服務器採用單線程工作模式,可處理客戶端數量理論無限制(測試5萬沒有問題)。
- 接收到的數據將會以事件的形式觸發,簡單易用。
- 客戶端可以長連接,也可以短連接。長連接可以隨意與服務器互通數據,數據處理效率與連接客戶端數量有關,測試連接5萬客戶端時,處理一條數據僅2ms。短連接可以在服務器接收完數據後立即銷燬,也可以回覆一條信息後再銷燬,數據處理效率仍然與客戶端數量有關,測試連接5萬連接時,在本地網絡迴路中,從連接到接收到服務器數據所需時間不足1ms。
準備材料
- VS2017及以上版本
- Internet網絡
- 電腦一臺
- 基礎編程人員一名
- 還有必不可少的程序集。RRQMSocketFramework
(該程序集是發佈在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裏面,再次運行