Процедурные текстуры в edit mode

Раздел, посвящённый всему, что связано с программированием для Редактора Юнити. Скрипты Редактора, Wizards и прочее.

Процедурные текстуры в edit mode

Сообщение Cid 27 фев 2011, 13:08

Я использую процедурные текстуры в скрипте, работающем в edit mode (редактор карты уровня).
Текстуру заменяю вызовом
renderer.materials[1].mainTexture = new_tex;// где new_tex - объект Texture2D

Текстура заменяется исправно, но выполнение этой строчки сопровождается сообщением об ошибке:
Instantiating material due to calling renderer.material during edit mode. This will leak materials into the scene. You most likely want to use renderer.sharedMaterial instead.
Причем ошибку вызывает любой доступ к renderer.materials, даже на чтение.
Texture saved_tex = renderer.materials[1].mainTexture;
При использовании renderer.sharedMaterial текстура заменяется на всех копиях префаба в сцене, а мне нужно задать собственную текстуру каждой копии.
Последний раз редактировалось Cid 03 мар 2011, 15:30, всего редактировалось 1 раз.
Cid
UNец
 
Сообщения: 17
Зарегистрирован: 29 янв 2011, 20:51
Откуда: Москва

Re: Процедурные текстуры в edit mode

Сообщение Paul Siberdt 27 фев 2011, 13:11

А если Texture2D myTex = new Texture2D(.....);?
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Процедурные текстуры в edit mode

Сообщение Cid 27 фев 2011, 13:50

А зачем Texture2D myTex = new Texture2D(.....);?
Мне же нужно сохранить ссылку, а не скопировать объект.
Кроме того, ошибку вызывает даже такая строчка
Texture2D t = renderer.materials[1].mainTexture as Texture2D;
Главное, что при нормальном запуске (game mode) скрипт работает, а в edit mode тоже работает, но с генерацией ошибки.
Cid
UNец
 
Сообщения: 17
Зарегистрирован: 29 янв 2011, 20:51
Откуда: Москва

Re: Процедурные текстуры в edit mode

Сообщение Cid 02 мар 2011, 12:28

Неужели только у меня такая проблема?
Cid
UNец
 
Сообщения: 17
Зарегистрирован: 29 янв 2011, 20:51
Откуда: Москва

Re: Процедурные текстуры в edit mode

Сообщение DbIMok 02 мар 2011, 13:29

на самом деле это не проблема. так, предупреждение. мы делаем так:
Код: Выделить всё
go.renderer.sharedMaterial = mat;
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.8k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Процедурные текстуры в edit mode

Сообщение Cid 03 мар 2011, 00:01

Вызов
renderer.sharedMaterials[Settings.FaceMaterialIndex].mainTexture = tex;
заменяет текстуру на всех копиях префаба в сцене, а мне нужно задать собственную текстуру каждой копии.

Попробовал еще вот так
Material new_mat = new Material(renderer.sharedMaterials[Settings.FaceMaterialIndex]);
new_mat.mainTexture = tex;
renderer.materials[Settings.FaceMaterialIndex].CopyPropertiesFromMaterial(new_mat);

и вот так
Material new_mat = new Material(renderer.sharedMaterials[Settings.FaceMaterialIndex]);
new_mat.mainTexture = tex;
renderer.sharedMaterials[Settings.FaceMaterialIndex].CopyPropertiesFromMaterial(new_mat);

Не помогло.

А материалы при использовании renderer.material действительно утекают (leak).
Об этом сообщает сборщик мусора Unity.
Не смертельно, конечно, но неприятно.
Последний раз редактировалось Cid 03 мар 2011, 15:29, всего редактировалось 1 раз.
Cid
UNец
 
Сообщения: 17
Зарегистрирован: 29 янв 2011, 20:51
Откуда: Москва

Re: Процедурные текстуры в edit mode

Сообщение DbIMok 03 мар 2011, 00:41

не пойму, что у вас за проблема
Синтаксис:
Используется csharp
        Material mat = new Material(Shader.Find("Simple/Transparent"));
        mat.name = pngName + "_mat";
        mat.mainTexture = tex;
        go.renderer.sharedMaterial = mat;

вот так у нас работает без ошибок
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.8k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Процедурные текстуры в edit mode

Сообщение Cid 03 мар 2011, 02:14

Так я же пишу, что
renderer.sharedMaterial = mat;
заменяет текстуру на ВСЕХ копиях префаба в сцене, а мне нужно задать собственную текстуру каждой копии, т.е. чтобы текстуры у копий были разными.
Cid
UNец
 
Сообщения: 17
Зарегистрирован: 29 янв 2011, 20:51
Откуда: Москва

Re: Процедурные текстуры в edit mode

Сообщение DbIMok 03 мар 2011, 03:31

так замените sharedMaterial на material
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.8k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Процедурные текстуры в edit mode

Сообщение Cid 03 мар 2011, 14:04

Так и делаю: приходится мириться с постоянным утеканием объектов Material и Texture2D.
Cid
UNец
 
Сообщения: 17
Зарегистрирован: 29 янв 2011, 20:51
Откуда: Москва

Re: Процедурные текстуры в edit mode

Сообщение Paha 04 ноя 2011, 16:15

Похожая проблема. Есть простенький шейдер - текстура перемножается на цвет. Есть много объектов на сцене с одной текстурой, но у которых надо выставить разный цвет.
Смена цвета "напрямую" в редакторе меняет св-ва sharedMaterial и перекрашивает все объекты.
Был написан компонент, который содержит color и инспектор, который назначает этот цвет в material.color
И сразу полезли
"Instantiating material due to calling renderer.material during edit mode. This will leak materials into the scene. You most likely want to use renderer.sharedMaterial instead."
Unity ругается справедливо, но это не error, а скорее warning. Ну да, материал был инстанцирован для объекта, так и надо. К тому же ругается только один раз.
Paha
UNец
 
Сообщения: 30
Зарегистрирован: 01 авг 2011, 17:38

Re: Процедурные текстуры в edit mode

Сообщение lPestl 08 янв 2013, 10:26

Cid писал(а):При использовании renderer.sharedMaterial текстура заменяется на всех копиях префаба в сцене, а мне нужно задать собственную текстуру каждой копии.


Пока могу только посочувствовать с этой проблемой. Сам сейчас с ней же мучаюсь. Как найду решение - отпишу обязательно!
Аватара пользователя
lPestl
UNец
 
Сообщения: 37
Зарегистрирован: 10 окт 2012, 08:50

Re: Процедурные текстуры в edit mode

Сообщение lPestl 08 янв 2013, 10:27

DbIMok писал(а):так замените sharedMaterial на material

А над Вашим сообщением посмеялся отдуши)))
Аватара пользователя
lPestl
UNец
 
Сообщения: 37
Зарегистрирован: 10 окт 2012, 08:50

Re: Процедурные текстуры в edit mode

Сообщение gturk 22 янв 2013, 03:06

как по мне дак юня в этом случае совершенно справедливо ругается.
И для решения проблемы нужно не писать костыли, а реально создавать новые материалы (хоть ручками, хоть кодом).
Ведь при изменении цвета в любом случае создается новый материал
Аватара пользователя
gturk
UNITрон
 
Сообщения: 239
Зарегистрирован: 01 апр 2012, 18:49

Re: Процедурные текстуры в edit mode

Сообщение Nicloay 22 янв 2013, 05:08

Я с этим наработался и скажу, что в editor mode как уже Дымок ответил можно менять ТОЛЬКО sharedMaterial.
и понятно что sharedMaterial поменяет текстуру для всех инстансов.
Когда мне нужно было создать несколько разных тектсур на разные объекты, я для каждого инстанса делал отдельный мешь.


По поводу как насмешили, попробуйте офф справку по material на юнити почитать, там описано и про editor и про sharedTexture.
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт


Вернуться в Editor

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1