Script annotation
Mostly, using Persyst consists on annotating scripts to tell the PersistentObject what to serialize. This comes in two forms: the ISaveable
interface, and the [SaveThis]
attribute. Both of them live in the namespace Persyst
.
ISaveable
You can mark any class as saveable by implementing the ISaveable
interface, like so:
using Persyst;
public class SerializableMB : MonoBehaviour, ISaveable
{
}
The interface does not contain any methods that you need to implement. It's just a tag.
Why an interface, then? Why not an attribute?
GetComponents<ISaveable>()
inside of the PersistentObject. It could have been an attribute as well, this is just very slightly more convenient.The [SaveThis] Attribute
Inside of an ISaveable
class, you can mark any field (and most properties) to be serialized with the attribute [SaveThis]
. The PersistentObject
component attached to this GameObject
will take it from there.
using Persyst;
public class SerializableMB : MonoBehaviour, ISaveable
{
[SaveThis] int someValue;
[SaveThis] GameObject someReference;
}
Serializing classes that are not ISaveable
This interface is absolutely required for MonoBehaviours
, but objects that are nested inside a MonoBehaviour
can still be serialized even if their class is not tagged as ISaveable
.
using Persyst;
public class SerializableMB : MonoBehaviour, ISaveable
{
//both of these will be serialized
[SaveThis] AnISaveableClass isaveableField;
[SaveThis] NotISaveable nonIsaveableField;
}
public class AnISaveableClass : ISaveable{
//...
}
public class NotISaveable{
//...
}
However, there are some restriction as to how the fields inside of NotISaveable
will be serialized. [SaveThis]
only really does something if it is inside of an ISaveable
class. See Nesting classes and Inheritance for more details on this.
In general, I would recommend that every user-defined class that needs to be serialized implements ISaveable
. It will make your life easier.