private void CreateLayerList()
        {
            _layerList.Clear();

            for (int i = 0; i < sortingLayerNames.Length; i++)
            {
                SortingLayerInfo info = new SortingLayerInfo();

                info.name = sortingLayerNames[i];

                info.layerID = sortingLayersProp.GetArrayElementAtIndex(i).FindPropertyRelative("uniqueID").intValue;

                _layerList.Add(info);
            }

            foreach (SortingLayerInfo sortingLayerInfo in _layerList)
            {
                sortingLayerInfo.rendererList = new List <Renderer>();

                foreach (Renderer sceneRenderer in FindObjectsOfType <Renderer>())
                {
                    if (sceneRenderer.sortingLayerID == sortingLayerInfo.layerID)
                    {
                        sortingLayerInfo.rendererList.Add(sceneRenderer);

                        sceneRenderer.sortingOrder = sortingLayerInfo.rendererList.IndexOf(sceneRenderer);
                    }
                }

                sortingLayerInfo._reorderableRendererList = new ReorderableList(sortingLayerInfo.rendererList,
                                                                                typeof(Renderer), true, true, false, false);

                _reorderableLayerList = new ReorderableList(_layerList, typeof(String), true, true, true, true);
            }

            currentSelectedRenderer = null;

            currentRenderers.Clear();

            foreach (Renderer renderer in FindObjectsOfType <Renderer>())
            {
                currentRenderers.Add(renderer);
            }
        }
        private void CreateNewLayer()
        {
            int newID = 0;

            string newLayerName = "";

            bool foundID = false;

            sortingLayersProp.InsertArrayElementAtIndex(sortingLayersProp.arraySize);

            for (int i = 0; i < sortingLayersProp.arraySize; i++)
            {
                for (int j = 0; j < sortingLayersProp.arraySize; j++)
                {
                    if (i == sortingLayersProp.GetArrayElementAtIndex(j).FindPropertyRelative("uniqueID").intValue)
                    {
                        foundID = false;

                        break;
                    }

                    else
                    {
                        foundID = true;
                    }
                }

                if (foundID)
                {
                    newID = i;

                    newLayerName = "New Layer (" + newID + ")";

                    break;
                }
            }

            sortingLayersProp.GetArrayElementAtIndex(sortingLayersProp.arraySize - 1)
            .FindPropertyRelative("name")
            .stringValue = newLayerName;

            sortingLayersProp.GetArrayElementAtIndex(sortingLayersProp.arraySize - 1)
            .FindPropertyRelative("uniqueID")
            .intValue = newID;

            tagManager.ApplyModifiedProperties();

            sortingLayersProperty = internalEditorUtilityType.GetProperty("sortingLayerNames",
                                                                          BindingFlags.Static | BindingFlags.NonPublic);

            sortingLayerNames = (string[])sortingLayersProperty.GetValue(null, new object[0]);

            SortingLayerInfo newLayer = new SortingLayerInfo();

            newLayer.name = newLayerName;

            newLayer.rendererList = new List <Renderer>();

            newLayer.layerID = newID;

            newLayer._reorderableRendererList = new ReorderableList(newLayer.rendererList, typeof(Renderer), true, true,
                                                                    false, false);

            _layerList.Add(newLayer);

            _layerNames.Add(newLayerName);

            _layerLabelNames.Add(newLayerName);

            _reorderableLayerList = new ReorderableList(_layerList, typeof(String), true, true, true, true);

            currentLayerSelected = 0;

            foreach (SortingLayerInfo layerinfo in _layerList)
            {
                layerinfo.enumIndex = 0;
            }
        }
        private void OnEnable()
        {
            tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);

            sortingLayersProp = tagManager.FindProperty("m_SortingLayers");

            CreateLayerNames();

            internalEditorUtilityType = typeof(InternalEditorUtility);

            sortingLayersProperty = internalEditorUtilityType.GetProperty("sortingLayerNames",
                                                                          BindingFlags.Static | BindingFlags.NonPublic);

            sortingLayerNames = (string[])sortingLayersProperty.GetValue(null, new object[0]);

            _layerList.Clear();

            for (int i = 0; i < sortingLayerNames.Length; i++)
            {
                SortingLayerInfo info = new SortingLayerInfo();

                info.name = sortingLayerNames[i];

                info.layerID = sortingLayersProp.GetArrayElementAtIndex(i).FindPropertyRelative("uniqueID").intValue;

                _layerList.Add(info);
            }

            foreach (SortingLayerInfo sortingLayerInfo in _layerList)
            {
                sortingLayerInfo.rendererList = new List <Renderer>();

                foreach (Renderer sceneRenderer in FindObjectsOfType <Renderer>())
                {
                    if (sceneRenderer.GetType().Name != "MeshRenderer" || sceneRenderer.GetComponent <TextMesh>() != null)
                    {
                        if (sceneRenderer.sortingLayerID == sortingLayerInfo.layerID)
                        {
                            sortingLayerInfo.rendererList.Add(sceneRenderer);

                            sceneRenderer.sortingOrder = sortingLayerInfo.rendererList.IndexOf(sceneRenderer);
                        }
                    }
                }

                sortingLayerInfo._reorderableRendererList = new ReorderableList(sortingLayerInfo.rendererList,
                                                                                typeof(Renderer), true, true, false, false);

                _reorderableLayerList = new ReorderableList(_layerList, typeof(String), true, true, true, true);
            }

            currentSelectedRenderer = null;

            foreach (Renderer renderer in FindObjectsOfType <Renderer>())
            {
                if (!(renderer is MeshRenderer) || renderer.GetComponent <TextMesh>() != null)
                {
                    currentRenderers.Add(renderer);
                }
            }
        }