Ссылка на сериализацию ScriptableObject (InstanceID) - PullRequest
0 голосов
/ 09 мая 2020

Допустим, у меня есть объект ScriptableObject PlayerData, который содержит ссылку на ScriptableObject AvatarData, например:

public class PlayerData : ScriptableObject
{
    public AvatarData avatar;
}

Во время игры игрок может сменить аватар на другой. Все объекты AvatarData сохраняются в файлах .asset. Я хочу сохранить ссылку на текущий выбранный экземпляр AvatarData и сохранить его в json / двоичном файле для обратной загрузки.

В случае создания объектов в памяти InstanceID будет изменять каждую игровую сессию. А как насчет экземпляров объектов, сериализованных в файлах .asset? Поскольку экземпляр сохраняется в файл, можем ли мы полагаться на него / быть уверены, что InstanceID не изменится? JsonUtility.ToJson сгенерирует json с InstanceID для каждого объекта, но мне нужно быть уверенным, что я получу тот же объект при вызове JsonUtility.FromJsonOverwrite. Я знаю, что он не будет работать с объектами, созданными в памяти, но я думаю, что он должен работать с экземплярами, сохраненными как файлы ресурсов. Боюсь, что InstanceID может меняться каждый раз, когда я создаю приложение.

У кого-нибудь есть опыт с этим? Лучше ли создать собственный UUID / Hashtable для ссылки на объекты в Unity3D?

Большинство ответов, которые я нашел, предполагают использование пространства имен UnityEditor, но его нельзя использовать в сборках.

1 Ответ

0 голосов
/ 09 мая 2020

Я нашел это сообщение о проблеме. Похоже, мы не можем полагаться на InstanceID в наших системах сохранения, и это способ go:

Создать еще один ресурс ScriptableObject, содержащий список ссылок на ваши ресурсы ScriptableObject. В ваших данных сохранения запишите индекс списка. Вы можете реализовать ISerializationCallbackReceiver и получить / установить индекс в обратных вызовах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...