遊戲前端,避免不了的跟服務器通訊,其實遊戲的大部分邏輯都在服務端,並不在客戶端,所以需要跟服務端通訊“協商”一些邏輯,既然通訊,就少不了的傳輸,傳輸之前又要序列化,這篇博客主要講一下Int類型數據的序列化以及反序列化。
這是我博客新開的一個類別,這個類別主要講前端與服務器的通訊原理和過程,以及實現方法,我會慢慢更新,直至更新完畢,都在學習,有什麼問題可以大家一塊商討,一起解決問題!
Unity前端,主要語言是C#,當然也有用lua的,方便熱更新,今天說的是C#先把基礎的C#給搞明白,有前端就要有後端,後端語言很多種,這裏我說的是Java,其他語言大差不差,基本原理都一樣,掌握了這個一個基本上與服務器通訊不是什麼難題。
首先C#與Java之間的序列化是相反的,比如序列化一個int類型的數,這個數是90,前端C#寫法是這樣的:
using UnityEngine;
using System.IO;
using System.Collections.Generic;
using System;
using UnityEngine.UI;
/// <summary>
/// 序列化int類型的數據並打印
/// </summary>
public class Test : MonoBehaviour {
private List<byte> bytes = new List<byte>();
void Start()
{
Debug.Log("序列化int類型的數據");
ToArray(90);
}
void ToArray(int a)
{
byte[] bs = BitConverter.GetBytes(a);
//此句爲反轉這個int類型的數據,以便與Java端通訊
//Array.Reverse(bs);
this.bytes.AddRange(bs);
foreach (byte str in bytes)
{
//由於int類型的數據佔用4個字節 所以輸出爲:A , 0 ,0 ,0;
Debug.Log(str);
}
}
}
這個腳本你會看到第21行有個註釋,這一句很重要,我先註釋,然後看一下輸出是這樣的:
輸出結果爲:90,0,0,0
這樣的輸出結果本身是沒錯的,但是在Java端的結果正好是相反的,Java的結果是0,0,0,90;
所以必須要處理一下該數據,這個東西前端或者後端處理都可以,不過後端處理起來比較麻煩,所以我在前端就處理了就是哪個第21行的註釋,如果加上註釋,輸出結果正好相反,如下圖所示:
在C#中,反轉數據只需要一句話,但是在Java中比較麻煩,所以建議前端反轉該數據,反轉只需要將第21行的代碼註釋去掉即可
或這加上:
Array.Reverse(bs);
但是string類型的數據是無需反轉的,這一點需要記住了!
即可完成,當然這只是前奏,這樣寫會很麻煩,我們要做一個管理類,這樣用起來就會方便很多,每次序列化或者反序列化都可以從這個管理類裏面經過,然後展現出來。
所以要在項目中新建一個類,名字叫做 ByteBuf
首先刪除命名空間,建立一個私有的list 這個list用來接住發過來的東西,然後私有一個長度和座標,不多說,看下面的腳本:
using System; using System.Collections.Generic; using System.Linq; using System.Text; /// <summary> /// int類型的序列化和反序列化 /// </summary> public class ByteBuf{ private List<byte> bytes = new List<byte>(); private int length; private int position; public int Length { get { return length; } set { length = value; } } public int Position { get { return position; } set { position = value; } } /// <summary> /// 寫int類型的數據(序列化) /// </summary> /// <param 長度="valve"></param> public void WriteInt(int valve) { byte[] by = BitConverter.GetBytes(valve); Array.Reverse(by); this.bytes.AddRange(by); } /// <summary> /// 讀int類型的數據(反序列化) /// </summary> /// <returns></returns> public int ReadInt() { byte[] array = new byte[4]; for (int i = 0; i < 4; i++) { array[i] = this.bytes[i + this.Position]; } Position += 4; Array.Reverse(array); return BitConverter.ToInt32(array, 0); } }
這樣的話就可以來用這個方法直接序列化或者反序列化了!
今天教程先到這,後面的東西慢慢更新,大神勿噴,後輩獻醜了!