private static bool LayerCompositorHasDuplicates(LayerCompositor layerCompositor) { foreach (LayerCompositor.Layer layer in layerCompositor.Layers) { if (Array.FindAll(layerCompositor.Layers, x => x.scene == layer.scene).Length > 1) { return(true); } } return(false); }
public override void OnInspectorGUI() { serializedObject.Update(); DrawPropertiesExcluding(serializedObject, new string[] { layersListName }); layersList.DoLayoutList(); serializedObject.ApplyModifiedProperties(); LayerCompositor layerCompositor = (LayerCompositor)target; // protect against empty Layers set, and hide the buttons when not needed if ((layerCompositor.Layers != null) && (layerCompositor.Layers.Length > 0)) { if (LayerCompositorHasDuplicates(layerCompositor)) { EditorGUILayout.HelpBox("Duplicate scenes are listed in the layers.", MessageType.Warning); } if (LayerCompositorContainsParentScene(layerCompositor)) { EditorGUILayout.HelpBox("The scene of this gameobject is listed as a layer.", MessageType.Warning); } if (GUILayout.Button("Load/unload selected layer")) { if (layersList.index != -1) { LayerCompositor.Layer selectedLayer = layerCompositor.Layers[layersList.index]; if (LayerCompositor.IsLayerLoaded(selectedLayer)) { layerCompositor.UnloadLayer(selectedLayer.id); } else { layerCompositor.LoadLayer(selectedLayer.id); } } } if (GUILayout.Button("Refresh")) { LayerCompositor.RefreshLayers(null, layerCompositor.Layers, true, layerCompositor.gameObject.scene); } } }
private void OnEnable() { LayerCompositor layerCompositor = (LayerCompositor)target; layersList = new ReorderableList(serializedObject, serializedObject.FindProperty(layersListName), true, true, true, true); layersList.drawHeaderCallback = (Rect rect) => { BuildRowOfColumns(rect, true); EditorGUI.LabelField(rect, new GUIContent("Layer index and Identifier", "Layer data. The Id is used at runtime to selectively Load/Unload a layer. Autoload specifies if the layer autoloads at runtime. Active constrols if the layer root objects are active after loading. Finally, provide a reference to a Unity scene.")); EditorGUI.LabelField(rect3, new GUIContent("Autoload")); EditorGUI.LabelField(rect4, new GUIContent("Active")); EditorGUI.LabelField(rect5, new GUIContent("Scene")); }; layersList.drawElementBackgroundCallback = (Rect rect, int index, bool isActive, bool isFocused) => { if ((layerCompositor.Layers == null) || (layerCompositor.Layers.Length == 0)) { return; } Texture2D bgTex = new Texture2D(1, 1); Color bgCol; LayerCompositor.Layer selectedLayer = layerCompositor.Layers[index]; bgCol = (LayerCompositor.IsLayerLoaded(selectedLayer) ? greenTint : redTint); if (isActive) { bgCol += highlightTint; } bgTex.SetPixel(0, 0, bgCol); bgTex.Apply(); GUI.DrawTexture(rect, bgTex as Texture); }; layersList.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => { EditorGUI.BeginChangeCheck(); SerializedProperty element = layersList.serializedProperty.GetArrayElementAtIndex(index); { BuildRowOfColumns(rect, false); GUIContent layerIdx = new GUIContent(index.ToString(), "A layer ID."); EditorGUI.LabelField(rect1, layerIdx); EditorGUI.PropertyField(rect2, element.FindPropertyRelative(nameof(LayerCompositor.Layer.id)), GUIContent.none); EditorGUI.PropertyField(rect3, element.FindPropertyRelative(nameof(LayerCompositor.Layer.autoload)), GUIContent.none); EditorGUI.PropertyField(rect4, element.FindPropertyRelative(nameof(LayerCompositor.Layer.loadactive)), GUIContent.none); EditorGUI.PropertyField(rect5, element.FindPropertyRelative(nameof(LayerCompositor.Layer.scene)), GUIContent.none); } if (EditorGUI.EndChangeCheck()) { LayerCompositor.Layer[] previousLayers = layerCompositor.Layers.Clone() as LayerCompositor.Layer[]; serializedObject.ApplyModifiedProperties(); LayerCompositor.RefreshLayers(previousLayers, layerCompositor.Layers, true, layerCompositor.gameObject.scene); } }; layersList.onAddCallback = (ReorderableList list) => { ReorderableList.defaultBehaviours.DoAddButton(list); list.serializedProperty.serializedObject.ApplyModifiedProperties(); LayerCompositor.Layer newLayer = layerCompositor.Layers[layerCompositor.Layers.Length - 1]; newLayer.id = "NoID"; newLayer.autoload = true; newLayer.loadactive = true; }; layersList.onRemoveCallback = (ReorderableList list) => { LayerCompositor.Layer[] previousLayers = layerCompositor.Layers.Clone() as LayerCompositor.Layer[]; ReorderableList.defaultBehaviours.DoRemoveButton(list); list.serializedProperty.serializedObject.ApplyModifiedProperties(); LayerCompositor.RefreshLayers(previousLayers, layerCompositor.Layers, true, layerCompositor.gameObject.scene); Repaint(); // removes Refresh when no layers remain }; }
private static bool LayerCompositorContainsParentScene(LayerCompositor layerCompositor) { return(Array.Exists(layerCompositor.Layers, x => x.scene == layerCompositor.gameObject.scene.path)); }