Exemplo n.º 1
0
    void InitSceneDataReorderableList(ReorderableList list, string title)
    {
        list.drawHeaderCallback = (r) => EditorGUI.LabelField(r, title, EditorStyles.boldLabel);

        list.drawElementCallback = (rect, index, isActive, isFocused) => {
            serializedObject.Update();
            EditorGUI.BeginChangeCheck();
            var elem        = list.serializedProperty.GetArrayElementAtIndex(index);
            var sceneName   = elem.FindPropertyRelative(nameof(TestSceneAsset.SceneData.scene));
            var scenePath   = elem.FindPropertyRelative(nameof(TestSceneAsset.SceneData.scenePath));
            var sceneLabels = elem.FindPropertyRelative(nameof(TestSceneAsset.SceneData.sceneLabels));
            var enabled     = elem.FindPropertyRelative(nameof(TestSceneAsset.SceneData.enabled));
            rect.height = EditorGUIUtility.singleLineHeight;

            // Scene field
            var sceneGUID = AssetDatabase.FindAssets($"t:Scene {sceneName.stringValue}", new [] { "Assets", "Packages" })
                            .FirstOrDefault(guid => Path.GetFileNameWithoutExtension(AssetDatabase.GUIDToAssetPath(guid)) == sceneName.stringValue);
            SceneAsset sceneAsset = null;
            if (!String.IsNullOrEmpty(sceneGUID))
            {
                string path = AssetDatabase.GUIDToAssetPath(sceneGUID);

                // Only if the scene we found is the correct one, we assign it correctly
                if (Path.GetFileNameWithoutExtension(path) == sceneName.stringValue)
                {
                    sceneAsset = String.IsNullOrEmpty(sceneGUID) ? null : AssetDatabase.LoadAssetAtPath <SceneAsset>(AssetDatabase.GUIDToAssetPath(sceneGUID));
                }
            }

            EditorGUI.BeginChangeCheck();
            sceneAsset = EditorGUI.ObjectField(rect, "Test Scene", sceneAsset, typeof(SceneAsset), false) as SceneAsset;
            if (EditorGUI.EndChangeCheck())
            {
                sceneName.stringValue   = sceneAsset != null && !sceneAsset.Equals(null) ? sceneAsset.name : null;
                scenePath.stringValue   = AssetDatabase.GetAssetPath(sceneAsset);
                sceneLabels.stringValue = GetLabelForAsset(sceneAsset);
            }

            // Enabled field
            rect.y += fieldHeight;
            EditorGUI.PropertyField(rect, enabled);

            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
            }
        };

        list.elementHeight = fieldHeight * 2;

        list.onAddCallback    = DefaultListAdd;
        list.onRemoveCallback = DefaultListDelete;
    }
Exemplo n.º 2
0
        private void UpdateSceneAssetReferences(SceneAsset sceneAsset, SceneAsset newSceneAsset)
        {
            if (sceneAsset == null && newSceneAsset == null)
            {
                return;
            }

            if (sceneAsset != null && sceneAsset.Equals(newSceneAsset))
            {
                return;
            }

            var assetPath = AssetDatabase.GetAssetPath(newSceneAsset);

            // ReSharper disable once PossibleNullReferenceException
            sceneGuidProp.stringValue = AssetDatabase.AssetPathToGUID(assetPath);

            if (newSceneAsset)
            {
                sceneNameProp.stringValue = newSceneAsset.name;
            }
        }