目录
一、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: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3969674121eab4a928178bee57fc1452, type: 3}
m_Name: data
m_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_EDITOR
UnityEditor.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 =