Получить материал из активов - PullRequest
2 голосов
/ 25 февраля 2020

В своем проекте Unity я пытаюсь выделить какой-то объект каким-то самодельным материалом. К сожалению, коды, которые я нашел, не работают.

Следующий скрипт добавляется к трем различным объектам GameObject:

Renderer[] rend_ThisObject;
Material white, red;

void Start()
{
    // I tried the following two code parts:
    white = Resources.Load<Material>("White");
    white = Resources.Load("Material/White.mat", typeof(Material)) as Material;

    red = Resources.Load<Material>("Red");
    red = Resources.Load("Material/Red.mat", typeof(Material)) as Material;           
}

void Update()
{
    foreach (var child in rend_ThisObject)
    {
        child.material = blinkObject ? white : red;
    }
}

Если я запускаю проект, игровые объекты со скриптом отображаются розовым цветом и отображаются не мигает.

Если я изменю Material white, red; на public Material white, red;, он будет работать нормально. Что я должен изменить, чтобы получить материалы из папки assets / resources / material?

1 Ответ

6 голосов
/ 25 февраля 2020

В общем:

От собственного Unity Лучшая практика для Resources:

Не используйте.

Что не так с простым использованием ваших полей public и настройкой их с помощью инспектора?

Если вам не нравится, что они public, тогда просто используйте [SerializeField]

[SerializeField] private Material white;
[SerializeField] private Material red;

и назначьте их через инспектора!


Тогда предположим, что ваш путь не assets/resources/material, а Assets/Resources/Material см. Resources.Load!

Вы пытались

white = Resources.Load<Material>("White");
white = Resources.Load("Material/White.mat", typeof(Material)) as Material;

Оба не правы:

  • Первый раз это отсутствует путь к папке

    Путь относительно любой папки с именем Resources внутри папки Assets вашего проекта

  • второй имеет слишком большое окончание файла.

    Примечание : Расширения должны быть опущены.

Таким образом, для загрузки файла с путем

Assets/Resources/Material/White.mat

это должно быть просто

white = Resources.Load<Material>("Material/White");

Теперь еще одно общее замечание:

Делать этот миг на в кадре не является идеей бога!

Скорее используйте некоторую задержку, например,

// adjust via the Inspector as well
[Tooltip("Color changes per second")]
[SerializeField] private float blinkFrequency = 2f;

private float timer;

void Update()
{
    timer -= Time.deltaTime;
    if(timer <= 0)
    {
        timer = 1 / blinkFrequency;

        blinkObject = !blinkObject;
        foreach (var child in rend_ThisObject)
        {
            child.material = blinkObject ? white : red;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...