正常情況下需要選擇 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;
}
}
}
}
}