Unity3D编辑器之脚本打开SpritePacker窗口

Unity3D编辑器之脚本打开SpritePacker窗口


正常情况下需要选择 Windows->SpritePacker 但是默认会选择第一个图集。如下图所示,这就很不爽了,因为我做了图集管理工具,我想在Insperctor窗口中点击某个按钮,自动打开SpritePacker并且选择我设置的图集怎么办?

Unity3D编辑器之脚本打开SpritePacker窗口_第1张图片

1.png (22.06 KB, 下载次数: 1)

下载附件  保存到相册

2015-11-30 10:13 上传




SpritePacker窗口没有提供代码访问接口,那么我们可以使用强大的反射功能。我自己反编译一下Unity的Editor代码,然后找到图集的窗口类。然后看看它的实现方法,然后就有了如下的代码了。

[C#] 纯文本查看 复制代码
?
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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 window = EditorWindow.focusedWindow;
  
         //反射遍历所有图集
         var type = typeof (EditorWindow).Assembly.GetType( "UnityEditor.Sprites.PackerWindow" );
         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 ;
                 }
             }
         }
     }
}


OK.如下图所示,脚本打开SpritePacker窗口,并且定位到我需要的图集上。

你可能感兴趣的:(技术方案)