ScriptableObject behaviour discussion (how Scriptable Objects work)

I think some of the confusion comes from ScriptableObject instances vs. ScriptableObject assets.

ScriptableObject.Awake() is only called on instances, when you create the instance. It’s not called on existing assets. (But it is called on the asset when you first create it as an instance, before saving it as an asset.)

ScriptableObject.OnEnable(), like you mentioned, is only called on assets when the editor loads the asset for the inspector, or when the asset is first referenced in a build. I don’t think it’s guaranteed to be called when switching into playmode.