正常情况下需要选择 Windows->SpritePacker 但是默认会选择第一个图集。如下图所示,这就很不爽了,因为我做了图集管理工具,我想在Insperctor窗口中点击某个按钮,自动打开SpritePacker并且选择我设置的图集怎么办?
SpritePacker窗口没有提供代码访问接口,那么我们可以使用强大的反射功能。我自己反编译一下Unity的Editor代码,然后找到图集的窗口类。然后看看它的实现方法,然后就有了如下的代码了。
1 2 3 4 5 6 7 8 9 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 40 41 42 |
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窗口,并且定位到我需要的图集上。
Unity版本5.2.2
- 本文固定链接: https://www.xuanyusong.com/archives/3768
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
请问下有什么办法可以通过代码控制Unity窗口布局?
非常好的
好文要顶