Решил сфокусироваться временно на движковом рендере. На данный момент я могу 100% рисовать текстурки, чего в принципе достаточно для большинства задач Основные цели, который я поставил для себя на данный момент - это

  1. Отрисовка текстур [v]
  2. Отрисовка текста [ ]
  3. Взаимодействие с клавиатурой мышью [ ]
  4. Работающие окна [ ]

В принципе текстур и текста достаточно, взаимодействие с мышью и клавиатурой можно делать через перехват WndProc

Поэтому приоритет - отрисовка текста. Этим и займусь

К сожалению, отрисовка текста требует работы с GuiStyle классом. К счастью, он в игре присутствует Ещё у нас есть класс GUISkin, который, судя по всему, содержит набор стилей для стандартных компонентов. Удобно, только нам нужен хотя бы один инстанс GUISkin. Возможно static GUISkin current не NULL?

Отбой. Там NULL. Блять. Ок, попробуем другой дефолтный скин ms_Error Блять. И там NULL :(

Окей. Есть GUIUtility.GetDefaultSkin(). Попробуем его? Победа. Там не NULL

Теперь нужно понять, как нам правильно использовать GuiStyle в нём, чтобы отрисовать текст Допустим мы создаём текст. Порядок вызова (под капотом)

GUI.Label(Rect, string); // Convert string to GUIContent
GUI.Label(Rect, GUIContent, GUIStyle);
GUI.DoLabel(Rect, GUIContent, GUIStyle);

GUIStyle.draw(Rect, GUIContent, bool, bool, bool, bool);
->Draw->InternalDraw

Таким образом нам нужно

GUIStyle, Rect, GUIContent

Первый у нас есть. Второй мы можем сделать тривиально. Как получить GUIContent?

Вызывается GUIContent.Temp(), у которого есть перегрузка для строк, текстур, строк с текстурами. И он возвращает GUIContent Но проблема в том, что сам GUIContent в SCP:SL есть, а вот метода Temp - нет Зато у нас есть GUIContent.none, который статический. Вот только вопрос. Не NULL ли там? НЕ NULL! Отлично

Теперь дело за малым. Вызвать у него set_text, передать туда строку и отрисовать

Ага. Вскрылась другая неприятность. Я байпасил проверку на “Окно”, а оно, видимо нужно. Потому что в нём должно быть состояние GUIState. Оно нам тоже нужно Хмм. Думаю надо подумать, как создать окно. Чтобы без костылей. Их итак много

Вроде бы в GuiManager + 0x10 есть GuiState? А. Похуй. Вроде бы Internal_... функции сами State получают из какого-то глобального массива. Надеюсь, что он не пустой, конечно) Там же есть какой-то EternalGUIState, надеюсь это он

Ага. Краша нет, но и контент не отрисовывается. Понял. Первый параметр - это не SCRIPTABLE OBJECT! ДА УРА