Примечание: если вы собираетесь вызывать функцию каждый OnGUI() event, то рекомендую разбить ее на две части, и хранить Hashtable в переменной класса, чтобы каждый раз не терять время на выяснении кучи типов и полей.
Синтаксис:
Используется csharp
/// <summary>
/// Функция определяет самое верхнее окно из списка
/// </summary>
/// <returns>
/// ID самого верхнего окна
/// </returns>
/// <param name='id_list'>
/// Список ID окон
/// </param>
int GetTopmostId(List<int> id_list)
{
//Получаем тип GUI
Type guiType = typeof(GUI);
//Получаем тип списка окон
Type windowListType = guiType.Assembly.GetType("UnityEngine.GUI+_WindowList");
//Получаем поле instance списка, в котором хранится его экземпляр (это синглтон)
FieldInfo windowListInstanceField = windowListType.GetField("instance", BindingFlags.NonPublic | BindingFlags.Static);
//Получаем значение поля, теперь нас есть экземпляр списка
object windowListInstance = windowListInstanceField.GetValue(null);
//Получаем поле спика с окнами
FieldInfo windowsField = windowListType.GetField("windows", BindingFlags.NonPublic | BindingFlags.Instance);
//Получаем сам список окон типа Hashtable
Hashtable hashtable = windowsField.GetValue(windowListInstance) as Hashtable;
//Осталось перебрать его и найти верхнее
int min = -1;
int window_id = -1;
foreach(DictionaryEntry entry in hashtable)
{
int key = (int)entry.Key;
if (id_list.Contains(key)) //сравнивать только если окно в нашем списке
{
//получаем значение поля глубина у окна
int depth = (int)entry.Value.GetType().GetField("depth", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(entry.Value);
if (min < 0 || depth < min)
{
min = depth;
window_id = key;
}
}
}
return window_id;
}
/// Функция определяет самое верхнее окно из списка
/// </summary>
/// <returns>
/// ID самого верхнего окна
/// </returns>
/// <param name='id_list'>
/// Список ID окон
/// </param>
int GetTopmostId(List<int> id_list)
{
//Получаем тип GUI
Type guiType = typeof(GUI);
//Получаем тип списка окон
Type windowListType = guiType.Assembly.GetType("UnityEngine.GUI+_WindowList");
//Получаем поле instance списка, в котором хранится его экземпляр (это синглтон)
FieldInfo windowListInstanceField = windowListType.GetField("instance", BindingFlags.NonPublic | BindingFlags.Static);
//Получаем значение поля, теперь нас есть экземпляр списка
object windowListInstance = windowListInstanceField.GetValue(null);
//Получаем поле спика с окнами
FieldInfo windowsField = windowListType.GetField("windows", BindingFlags.NonPublic | BindingFlags.Instance);
//Получаем сам список окон типа Hashtable
Hashtable hashtable = windowsField.GetValue(windowListInstance) as Hashtable;
//Осталось перебрать его и найти верхнее
int min = -1;
int window_id = -1;
foreach(DictionaryEntry entry in hashtable)
{
int key = (int)entry.Key;
if (id_list.Contains(key)) //сравнивать только если окно в нашем списке
{
//получаем значение поля глубина у окна
int depth = (int)entry.Value.GetType().GetField("depth", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(entry.Value);
if (min < 0 || depth < min)
{
min = depth;
window_id = key;
}
}
}
return window_id;
}