目錄
一、ScriptableObject
1.創建ScriptableObject
2.創建asset資源
3.asset資源的讀取與保存
二、Excel轉JSON
1.Excel格式
2.導表工具
(1)處理A格式Excel
(2)處理B格式Excel
三、解析Json文件
1.讀取test.json文件
四、相關插件
在游戲開發中,策劃與程序需要有良好的配置環境來處理數據,可以直接使用ScriptableObject來處理數據,或者通過Excel轉JSON的形式將數據表直接從Excel里抓取過來,也可以使用Sqlite進行數據存儲。
一、ScriptableObject
ScriptableObject適合數據量比較小的配置信息。每個繼承到ScriptableObject的類需要單獨在一個腳本文件中。嵌套的類需要聲明Serializable特性。
[Serializable]是C#中System命名空間下的特性,標記一個類可被序列化。序列化是指將對象轉換為字節流,以便存儲到文件、網絡傳輸或持久化數據。
[SerializeField]屬于UnityEngine命令空間,表示某個字段可以被序列化,即可以在Inspector面板中顯示。
1.創建ScriptableObject
ScriptableObject的創建很簡單,只需要繼承ScriptableObject類并標注CreateAssetMenu特性即可。
[CreateAssetMenu(fileName = "BackpackInfo", menuName = "Save/BackpackInfo")]public class BackpackInfo : ScriptableObject{public Item[] Items;}[System.Serializable]public class Item{public int ItemId;public int Count;}
當然也可以嵌套類:
[CreateAssetMenu(fileName = "FurnitureConfig", menuName = "MyProj/FurnitureConfig")]
//該特性標記了ScriptableObject的基本信息,只有加入該特性,腳本才能以文件對象的形式被創建
public class FurnitureScriptableObject : ScriptableObject
{[Serializable] //聲明是序列化類public class FurnitureInfo{public string DisplayName; //顯示名稱public string Url; //url地址public Vector3 Pos; //位置}public FurnitureInfo[] furnitureInfoArray; //家具信息數組對象
}
2.創建asset資源
編寫完成上述腳本后就可以在Project面板的右鍵菜單中創建了,可以將創建的data.asset資源存放到Resources文件夾下,方便讀取及保存。
生成的data.asset文件是yaml語法,類似的有TagManager.asset等。
YAML的基本語法規則包括:大小寫敏感、使用縮進表示層級關系、禁止使用制表符縮進,且每個縮進級別應保持一致。
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:m_ObjectHideFlags: 0m_CorrespondingSourceObject: {fileID: 0}m_PrefabInstance: {fileID: 0}m_PrefabAsset: {fileID: 0}m_GameObject: {fileID: 0}m_Enabled: 1m_EditorHideFlags: 0m_Script: {fileID: 11500000, guid: 3969674121eab4a928178bee57fc1452, type: 3}m_Name: datam_EditorClassIdentifier: furnitureInfoArray:- DisplayName: Url: Pos: {x: 0, y: 0, z: 0}- DisplayName: Url: Pos: {x: 0, y: 0, z: 0}
3.asset資源的讀取與保存
FurnitureScriptableObject furnitureScriptableObject;public void GetDataFromLocal(){furnitureScriptableObject = Resources.Load<FurnitureScriptableObject>("_TempData/data");}/// <summary>/// 修改家具位置/// </summary>/// <param name="pos"></param>public void ChangePos(Vector3 pos){//這里只是舉例說明,實際情況建議根據ID來修改if (furnitureScriptableObject.furnitureInfoArray.Length > 0){furnitureScriptableObject.furnitureInfoArray[0].Pos = pos;}SavePlayerInfoToLocal();}/// <summary>/// 保存數據到本地/// </summary>private void SavePlayerInfoToLocal(){// 標記資源為“臟”(表示需要保存)
#if UNITY_EDITORUnityEditor.EditorUtility.SetDirty(furnitureScriptableObject);// 手動保存資源UnityEditor.AssetDatabase.SaveAssets();
#endif}
二、Excel轉JSON
對于一些數據量比較大的配置信息,可以通過Excel導入數據的處理方式。
1.Excel格式
常見的Excel配置表有兩種格式:
- A格式:每行代表名稱、類型、客戶端/服務端使用標識、描述
- B格式:以名稱|類型來配置,讀取時代碼來進行字符串處理(當然也可以添加描述等信息):
2.導表工具
首先需要編寫一個中間程序,使用EPPlus去讀Excel文件并取出前幾列的數據作為數據字段定義,并按照模板生成.cs文件和json序列化文件。
(1)處理A格式Excel
提前寫了一個ConfigBase類作為父類,每個Excel的Sheet生成的類都繼承該類。
using System.Collections.Generic;
using Modules.Common.UniUtils;
using Newtonsoft.Json;
using UnityEngine;namespace PetBuddy
{public class ConfigBase{public int ID;private static ConfigBase _instance;protected Dictionary<int, ConfigBase> ToDictionary = new Dictionary<int, ConfigBase>();private static Dictionary<string, ConfigBase> _configs = new Dictionary<string, ConfigBase>();public static T GetConfigById<T>(int id) where T : ConfigBase, new(){var name = typeof(T).Name;name = name.Replace("Config", "");if (!_configs.ContainsKey(name)){var config =