/* * Copyright (c) 2014, Nick Gravelyn. * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * * 3. This notice may not be removed or altered from any source * distribution. */ using UnityEngine; using UnityEditor; using System; using System.Reflection; namespace TMPro { // Helpers used by the different sorting layer classes. public static class SortingLayerHelper { private static Type _utilityType; private static PropertyInfo _sortingLayerNamesProperty; private static MethodInfo _getSortingLayerUserIdMethod; static SortingLayerHelper() { _utilityType = Type.GetType("UnityEditorInternal.InternalEditorUtility, UnityEditor"); _sortingLayerNamesProperty = _utilityType.GetProperty("sortingLayerNames", BindingFlags.Static | BindingFlags.NonPublic); _getSortingLayerUserIdMethod = _utilityType.GetMethod("GetSortingLayerUniqueID", BindingFlags.Static | BindingFlags.NonPublic); } // Gets an array of sorting layer names. // Since this uses reflection, callers should check for 'null' which will be returned if the reflection fails. public static string[] sortingLayerNames { get { if (_sortingLayerNamesProperty == null) { return null; } return _sortingLayerNamesProperty.GetValue(null, null) as string[]; } } // Given the ID of a sorting layer, returns the sorting layer's name public static string GetSortingLayerNameFromID(int id) { string[] names = sortingLayerNames; if (names == null) { return null; } for (int i = 0; i < names.Length; i++) { if (GetSortingLayerIDForIndex(i) == id) { return names[i]; } } return null; } // Given the name of a sorting layer, returns the ID. public static int GetSortingLayerIDForName(string name) { string[] names = sortingLayerNames; if (names == null) { return 0; } return GetSortingLayerIDForIndex(Array.IndexOf(names, name)); } // Helper to convert from a sorting layer INDEX to a sorting layer ID. These are not the same thing. // IDs are based on the order in which layers were created and do not change when reordering the layers. // Thankfully there is a private helper we can call to get the ID for a layer given its index. public static int GetSortingLayerIDForIndex(int index) { if (_getSortingLayerUserIdMethod == null) { return 0; } return (int)_getSortingLayerUserIdMethod.Invoke(null, new object[] { index }); } } }