Unity3d ScriptableObject是一个好的数据库设计吗?

Unity3d ScriptableObject是一个好的数据库设计吗?,unity3d,inventory,scriptable-object,Unity3d,Inventory,Scriptable Object,我试图制作一个简单的游戏数据库,包含简单的项目 我的数据库只是一个ScriptableObject,包含其他ScriptableObject(项目)的列表,其中包含关于项目的信息和字符串键 var item = DB.GetItem("weapon.magic_sword"); 1-是否有比使用键字符串标识项目更好的解决方案 2-如果我想要生成项目。例如,将随机统计数据添加到现有的“模板”项中,是否强制我为该项创建一个单行为脚本,并从模板脚本对象实例化该脚本?我使用流媒体资产来保存播放器的库存

我试图制作一个简单的游戏数据库,包含简单的项目

我的数据库只是一个ScriptableObject,包含其他ScriptableObject(项目)的列表,其中包含关于项目的信息和字符串键

var item = DB.GetItem("weapon.magic_sword");
1-是否有比使用键字符串标识项目更好的解决方案

2-如果我想要生成项目。例如,将随机统计数据添加到现有的“模板”项中,是否强制我为该项创建一个单行为脚本,并从模板脚本对象实例化该脚本?我使用流媒体资产来保存播放器的库存,因此我需要能够使用流媒体资产中生成的项目


注:我更喜欢避免使用真实的数据库(如sql)

我将详细分析您的问题:

  • 不确定“数据库”是什么意思-但如果您是指实际意义上的数据库,则不,
    ScriptableObject
    不能用于实现实际的数据库
  • ScriptableObject
    非常适合存储物品(基础护甲、伤害、成本等)的元数据
  • 如果要存储用户进程的动态数据(本地),IMO最简单、最健壮的解决方案是序列化库存类并将其存储在
    PlayerPrefs
    中。我们使用JSON.NET并将其存储为字符串;如果您想更优化/更安全,可以使用一些二进制序列化(Protobuff、内置二进制序列化等)
  • 我建议使用生成的guid而不是使用命名字符串,这会增加人为错误的风险。相反,只需向每个对象添加一个自动生成的
    GUID
    ,并通过其唯一ID获取/设置它

  • 我希望我正确地理解了您的问题并回答了它。

    这样做的目的是为了在整个游戏过程中保持变化吗?或者只是作为一个表格来查找有关物品的数据?在游戏过程中,库存内容可能会发生变化。但是,添加/删除的物品本身是固定的(除了那些随机统计的现有物品的变体)。当玩家关闭/重新打开游戏时会怎样?数据是否应该持久?是的,在游戏会话之间,库存是持久的。我计划将字符串id列表保存在流媒体资产中。但是,我不知道如何处理生成的项,因为我想我需要一个monobhavior来保存字符串id和项的stats修改。您可以将其存储在不是单一行为的标准类中。也就是说,对ScriptableObjects的更改不会在游戏会话之间持续。不能将scriptableobject用作数据库。您理解正确。我通过App.persistentDataPath和流媒体资产进行序列化。但是,如何自动生成GUID?它似乎比字符串更有效。我们不能100%确定Unity支持GUI,我们使用的是支持它的GUI。但是你可以很容易地自己做一个,然后为它创建一个