如何在Unity检查器中绘制Scene对象

时间:2017-01-16 16:35:26

标签: unity3d serialization scene inspector

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

序列化它
[SerializeField]
Scene scene;

现场仍未在检查员中显示。 由于SceneManager相当新(Unity 5),因此没有太多信息,我们希望避免将场景作为字符串引用,就像我们以前一样。

2 个答案:

答案 0 :(得分:0)

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

如果您只想在BuildSettings中定义场景 您可以使用EditorBuildSettings.scenes命名空间中的UnityEditor。创建自定义Inspector字段(如Enum Popup),仅根据BuildSettings中定义的场景进行选择。

您还可以使用SceneSetupUnityEditor.SceneManagement.EditorSceneManager可以从var classApp = angular.module('classApp', []); classApp.controller('classCtrl', function ($scope, $timeout) { $scope.isActive = false; $scope.activeButton = function () { $scope.isActive = !$scope.isActive; } function checkTime() { $scope.isActive = !$scope.isActive; } $timeout(checkTime, 2000) }); 检索。但这只允许您在场景中或在运行时操纵加载的数据。

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

答案 1 :(得分:0)

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

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


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

为了很好,我添加了一个PropertyDrawer,它显示了场景的构建状态,并提供了一些方便的快速操作来对其进行管理:

enter image description here

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