Creating persistent object in Edit mode

As the documentation for EditorUtility.IsPersistent says:

Returns false if the object lives in the scene. Typically this is a game object or component but it could also be a material that was created from code and not stored in an asset but instead stored in the scene.

That’s right, I’m creating a material from code, inside an EditorWindow class. How to make it persist and save to disk?

  • [SerializableField] doesn’t work.
  • Setting the variable to public doesn’t work.
  • EditorPrefs can’t help me, because it’s only for value types.
  • Any other option?

To clarify, I want to retain the variable reference upon closing Unity3D and opening the project again, I don’t even know if it’s possible.

Update

I just followed instructions found here, and created the material on disk using AssetDatabase. Although the materials effectively are stored on Assets, the reference itself is lost, so I have to load them everytime in my EditorWindow.
To illustrate this point, I uploaded 2 screenshots:

In this, we can see that the materials are loaded, and IsPersistent returns true for all.

http://i.imgur.com/zStuZ.png

I restart Unity3D, and now the references are gone! But the materials are still in the Assets folder.

http://i.imgur.com/XME88.png

Ah, nevermind. I was needing [SerializableField] on the variables.

I understand a little better how it works: EditorUtility.IsPersistent tells me if my objects is going to be erased next time Unity3D restarts, because it isn’t stored in disk, it isn’t stored anywhere! I can’t really make it persistent without creating an asset. I was just creating the Material on the fly, but I never told Unity3D where to save it. So I couldn’t expect him to save it automatically in a random position.

Seems like the way to go is to create an asset, be it hidden using HideFlags or not. Afer we create an asset, now Unity3D will be able to save the object in disk. The reference itself will be lost, unless you make the reference public, or put [SerializableField] attribute above the variable.

My mistake was to think that [SerializableField] would work even if I didn’t create an asset. I guess it doesn’t!

If anyone can tell me if I’m right with this, I would appreciate it.