Дамп ресурсов из игры Unity в файл - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь создать функцию, которая создает дамп всех данных о ресурсах в игре Unity в файл и может выводить видео, аудио, имена сценариев и изображения на экране из текущей загруженной сцены.

Я застрял при попытке сделать то же самое для данных шейдера, таких как текстуры и матрицы, векторы и значения типа int и float. Я знаю, что могу получить это образование с помощью функций Material.GetXXX.

Например, в настоящее время я могу получить основной Texture из стандартного шейдера, который имеет свойство типа текстуры с именем _MainTex с помощью:

Material mat = gameObject.GetComponent<MeshRenderer>().material;
Texture mat1Tex = mat.GetTexture("_MainTex");
SaveTex(mat1Tex);

Проблема заключается в том, что мне нужно знать имена свойств и их тип, например Текстура, Матрица, Плавающее, Цвет и т. Д., Прежде чем я смогу получить их значения во время выполнения

Я ожидаю, что многие шейдеры из сторонних источников будут в проекте, и было бы сложно вручную просмотреть каждый шейдер, скопировать имена их свойств и тип, чтобы я мог получить данные.

Есть ли способ получить свойство шейдера и тип, необходимый для получения их значений с помощью функций Material.GetXXX? Если это невозможно, есть ли способ выгрузить данные шейдера по отдельности?

Примечание

Это не функция сохранения, и я не ищу способ сохранить и загрузить состояние игры. Этот плагин используется для анализа и устранения неполадок в играх Unity.

1 Ответ

0 голосов
/ 31 октября 2018

Использование ShaderUtil.

  • ShaderUtil.GetPropertyCount позволит вам перебирать каждый свойство.

  • ShaderUtil.GetPropertyName позволит вам получить имя свойства для использовать в таких методах, как GetTexture.

  • ShaderUtil.GetPropertyType позволит вам вызывать надлежащие методы для обрабатывать имущество, на котором вы находитесь в настоящее время.

Например:

Shader shader = mat.shader;
for (int i = 0 ; i < ShaderUtil.GetPropertyCount(shader) ; i++) {
    String propertyName = ShaderUtil.GetPropertyName(shader,i);
    ShaderUtil.ShaderPropertyType propertyType = ShaderUtil.GetPropertyType(shader,i);

    switch(propertyType) {
        case ShaderUtil.ShaderPropertyType.TexEnv: {
            Texture tex = mat.GetTexture(propertyName);
            SaveTex(tex);
        } break;

        default: {
            Debug.Log(propertyName + " is not a texture.");
        } break;
    }
}

Это из пространства имен UnityEditor, что означает, что его можно использовать только в редакторе. Это все еще хорошо. Вам просто нужно определить, когда нажата кнопка сборки, затем получить свойства и типы с помощью ShaderUtil, а затем сохранить в папке ресурсов, например this .

...