具有保存/加载系统的ScriptableObject上的数据库

介绍



每个游戏都有游戏设计师可以使用的数据。在RPG中,这是一个数据库,其中包含match-3中的物品-商店中各种工具的价格,在动作游戏中的价格-急救箱能恢复的HP量。



存储此类数据的方法有很多-有人将它们存储在表,xml或json文件中,并使用自己的工具进行编辑。Unity提供了自己的方式-脚本对象(SO),我喜欢它,因为您无需为自己的可视化演示编写自己的编辑器,可以轻松链接到游戏资产和彼此,并且随着可寻址对象的出现,这些数据可以轻松,方便地存储在外部游戏并分别进行更新。



在本文中,我想谈谈我的SODatabase库,您可以使用该库方便地创建,编辑和在游戏中(编辑和序列化)可编写脚本的对象使用。



创建和编辑SO



我在一个单独的窗口中创建和编辑SO,这与带有检查器的项目窗口有些相似-左侧是文件夹树(所有SO都位于其中的文件夹-可寻址的组),而右侧是所选SO的检查器。



接口



要绘制这样的WindowEditor,我使用Odin Inspector另外,我使用该库中的SO序列化-通过允许存储多态类,深层嵌套和类引用,它大大扩展了标准unitium序列化。



创建SO



通过单击此窗口中的按钮来创建新的SO,在这里您需要选择所需的Bipod的类型,并在文件夹中创建它。为了使SO类型作为选项出现在此窗口中,SO必须从DataNode继承,DataNode仅对ScriptableObject一个附加字段



public string FullPath { get; }


SO, .



SO



- , , SO - , — , , SO.

static SODatabase , , .



public static T GetModel<T>(string path) where T : DataNode   

public static List<T> GetModels<T>(string path, bool includeSubFolders = false) where T : DataNode


, SODatabase , Addressables.





ScriptableObject , . ScriptableObject . , SO .



— , , - , . , SO . , unity, xml .



, ScriptableObject JSON.



DataNode — SO, SODatabase,



[JsonObject(MemberSerialization.OptIn, IsReference = true)]


JsonProperty save.txt . SODatabase addressables JsonConvert.PopulateObject SODatabase, .



, , SO ( , JsonProperty) -, SO . — . , , , .





-



async void Awake()
{
    await SODatabase.InitAsync(null, null);
    await SODatabase.LoadAsync();
}




private void OnApplicationPause(bool pauseStatus)
{
    if (pauseStatus)
        SODatabase.Save();
}

private void OnApplicationQuit()
{
    SODatabase.Save();
}        


PlayerSO, — , , . - , SODatabase, .



public class PlayerSO : DataNode
{
    public static string Path => "PlayerInfo/Player";

    [JsonProperty]
    public string Title = string.Empty;

    [JsonProperty]
    public int Experience;
}


PlayerInventorySO, ( SO SODatabase).



 public class PlayerInventorySO : DataNode
 {
     public static string Path => "PlayerInfo/PlayerInventory";

     [JsonProperty]
     public List<ItemSO> Items = new List<ItemSO>();
 }


, — , . , , QuestSO (, , ..) . - .



public class QuestNode : BaseNode
{
    public static string Path = "QuestNodes";

    //Editor
    public virtual string Title { get; } = string.Empty;

    public virtual string Description { get; } = string.Empty;

    public int TargetCount;

    //Runtime
    [JsonProperty]
    private bool finished;
    public bool Finished
    {
        get => finished;
        set => finished = value;
    }
}


, JsonProperty , SO .



var playerSO = SODatabase.GetModel<PlayerSO>(PlayerSO.Path);
var playerInventorySO = SODatabase.GetModel<PlayerInventorySO>(PlayerInventorySO.Path);
var questNodes = SODatabase.GetModels<QuestNode>(QuestNode.Path, true);




— - / , , SO, json. - , ( ..) . SO , SODatabase , Addressables.



addressables ( ). .



该库可在github上公开获得使用c#8中的Nullable编写,因此需要Unity 2020.1.4作为最低版本。




All Articles