Wizard : Список материалов, использующих одинаковую текстуру

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

Wizard : Список материалов, использующих одинаковую текстуру

Сообщение Neodrop 22 апр 2009, 12:16

Мега подгон сообществу! Делюсь, так уж и быть. Некоторым камрадам, с 6000 материалов в сцене, этот мой волшебник может сильно помочь. :ymparty:

Большая просьба, если кто-то затеется улучшить код, выкладывать версии тут, а не под подушку. :-w

Unity_GetMaterialsFromTexture_Wizard_from_Neodrop.png


(js) NeoMaterialSearch.js

Синтаксис:
Используется javascript
import System;
import System.IO;

class NeoMaterialSearch extends ScriptableWizard
{
        private static var startTex : Texture;
        private static var textureToSearch : Texture = Selection.activeObject as Texture;
       
        private var groupEnabled = false;
       
        private var showInspector = true;
        private static var materials : Array = new Array();
       
        private static var mainTexture = true;
        private static var bampTexture = true;
       
        private static var fileInfo : FileInfo[];
       
        @MenuItem("NeoTools/Textures/Get All Materials from Texture")
         static function CreateWizard ()
    {
        ScriptableWizard.DisplayWizard("Get All Materials from Texture", NeoMaterialSearch, "Find");
                var dir : DirectoryInfo = DirectoryInfo(Application.dataPath);
                fileInfo = dir.GetFiles("*.mat", SearchOption.AllDirectories);
    }
       
        function OnWizardUpdate()
        {
                textureToSearch = Selection.activeObject as Texture;
        }
       
        static function Search()
        {
                if (!textureToSearch) return;
                startTex = textureToSearch;
                materials.Clear();
                var mat : Material;
                var tex : Texture;
                var added = false;
                var fileUtil :FileUtil = new FileUtil();
                var path : int = Application.dataPath.length+1;
                for ( var file : FileInfo in fileInfo)
                {
                        mat = EditorUtility.FindAsset(file.ToString().Remove(0,path), Material);
                        if (mat)
                        {
                                if (mainTexture && mat.HasProperty("_MainTex"))
                                {              
                                        tex = mat.GetTexture("_MainTex");
                                        if (tex)
                                        {
                                                if (tex.name == textureToSearch.name)
                                                {
                                                        materials.Add(mat);
                                                        added = true;
                                                }
                                        }
                                }
                                if (bampTexture && mat.HasProperty("_BampMap"))
                                {              
                                        tex = mat.GetTexture("_BampMap");
                                        if (tex)
                                        {
                                                if (tex.name == textureToSearch.name && !added)
                                                {
                                                        materials.Add(mat);
                                                }
                                        }
                                }
                        }
                        added = false;
                        tex = null;
                }
        }
       
        function OnDestroy ()
    {
                textureToSearch = null;
                materials.Clear();
        }
       
        function OnGUI ()
        {
                DragAndDrop.AcceptDrag();
                showInspector = EditorGUI.InspectorTitlebar(Rect(0,0,512,50),showInspector,textureToSearch);
                if (!showInspector) return;
               
//              textureToSearch = Selection.activeObject as Texture;
                 
                GUILayout.BeginVertical();
                GUILayout.Space (55);
                GUILayout.Box (textureToSearch,GUILayout.MinWidth(256), GUILayout.MaxWidth(512), GUILayout.MinHeight(256), GUILayout.MaxHeight(512), GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true));
                GUILayout.EndVertical();
               
                EditorGUILayout.Separator();
               
                groupEnabled = EditorGUILayout.BeginToggleGroup ("Optional Settings", groupEnabled);
                EditorGUILayout.BeginHorizontal();
                mainTexture = EditorGUILayout.Toggle ("Find mine texture", mainTexture);
                bampTexture = EditorGUILayout.Toggle ("Find bamp map", bampTexture);
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.EndToggleGroup ();
               
                EditorGUILayout.Separator();
               
                textureToSearch = EditorGUILayout.ObjectField( GUIContent(textureToSearch),  textureToSearch, Texture,GUILayout.MinWidth(40), GUILayout.MaxWidth(512), GUILayout.MinHeight(40), GUILayout.MaxHeight(40), GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true));
                if (startTex != textureToSearch) Search();
               
                EditorGUILayout.BeginVertical();
                EditorGUILayout.Separator();
               

/*              if (GUILayout.Button("Search"))
                {
                        Search();
                } */

               
                if (materials.length > 0)
                {
                        EditorGUILayout.Separator();
                        GUILayout.BeginHorizontal();
                        GUILayout.Label("Total materials found : " + fileInfo.length);
                        GUILayout.Label(" and ");
                        GUILayout.Label("Materials with selected texture found : " + materials.length);
                       
                        GUILayout.EndHorizontal();
                       
                        EditorGUILayout.Separator();
                       
                        GUILayout.FlexibleSpace();
                       
                        var l : float = materials.length;
                        var mat : Material;
                        for (var i : int = 0; i < l; i++)
                        {
                                GUILayout.BeginHorizontal();
                                mat = materials[i];
                                EditorGUILayout.ObjectField(mat, Material);
                                if (i+1 < l)
                                {
                                        mat = materials[++i];
                                        EditorGUILayout.ObjectField(mat, Material);
                                }
                                GUILayout.EndHorizontal();
                        }
                }
               
                EditorGUILayout.EndVertical();
               
                EditorGUILayout.Separator();
               
                if(GUILayout.Button("Developed by Neodrop"))Application.OpenURL("http://www.unity3d.ru");
               
                EditorGUILayout.Separator();
               
                if (GUILayout.Button("Close this window")) Close();
        }

}
У вас нет доступа для просмотра вложений в этом сообщении.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Wizard : Список материалов, использующих одинаковую текстуру

Сообщение wild_r 22 апр 2009, 13:34

Большое спасибо, но лично мне оно поможет только с проверкой работы моего скрипта, т.к. у меня просто не хватает места в окне, чтобы отобразить все материалы, да и вручную их заменять...
wild_r
UNITрон
 
Сообщения: 220
Зарегистрирован: 16 апр 2009, 20:46
Откуда: Россия, Санкт - Петербург
  • ICQ

Re: Wizard : Список материалов, использующих одинаковую текстуру

Сообщение Neodrop 22 апр 2009, 13:40

Немного переписав скрипт не сложно сделать автозамену для выбранных материалов.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Wizard : Список материалов, использующих одинаковую текстуру

Сообщение wild_r 22 апр 2009, 13:47

А одинаковые материалы будут эдитором собираться в один? Т.е. файлы матриалов.
wild_r
UNITрон
 
Сообщения: 220
Зарегистрирован: 16 апр 2009, 20:46
Откуда: Россия, Санкт - Петербург
  • ICQ

Re: Wizard : Список материалов, использующих одинаковую текстуру

Сообщение Neodrop 22 апр 2009, 13:51

Можно написать дополнение к скрипту, которое заместит все выбранные материалы одним. Поставил галки и вуа-ля.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Wizard : Список материалов, использующих одинаковую текстуру

Сообщение Neodrop 22 апр 2009, 17:43

Кстати, wild_r, а сколько у тебя совпадающих материалов? Мне просто интересно. Сделай скрин? :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Wizard : Список материалов, использующих одинаковую текстуру

Сообщение wild_r 23 апр 2009, 10:01

Самый хронический случай:
http://www.pict.com/view/342680/0/d091d ... 8fd0bdd0bd
wild_r
UNITрон
 
Сообщения: 220
Зарегистрирован: 16 апр 2009, 20:46
Откуда: Россия, Санкт - Петербург
  • ICQ

Re: Wizard : Список материалов, использующих одинаковую текстуру

Сообщение Neodrop 23 апр 2009, 10:20

582 материала с одинаковой текстурой!!! Ужос. Это 600 RenderCalls лишних...
Надо лечить...
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Wizard : Список материалов, использующих одинаковую текстуру

Сообщение wild_r 23 апр 2009, 14:24

Уже полечил, сейчас бамп привешу.
wild_r
UNITрон
 
Сообщения: 220
Зарегистрирован: 16 апр 2009, 20:46
Откуда: Россия, Санкт - Петербург
  • ICQ

Re: Wizard : Список материалов, использующих одинаковую текстуру

Сообщение Neodrop 23 апр 2009, 14:46

Wizard помог? :-\
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Wizard : Список материалов, использующих одинаковую текстуру

Сообщение wild_r 23 апр 2009, 15:08

Да, в плане примера.
wild_r
UNITрон
 
Сообщения: 220
Зарегистрирован: 16 апр 2009, 20:46
Откуда: Россия, Санкт - Петербург
  • ICQ

Re: Wizard : Список материалов, использующих одинаковую текстуру

Сообщение Neodrop 23 апр 2009, 15:17

Ну так доделаешь, покажи сравнение. Типа ДО и ПОСЛЕ.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт


Вернуться в Editor

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

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