我们知道对于结构复杂,嵌套很深的数据结构,比如一个任务的多种任务效果、发布事件、写入NPC对话,用Excel做配表很难。ScriptableObject SO由于能快速根据脚本生成检查器面板,成为了编辑深嵌套NoSQL型数据的理想编辑器。
这里我们并不用SO长期储存数据,我的原因是修改SO的字段名或结构后原来的数据会丢失,此时我们需要json这种可读文件恢复丢失的数据。
using System;
using System.IO;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace Mercenaria
{
[CreateAssetMenu(menuName = "Custom/任务编辑器SO")]
public class MissionConfigSO : ScriptableObject
{
[Header("填Assets下的路径")]
public string jsonPath;
public List<MissionConfig> missionConfigs = new();
#if UNITY_EDITOR
[ContextMenu("导出json")]
void ToJson() {
string tempPath = jsonPath.Replace("/Assets", "");
string path = Path.Combine(Application.dataPath, tempPath);
Dictionary<string, MissionConfig> dic = new();
foreach(var config in missionConfigs)
{
dic[config.Id] = config;
}
string json=JsonConvert.SerializeObject(dic);
File.WriteAllText(path, json);
AssetDatabase.Refresh();
}
Dictionary<string, MissionConfig> GetDic()
{
string json = AssetDatabase.LoadAssetAtPath<TextAsset>(jsonPath).text;
var dic = JsonConvert.DeserializeObject<Dictionary<string, MissionConfig>>(json);
return dic;
}
[ContextMenu("导入json")]
void FromJson()
{
var dic =GetDic();
missionConfigs.Clear();
foreach(var config in dic.Values)
{
missionConfigs.Add(config);
}
}
[ContextMenu("追加导入json")]
void AppendFromJson()
{
var dic = GetDic();
missionConfigs.Clear();
foreach (var config in dic.Values)
{
missionConfigs.Add(config);
}
}
#endif
}
}

587

被折叠的 条评论
为什么被折叠?



