Unity 6.3
0 онлайн 106 гостей 3 в системе
Вход
Ассеты и медиа Шаг 101 из 148

Изменение исходных ассетов из кода

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

Временная модификация

Модификации ассетов во время выполнения приложения обычно являются временными. Например, вы можете изменить компонент шейдера материала для персонажа, чтобы он представлял временное повышение непобедимости. Модификация шейдера в этом случае не является постоянной и не сохраняется при выходе из режима Play.

Следующий пример демонстрирует это путем изменения свойства shader компонента material:

using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    private Shader invincibleShader;

    void Start()
    {
        invincibleShader = Shader.Find("Specular");
    }

    public void StartInvincibility()
    {
        if (TryGetComponent<Renderer>(out Renderer renderer))
        {
            renderer.material.shader = invincibleShader;
        }
    }
}

При выходе из режима воспроизведения состояние Material сбросить в то состояние, в котором он находился до входа в режим Игры. renderer.material автоматически инстанционирует материал и возвращает экземпляр. Этот экземпляр одновременно и автоматически применяется к рендеру, поэтому любые изменения, которые вы делаете, не являются постоянными.

Примечание: Если вы объявите открытую переменную со ссылкой на материал и будете изменять её, а не renderer.material.shader члена класса напрямую, вы не получите автоматического создания экземпляра перед применением изменений.

Постоянная модификация

Важно: Метод, представленный здесь, изменяет фактические файлы исходных ассетов, используемые в Unity. Вы не можете отменить эти изменения. Используйте их с осторожностью.

Чтобы избежать сброса материала при выходе из режима воспроизведения, вы можете использовать Renderer.sharedMaterial. Свойство sharedMaterial возвращает фактический ассет, используемый рендером.

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

using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    private Shader invincibleShader;

    void Start()
    {
        invincibleShader = Shader.Find("Specular");
    }

    public void StartInvincibility()
    {
        if (TryGetComponent<Renderer>(out Renderer renderer))
        {
            renderer.sharedMaterial.shader = invincibleShader;
        }
    }
}

Применимые классы и свойства

Описанная выше схема программирования использования локальных или общих свойств для временных или постоянных изменений соответственно применяется к следующим типам ассетов:

Тип ассета Свойство, подлежащее временным изменениям Свойство, подлежащее постоянному изменению
Материал Renderer.material Renderer.sharedMaterial
Сетка MeshFilter.mesh MeshFilter.sharedMesh
Физика материалов Collider.material Collider.sharedMaterial

Примечание: если вы объявите открытую переменную любого из этих классов и будете изменять ассет через неё, а не через соответствующий член класса, вы не получите автоматического создания экземпляра перед применением изменений.

Ассеты, которые автоматически не экзитируются

При изменении следующие типы ассетов автоматически не экземплярируются:

Любые изменения, вносимые в эти ассеты из кода, всегда являются постоянными и не могут быть отменены. Например, если вы изменяете высоту местности или пиксели файла текстуры из кода, вам придется учитывать инстанционирование и назначение значений вручную.

Дополнительные ресурсы