c# - 序列化 ScriptableObject 引用 (InstanceID)

标签 c# unity3d scriptable-object

假设我有一个 PlayerData ScriptableObject,它包含对 AvatarData ScriptableObject 的引用,如下所示:

public class PlayerData : ScriptableObject
{
    public AvatarData avatar;
}

在游戏过程中玩家可以更换头像。所有 AvatarData 对象都保存在 .asset 文件中。我想保存对当前选定的 AvatarData 实例的引用,并将其保存在 json/binary 文件中以供加载。

对于在内存中创建的对象,InstanceID 将在每个游戏 session 中发生变化。在 .asset 文件中序列化的对象实例呢?由于实例已保存到文件中,我们能否依赖它/确保 InstanceID 不会更改? JsonUtility.ToJson 将为每个对象生成带有 InstanceID 的 json,但我需要确保在调用 JsonUtility.FromJsonOverwrite 时我将获得相同的对象。我知道它不适用于在内存中创建的对象,但我认为它应该适用于保存为 Assets 文件的实例。恐怕每次构建应用程序时 InstanceID 都可能会发生变化。

有没有人有这方面的经验?创建自己的 UUID/Hashtable 来引用 Unity3D 中的对象是否更好?

我找到的大多数答案都建议使用 UnityEditor 命名空间,但不能在构建中使用它。

最佳答案

我找到了 this发布有关该问题的信息。似乎我们不能在我们的保存系统中依赖 InstanceID,这是要走的路:

Create another ScriptableObject assets that holds a list of references to your ScriptableObject assets. In your save data, record the list index. You can implement ISerializationCallbackReceiver and get/set the index in the callbacks.

关于c# - 序列化 ScriptableObject 引用 (InstanceID),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61698052/

相关文章:

c# - 如何验证内部属性是否设置了正确的值?

c# - while 循环中的值未更新

c# - 如何使用 WHERE 条件显示记录

c# - Unity 失真音频

unity3d - Oculus Go和Unity:麦克风实时播放

c# - unity 脚本对象在构建中不起作用

c# - 检查类型而不是 null 是一个合理的选择吗?

c# - 从一个保存文件反序列化多个不相关的 ScriptableObjects

collision-detection - 用鼠标控制的 Racket 对快速移动的球进行碰撞检测的问题