首页 >Unity3D频道 >【Unity3D拓展编辑器】 > Unity3D研究院编辑器之脚本打开SpritePacker窗口(十七)
2015
11-28

Unity3D研究院编辑器之脚本打开SpritePacker窗口(十七)

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

QQ20151128190301

 

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;
                }
            }
        }
    }
}

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

QQ20151128190826

 

Unity版本5.2.2

 

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Unity3D研究院编辑器之脚本打开SpritePacker窗口(十七)》有 3 条评论

  1. SuperL说:

    请问下有什么办法可以通过代码控制Unity窗口布局?

留下一个回复

你的email不会被公开。 必填项已用 * 标注。