(轉載)Unity3D研究院編輯器之腳本打開SpritePacker窗口 自動打開想要的圖集

正常情況下需要選擇 Windows->SpritePacker 但是默認會選擇第一個圖集。如下圖所示,這就很不爽了,因爲我做了圖集管理工具,我想在Insperctor窗口中點擊某個按鈕,自動打開SpritePacker並且選擇我設置的圖集怎麼辦?

 

SpritePacker窗口沒有提供代碼訪問接口,那麼我們可以使用強大的反射功能。我自己反編譯一下Unity的Editor代碼,然後找到圖集的窗口類。然後看看它的實現方法,然後就有了如下的代碼了

 

using UnityEditor;

using System.Reflection;

using UnityEditor.Sprites;

 

public class MyEditor : Editor {

 

 

    [MenuItem("GameObject/SearchAtlas",false,0)]

    static void StartInitializeOnLoadMethod1()

    {

        //需要Sprite Packer界面定位的圖集名稱

        string spriteName = "atlas_name2";

        //設置使用採取圖集的方式

        EditorSettings.spritePackerMode = SpritePackerMode.AlwaysOn;

        //打包圖集

        Packer.RebuildAtlasCacheIfNeeded(EditorUserBuildSettings.activeBuildTarget, true);

        //打開SpritePack窗口

        EditorApplication.ExecuteMenuItem("Window/Sprite Packer");

 

        //反射遍歷所有圖集

        var type = typeof(EditorWindow).Assembly.GetType("UnityEditor.Sprites.PackerWindow");

        var window = EditorWindow.GetWindow(type);

        FieldInfo infoNames = type.GetField("m_AtlasNames", BindingFlags.NonPublic | BindingFlags.Instance);

        string[] infoNamesArray = (string[])infoNames.GetValue(window);

 

        if(infoNamesArray != null)

        {

            for (int i = 0; i < infoNamesArray.Length; i++)

            {

                if (infoNamesArray[i] == spriteName)

                {

                    //找到後設置索引

                    FieldInfo info = type.GetField("m_SelectedAtlas", BindingFlags.NonPublic | BindingFlags.Instance);

                    info.SetValue(window, i);

                    break;

                }

            }

        }

    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章