Сериализация экземпляра скрипта в ScriptableObject в Unity

Я знаю, что это можно сделать, потому что в удивительном плагине Odin есть потрясающие инструменты сериализации.

Я надеялся, что смогу сделать это с помощью Odin, но даже их тег [Serialize] не работает.

Я хочу сериализовать новый экземпляр скрипта внутри Scriptable Object.

С помощью Odin вы можете сериализовать словари, и если вы сериализуете словарь, который содержит экземпляр интерфейса (скрипт), он позволяет вам создать новый экземпляр этого скрипта внутри словаря следующим образом:

введите здесь описание изображения

Поскольку можно хранить экземпляр скрипта внутри словаря, мне любопытно, как это можно сделать самостоятельно.

Сценарий, который я хочу сохранить, представляет собой общий сценарий только с функциями и пустым конструктором.

Знаете ли вы, зачем сериализовать экземпляр интерфейса (скрипт) внутри ScriptableObject?

В идеале я мог бы каким-то образом создать атрибут и просто заставить его сериализоваться следующим образом:

public class MyClass: MonoBehaviour
{
    [ForceSerialize]
    public IScript scriptToSerialize;

}

А затем в инспекторе я мог просто щелкнуть поле и создать новый экземпляр этого скрипта, который будет прикреплен к объекту.


person Aggressor    schedule 28.12.2019    source источник
comment
Не показывая весь iscript, как вы его определили. Это system.serialiseable?   -  person BugFinder    schedule 29.12.2019
comment
Так что это часть проблемы, вы не можете объявить интерфейсы сериализуемыми. И тем не менее, с Odin вы все равно можете добавить экземпляр, так что я знаю, что есть способ   -  person Aggressor    schedule 29.12.2019


Ответы (1)


Вам не нужен тег [Serialize], MyClass просто должен наследоваться от Sirenix.OdinInspector.SerializedMonoBehaviour вместо MonoBehaviour. Этот «сериализованный» класс (также существует для ScriptableObjects и т.п.) необходимо использовать для того, чтобы настраиваемая сериализация Odin работала, что заставит ваше поле отображаться в инспекторе.

Этот скрипт работает для меня:

using Sirenix.OdinInspector;

public class MyScript : SerializedMonoBehaviour
{
    public IScript scriptToSerialize;
}

public interface IScript { }
person Vale    schedule 29.12.2019
comment
Хорошо, бинго! Проблема в том, что я наследовал от ScriptableObject. Когда я переключился на SerializedMonoBehaviour, это сработало. Причина, по которой я не пробовал это, заключается в том, что я ошибочно предположил, что использование тега [Serialized] заставит его работать, если он может работать. Большое спасибо! - person Aggressor; 29.12.2019
comment
Рад помочь. Так же, как SerializedMonoBehaviour, Sirenix.OdinInspector.SerializedScriptableObject также существует, если вам это нужно. - person Vale; 29.12.2019