ScriptからSortingLayerを追加する


オレオレライブラリ、と言うかオレオレ開発環境を構築する上で、SortingLayerを自動的に設定したい場合が有ります。
そのための手順を調べたのでメモしておきます。

先に参考資料を貼っておきます

↑の記事にあるコードと、コメントにある修正部分を参照してメソッドを用意します

SettingWindow.csの一部
        /// <summary>
        /// SortingLayerの準備
        /// </summary>
        private static void SetupSortingLayer()
        {
            string[] sortingLayerNames = {"UI","SystemUI"};//←追加したいSortingLayerをご自由に
            foreach (var sortingLayerName in sortingLayerNames)
            {
                CreateSortingLayer(sortingLayerName);
            }            
        }

        /// <summary>
        /// SoringLayerを追加
        /// </summary>
        /// <param name="layerName">追加したいSortingLayerの名前</param>
        private static void CreateSortingLayer(string layerName)
        {
            var serializedObject = new SerializedObject(AssetDatabase.LoadMainAssetAtPath("ProjectSettings/TagManager.asset"));
            var sortingLayers = serializedObject.FindProperty("m_SortingLayers");
            for (var i = 0; i < sortingLayers.arraySize; i++)
            {
                if (sortingLayers.GetArrayElementAtIndex(i).FindPropertyRelative("name").stringValue.Equals(layerName))
                {
                    Debug.LogWarning($"Already Exists SortingLayer! name:{layerName}");
                    return;
                }
            }

            sortingLayers.InsertArrayElementAtIndex(sortingLayers.arraySize);
            var newLayer = sortingLayers.GetArrayElementAtIndex(sortingLayers.arraySize - 1);
            newLayer.FindPropertyRelative("name").stringValue = layerName;
            newLayer.FindPropertyRelative("uniqueID").intValue = (int)System.DateTime.Now.Ticks;
            serializedObject.ApplyModifiedProperties();
        }

という事でSerializedObject経由でFindPropertyを使って設定できるようです。
uniqueIDの設定方法が少々癖があるっぽいですね。
上記コードは参考資料のコメントのまま記載しましたが、
オレオレライブラリ内でSortingLayerを継続利用したい場合はuniqueIDを名前とワンセットで揃えておいた方が良いかもしれませんね。