优质中文开源软件代码项目资源技术共享平台
传播开源的理念,推广开源项目
学习是对自己最棒的投资!与君共勉!
云服务器主机测评推荐,开源软件代码项目技术资源共享!

网站首页 > 游戏开发 正文

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

longtao100 2021-09-06 21:35:37 游戏开发 683 ℃ 0 评论

正常情况下需要选择 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

 


Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

请填写验证码
开源分类
最近发表
开源网标签
开源网归档