遊戲資料表的資料驅動
阿新 • • 發佈:2018-12-20
前言
之前博文介紹過了,一種程式碼匯出的工作方式《如何讓你的程式載入Excel配置檔案》。但這種方式存在一些弊端,比如如果想在執行時替換資料(Reload),就會比較困難(解釋執行語言例外)。但在目前的遊戲架構中,不論是客戶端還是伺服器,都強烈的具有這種需求。
主要思想
此時,我們的思路是,分離類定義和資料本身,類定義必須生成為匯出語言的程式碼,以方便IDE識別。資料匯出成自動生成型別可以識別的檔案格式。
匯出類結構
public class TestAllTypeConfig { public uint Id; public uint Id2; public string[] StringArray; public uint[] uintArray; public int[] intArray; public bool[] boolArray; public float[] floatArray; public double[] doubleArray; public uint uintType; public string stringType; public float floatType; public double doubleType; }
把excel檔案中的定義頭,匯出成程式碼(上面的例子是C#),程式設計師不需要在手寫配表匹配的類定義以及資料載入程式碼(ReadFile方法)。其中,資料載入的程式碼是和資料檔案格式相關聯的,這一部分會再匯出資料一節中講解。
此外,我們還需要生成資料容器和訪問函式,提供給程式設計師訪問需要的資料。
private static Dictionary<uint, ItemConfig> config = new Dictionary<uint, ItemConfig>(); public static ItemConfig GetConfig(uint id) { ItemConfig data; if (config.TryGetValue(id, out data)) return data; throw new NullReferenceException(string.Format("配置表ItemConfig不存在id={0}", id)); }
匯出資料
資料檔案的核心部分顯然就是上面config字典中的資料。這應該不是什麼難事,有一萬種方法可以把一個物件序列化成一個位元組流byte[]。我們可要呼叫現有的類庫(比如json),或者自動化生成程式碼,把物件轉化為流。作為逆流程,我們生成對應的Read方法,負責把資料從流讀出,並初始化物件。
此外,我們還需要給這個檔案增加一些安全機制,讓整個檔案的格式更加完整。
|CFGF|----VERSIONCODE----|-------------DATA-------------|CHECKSUM|
|CFGF| 檔案頭,如果讀取錯誤檔案,Read方法可以快速返回錯誤
|VERSIONCODE| 配置表版本碼,如果載入程式碼和資料版本不同,Read方法同樣會返回失敗
|DATA| 之前提到的資料部分
|CHECKSUM| 檔案內容的MD5校驗和,防止檔案內容被篡改的情況等