Необходимо поменять материал на объекте скриптом

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Необходимо поменять материал на объекте скриптом

Сообщение Fkleed 16 окт 2012, 17:42

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

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

Нужно иметь возможность добавить материал из Asseta прямо во время выполнения скрипта, причем ссылка на материал - текстовая. Перебор GetObjectsByTypeIncludingAssets тоже не работает, как надо, так как имеется по 3-4 материала с одинаковым названием, но разными путями. Я понимаю, что можно переназвать все материалы, но проект очень большой.

Есть и обратная сторона - как получить полный путь до ассетового материала. Если использовать Material.name - выдается только название, а хотелось бы путь. Что-то типа Material.FullPath.

Кстати, вопрос не только в материале, есть множество ссылок, которые задаются в Inspector, которые тоже невозможно достать в текстовом виде (например у Cube в MeshFilter назначен Mesh = Cube. Если сделать GetValue , то получим Объект типа Mesh, а не ссылку на Asset).

Как-то сумбурно объяснил((

Итого: Хочу получать ссылки на Asset и применять их к свойствам объектов, но не в виде объектов, а в виде ссылок (совсем в идеале - текстовых, типа "Assets\Materials\Wall\Brick_material")

В общем -то хотелось бы узнать, возможно ли это в принципе, и если возможно, то как? [curved_hands]
Fkleed
UNец
 
Сообщения: 5
Зарегистрирован: 15 окт 2012, 09:52

Re: Необходимо поменять материал на объекте скриптом

Сообщение WhiteDevil 16 окт 2012, 18:22

http://docs.unity3d.com/Documentation/S ... urces.html

создай папку Resources и грузи оттуда текстуры (или материалы) динамически
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: Необходимо поменять материал на объекте скриптом

Сообщение Fkleed 17 окт 2012, 09:16

Спасибо, вполне подходит. Только остается вопрос о получении ссылки на ресурс. Ведь в папке Resourses тоже могут быть(и будут) подпапки. Одним именем ресурса не обойтись...У меня в проекте (читай не в моем проекте) по крайней мере четыре разных glass а уж сколько metall - не считал.
Fkleed
UNец
 
Сообщения: 5
Зарегистрирован: 15 окт 2012, 09:52

Re: Необходимо поменять материал на объекте скриптом

Сообщение KBEP 17 окт 2012, 22:02

это не проблема, просто передавай функции Resources.Load полный путь до ассета
Аватара пользователя
KBEP
Старожил
 
Сообщения: 598
Зарегистрирован: 24 сен 2012, 23:23
Откуда: Калининград, СПб, Северодвинск

Re: Необходимо поменять материал на объекте скриптом

Сообщение Fkleed 18 окт 2012, 09:22

Это действительно не проблема, если не учесть, что этот путь хорошо бы сохранить из любого объекта в текстовый файл. А на момент выгрузки надо как-то определить этот полный путь. То есть нужен не только Material.Name но и (гипотетический Material.AssetPath).
Fkleed
UNец
 
Сообщения: 5
Зарегистрирован: 15 окт 2012, 09:52

Re: Необходимо поменять материал на объекте скриптом

Сообщение waruiyume 18 окт 2012, 10:07

AssetDatabase.GetAssetPath
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Необходимо поменять материал на объекте скриптом

Сообщение Fkleed 18 окт 2012, 11:36

О! То, что надо! Спасибо огромное всем))

Ух, накодю...накожу...обкодируюсь))
Fkleed
UNец
 
Сообщения: 5
Зарегистрирован: 15 окт 2012, 09:52

Re: Необходимо поменять материал на объекте скриптом

Сообщение Fkleed 22 окт 2012, 11:29

Кстати, если кому интересно:


Синтаксис:
Используется csharp
Component a=rect.GetComponent<MeshRenderer>();
                PropertyInfo z=a.GetType().GetProperty("sharedMaterials");
                Material[] k=(Material[])z.GetValue(a,null);
                string s=AssetDatabase.GetAssetPath(k[0].GetInstanceID());
                EditorUtility.DisplayDialog("",s,"Ok");
               
                dest.renderer.sharedMaterial=(Material)Resources.LoadAssetAtPath(s,typeof(Material));
 

//
rect и dest - объекты сцены. GameObject
Fkleed
UNец
 
Сообщения: 5
Зарегистрирован: 15 окт 2012, 09:52


Вернуться в Почемучка

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

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