A SceneReference wrapper class that uses ISerializationCallbackReceiver and a custom PropertyDrawer to provide safe, user-friendly scene references in scripts.
This repository has UPM support. You can install this plugin to your project using OpenUPM:
npm install -g openupm-cli openupm add com.johannesmp.unityscenereference
Original author is JohannesMP. Give them some love for creating this amazing plugin.
A
SceneReferencewrapper class that uses ISerializationCallbackReceiver and a custom
PropertyDrawerto provide safe, user-friendly scene references in scripts.
Sooner or later Unity Developers will want to reference a Scene from script, so they can load it at runtime using the SceneManager.
We can store a string of the scene's path (as the SceneAsset documentation suggests), but that is really not ideal for production: If the scene asset is ever moved or renamed, then our stored path is broken.
Unity has already solved this problem for assets using Object references. Using AssetDatabasse you can find the path for a given asset. The problem there unfortunately is that we don't have access to AssetDatabase at runtime, since it is part of the
UnityEditorAssembly.
So to be able to reliably use a scene both in editor and at runtime we need two pieces of serialized information: A reference to the SceneAsset object, and a string path that can be passed into SceneManager at runtime.
We can create our own Wrapper class that uses
ISerializationCallbackReceiverto ensure that the stored path is always valid based on the specified SceneAsset Object.
This
SceneReferenceclass is an example implementation of this idea.
For easy runtime verification I've also provided a testing Monobehaviour that lets you view and load scenes via buttons when in playmode: