/*
|
|
* 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 });
|
|
}
|
|
}
|
|
}
|