【发布时间】:2018-08-14 12:31:11
【问题描述】:
我需要在检查器中查看和操作场景对象(来自新的 SceneManager)。 即使我尝试使用
对其进行序列化[SerializeField]
Scene scene;
场景仍然没有显示在检查器中。 由于 SceneManager 是相当新的(Unity 5),因此没有太多信息,我们希望避免像过去那样将场景引用为字符串。
【问题讨论】:
标签: unity3d serialization scene inspector
我需要在检查器中查看和操作场景对象(来自新的 SceneManager)。 即使我尝试使用
对其进行序列化[SerializeField]
Scene scene;
场景仍然没有显示在检查器中。 由于 SceneManager 是相当新的(Unity 5),因此没有太多信息,我们希望避免像过去那样将场景引用为字符串。
【问题讨论】:
标签: unity3d serialization scene inspector
仅存储路径字符串是不够的,因为如果场景文件被重命名,您将丢失参考。我们可以使用对SceneAsset 的对象引用,但我们不再可以访问AssetDatabase 来查找不在编辑器中的路径。
为了可靠地处理文件重命名和运行时路径,您需要两个序列化的数据(编辑器中的对象引用,运行时的字符串路径)。您可以创建一个使用ISerializationCallbackReceiver 的SceneReference 对象,以确保存储的路径基于指定的SceneAsset 对象始终有效。
例如,这是我的实现:https://gist.github.com/JohannesMP/ec7d3f0bcf167dab3d0d3bb480e0e07b
为了更好地衡量,我添加了一个PropertyDrawer,它显示了场景的构建状态并提供了一些方便的快速操作来管理它:
每个按钮都有一个工具提示,具有破坏性的操作确认对话框,并遵守 EditorBuildSettings.asset 的 VersionControl 签出状态(使用 Perforce 测试)。
【讨论】:
正如documentation 中所述,Scene 对象只是一个运行时数据。因此,它仅在打开或运行时可用。您可能会为要操作的字段绘制一个自定义检查器。
如果您只想获取在 BuildSettings 中定义的场景
您可以在 UnityEditor 命名空间中使用 EditorBuildSettings.scenes。创建一个自定义检查器字段(如Enum Popup),仅由 BuildSettings 中定义的场景进行选择。
您也可以使用SceneSetup,您可以从UnityEditor.SceneManagement.EditorSceneManager 检索它。但这仅允许您在场景中或运行时操作加载的数据。
您可以为场景对象创建一个包装类并为其绘制自定义Property drawer。然后,您将需要一些类来管理字段中的用户输入,以便将数据正确保存在实际的 Scene 对象中。
【讨论】: