Страница 1 из 1

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

СообщениеДобавлено: 22 апр 2009, 12:16
Neodrop
Мега подгон сообществу! Делюсь, так уж и быть. Некоторым камрадам, с 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();
        }

}

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

СообщениеДобавлено: 22 апр 2009, 13:34
wild_r
Большое спасибо, но лично мне оно поможет только с проверкой работы моего скрипта, т.к. у меня просто не хватает места в окне, чтобы отобразить все материалы, да и вручную их заменять...

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

СообщениеДобавлено: 22 апр 2009, 13:40
Neodrop
Немного переписав скрипт не сложно сделать автозамену для выбранных материалов.

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

СообщениеДобавлено: 22 апр 2009, 13:47
wild_r
А одинаковые материалы будут эдитором собираться в один? Т.е. файлы матриалов.

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

СообщениеДобавлено: 22 апр 2009, 13:51
Neodrop
Можно написать дополнение к скрипту, которое заместит все выбранные материалы одним. Поставил галки и вуа-ля.

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

СообщениеДобавлено: 22 апр 2009, 17:43
Neodrop
Кстати, wild_r, а сколько у тебя совпадающих материалов? Мне просто интересно. Сделай скрин? :-?

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

СообщениеДобавлено: 23 апр 2009, 10:01
wild_r
Самый хронический случай:
http://www.pict.com/view/342680/0/d091d ... 8fd0bdd0bd

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

СообщениеДобавлено: 23 апр 2009, 10:20
Neodrop
582 материала с одинаковой текстурой!!! Ужос. Это 600 RenderCalls лишних...
Надо лечить...

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

СообщениеДобавлено: 23 апр 2009, 14:24
wild_r
Уже полечил, сейчас бамп привешу.

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

СообщениеДобавлено: 23 апр 2009, 14:46
Neodrop
Wizard помог? :-\

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

СообщениеДобавлено: 23 апр 2009, 15:08
wild_r
Да, в плане примера.

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

СообщениеДобавлено: 23 апр 2009, 15:17
Neodrop
Ну так доделаешь, покажи сравнение. Типа ДО и ПОСЛЕ.