【问题标题】:How to draw Scene object in Unity inspector如何在 Unity 检查器中绘制场景对象
【发布时间】:2018-08-14 12:31:11
【问题描述】:

我需要在检查器中查看和操作场景对象(来自新的 SceneManager)。 即使我尝试使用

对其进行序列化
[SerializeField]
Scene scene;

场景仍然没有显示在检查器中。 由于 SceneManager 是相当新的(Unity 5),因此没有太多信息,我们希望避免像过去那样将场景引用为字符串。

【问题讨论】:

    标签: unity3d serialization scene inspector


    【解决方案1】:

    仅存储路径字符串是不够的,因为如果场景文件被重命名,您将丢失参考。我们可以使用对SceneAsset 的对象引用,但我们不再可以访问AssetDatabase 来查找不在编辑器中的路径。

    为了可靠地处理文件重命名和运行时路径,您需要两个序列化的数据(编辑器中的对象引用,运行时的字符串路径)。您可以创建一个使用ISerializationCallbackReceiverSceneReference 对象,以确保存储的路径基于指定的SceneAsset 对象始终有效。


    例如,这是我的实现:https://gist.github.com/JohannesMP/ec7d3f0bcf167dab3d0d3bb480e0e07b

    为了更好地衡量,我添加了一个PropertyDrawer,它显示了场景的构建状态并提供了一些方便的快速操作来管理它:

    每个按钮都有一个工具提示,具有破坏性的操作确认对话框,并遵守 EditorBuildSettings.asset 的 VersionControl 签出状态(使用 Perforce 测试)。

    【讨论】:

      【解决方案2】:

      正如documentation 中所述,Scene 对象只是一个运行时数据。因此,它仅在打开或运行时可用。您可能会为要操作的字段绘制一个自定义检查器。

      如果您只想获取在 BuildSettings 中定义的场景 您可以在 UnityEditor 命名空间中使用 EditorBuildSettings.scenes。创建一个自定义检查器字段(如Enum Popup),仅由 BuildSettings 中定义的场景进行选择。

      您也可以使用SceneSetup,您可以从UnityEditor.SceneManagement.EditorSceneManager 检索它。但这仅允许您在场景中或运行时操作加载的数据。

      您可以为场景对象创建一个包装类并为其绘制自定义Property drawer。然后,您将需要一些类来管理字段中的用户输入,以便将数据正确保存在实际的 Scene 对象中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-05
        • 2018-02-18
        相关资源
        最近更新 更多