Unity3D 使用Socket進行遊戲數據的通信

前言

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. 還有必不可少的程序集。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裏面,再次運行
在這裏插入圖片描述
在這裏插入圖片描述

完美

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章