正常情況下需要選擇 Windows->SpritePacker 但是默認(rèn)會(huì)選擇第一個(gè)圖集驮樊。如下圖所示薇正,這就很不爽了,因?yàn)槲易隽藞D集管理工具囚衔,我想在Insperctor窗口中點(diǎn)擊某個(gè)按鈕挖腰,自動(dòng)打開(kāi)SpritePacker并且選擇我設(shè)置的圖集怎么辦?
SpritePacker窗口沒(méi)有提供代碼訪問(wèn)接口练湿,那么我們可以使用強(qiáng)大的反射功能猴仑。我自己反編譯一下Unity的Editor代碼,然后找到圖集的窗口類肥哎。然后看看它的實(shí)現(xiàn)方法辽俗,然后就有了如下的代碼了疾渣。
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";
//設(shè)置使用采取圖集的方式
EditorSettings.spritePackerMode = SpritePackerMode.AlwaysOn;
//打包圖集
Packer.RebuildAtlasCacheIfNeeded(EditorUserBuildSettings.activeBuildTarget, true);
//打開(kāi)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)
{
//找到后設(shè)置索引
FieldInfo info = type.GetField("m_SelectedAtlas", BindingFlags.NonPublic | BindingFlags.Instance);
info.SetValue(window, i);
break;
}
}
}
}
}
OK.如下圖所示,腳本打開(kāi)SpritePacker窗口崖飘,并且定位到我需要的圖集上榴捡。
image.png
文章轉(zhuǎn)自http://www.xuanyusong.com/archives/3768