Unity 來講一講關於SpriteAtlas的事情

恭喜熊貓先生,在半年的散養狀態之後,終於再次開始工作了。(小聲比比,今年真的是好難找工作啊。模棱兩可的能力,四處碰壁)

SpriteAtlas是unity2017引入的新內容。其實就是圖集。最大的好處就是,同一圖集裏的圖片,在渲染的時候,會只產生一個DrawCall。(可能大概也許是這樣)

今天就來說一說關於這個東西的幾件事情。搜別人的文章,真的是太難了,各種找不到……

以unity2018的api爲基礎來主要說幾個吧。

首先,是存放的問題。

atlas和其要導入的Texture或者Sprite,切記不能放在Resources目錄下。因爲Resources目錄下的文件,是不會被打入到圖集中的。

然後,是加載的問題。

簡言之:

SpriteAtlas sa = AssetDatabase.LoadAssetAtPath<SpriteAtlas>(path);

SpriteAtlas是UnityEngine.U2D中的類。

在官方的描述中,給的做法是做個繼承了Mono的腳本,然後把SpriteAtlas加入到其List<SpriteAtlass>中。但是這樣的話,豈不是很麻煩。每新建一個就要掛載進去,或者就寫個自動化添加的。

自動化添加聽起來很不錯,不過我主要是不想做一個這樣的腳本。【狗頭】

一定能用代碼解決的。想一想,atlas不能放在Resources裏,所以肯定不是Resources.Load()方法了。所以就需要使用AssetDatabase這個能管理整個工程的文件的靜態類了。

最後,說一下關於平臺的屬性的問題。

在這裏插入圖片描述
有的人的Unity沒有後面兩個小圖標,這兩個分別是IOS和Android的開發支持包的。可以在Build Settings中下載。
在這裏插入圖片描述
以安卓來舉例子,默認是這個樣子的。Override for Android的意思是出安卓包的時候,各種參數使用這裏選擇的數據。
在這裏插入圖片描述
然而,昨天接到了一個任務,因爲每次創建新的圖集的時候,這個都是默認沒有選的,就要手動改,就很麻煩。其實麻煩倒是其次,最重要的是容易忘記,要是忘了的話,在出包的時候就達不到理想的樣子。就要重(jia)出(ban)。

所以就需要我在有人創建新的圖集時,自動勾選override,同時將Format改爲RGBA ASTC 4x4.

簡言之:

public class AssetsPostManager : AssetPostprocessor {
    static void OnPostprocessAllAssets(string[] importedAsset, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) {

        if (0 < importedAsset.Length)
        {
            foreach (string filePath in importedAsset)
            {
                //判斷是否是文件 跳過文件夾
                if (filePath.Contains("."))
                {
                    //通過後綴名做判斷文件類型
                    string suffix = filePath.Substring(filePath.LastIndexOf('.') + 1);

                    switch (suffix)
                    {
                        case "spriteatlas":
                            OnPostprocessSpriteAtlas(filePath);
                            break;
                        default:
                            break;
                    }
                }
            }
        }
    }

    //SpriteAtlas
    private static void OnPostprocessSpriteAtlas(string path)
    {
        SpriteAtlas sa = AssetDatabase.LoadAssetAtPath<SpriteAtlas>(path);
        SpriteAtlasExtensions.SetPlatformSettings(sa, new TextureImporterPlatformSettings
        {
            name = "Android",
            overridden = true,
            format = TextureImporterFormat.ASTC_RGBA_4x4,
        });
    }

}

接下來講一下這個代碼和我當時遇到的坑。

AssetPostprocessor

AssetPostprocessor lets you hook into the import pipeline and run scripts prior or after importing assets.
允許您掛接到導入管道並在導入資產之前或之後運行腳本。

也可以看一下這篇文章,很直觀。
https://blog.csdn.net/qq826364410/article/details/86515209

聽起來,是個不錯的編輯器工具類。(感覺走向工具人的道路被打開了)

public static void OnPostprocessAllAssets(string[] importedAsset, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)

所有的資源的導入,刪除,移動,都會調用此方法,注意,這個方法是static的。可以看到他的參數,導入的資產,刪除的資產,移動的資產,資產移動前的路徑。

所以我就花了十分鐘,做了一下分類。把SpriteAtlas的摘出來,在一個方法裏做修改。

至於OnPostprocessSpriteAtlas,並不是原生的,希望看到的人不要被誤導。

接下來,就是花費了我好幾個小時的修改其參數的部分了。

首先,花了二十多分鐘,在UnityEditor中找到了可以修改參數的靜態類,SpriteAtlasExtensions。

F12進去看一下,主要有三個方法。

        // 摘要:
        //     Set the SpriteAtlasPackingSettings to use when packing this SpriteAtlas
        public static void SetPackingSettings(this SpriteAtlas spriteAtlas, SpriteAtlasPackingSettings src);
        // 摘要:
        //     Set the platform specific settings.
        public static void SetPlatformSettings(this SpriteAtlas spriteAtlas, TextureImporterPlatformSettings src);
        // 摘要:
        //     Set the SpriteAtlasTextureSettings for the packed texture generated by this SpriteAtlas.
        public static void SetTextureSettings(this SpriteAtlas spriteAtlas, SpriteAtlasTextureSettings src);

看一下面板:
在這裏插入圖片描述
紅色的部分,Packing。所以其參數都在SetPackingSettings中處理。

藍色的部分, Texture。所以其參數都在SetTextureSettings中處理。

最下面的,關於各個平臺設置的。所以其參數都在SetPlatformSettings中處理。

這時候去看一下api,發現,並沒有設置哪個平臺的???

只好再去Unity Api網站裏看一下。上面說,TextureImporterPlatformSettings是TextureImporter的一種變形。

那好,我就去看看TextureImporter。還不錯,發現了幾個有用的方法。

        [Obsolete("Use UnityEditor.TextureImporter.SetPlatformTextureSettings(TextureImporterPlatformSettings) instead.")]
        public void SetPlatformTextureSettings(string platform, int maxTextureSize, TextureImporterFormat textureFormat);
        // 摘要:
        //     Set specific target platform settings.
        public void SetPlatformTextureSettings(TextureImporterPlatformSettings platformSettings);
        // 摘要:
        //     Set specific target platform settings.
        [Obsolete("Use UnityEditor.TextureImporter.SetPlatformTextureSettings(TextureImporterPlatformSettings) instead.")]
        public void SetPlatformTextureSettings(string platform, int maxTextureSize, TextureImporterFormat textureFormat, int compressionQuality, bool allowsAlphaSplit);
        // 摘要:
        //     Set specific target platform settings.
        [Obsolete("Use UnityEditor.TextureImporter.SetPlatformTextureSettings(TextureImporterPlatformSettings) instead.")]
        public void SetPlatformTextureSettings(string platform, int maxTextureSize, TextureImporterFormat textureFormat, [DefaultValue(false)] bool allowsAlphaSplit);
        

string platform,可以設置平臺了。突然,Obsolete???

什麼鬼,已經被棄用了。感到迷茫。

開始衝浪了加去看API。一個小時後,我投降。

只好等主程有時間了,來看看咋辦。

這時候,我就只能回到夢開始的地方,再看看TextureImporterPlatformSettings這個類。

又是一個突然,我看到一個name的字段。這個到底是幹嘛的?

一開始,我以爲會有很多套配置,所以可以作爲備註使用。現在覺得,有必要嗎?

打開摘要一看:

// 摘要:
        //     Name of the build target.
        public string name { get; set; }

the build target

再看看文件裏是啥樣的:

platformSettings:
    - serializedVersion: 2
      m_BuildTarget: Android
      m_MaxTextureSize: 2048
      m_ResizeAlgorithm: 0
      m_TextureFormat: 54
      m_TextureCompression: 1
      m_CompressionQuality: 50
      m_CrunchedCompression: 0
      m_AllowsAlphaSplitting: 0
      m_Overridden: 1
      m_AndroidETC2FallbackOverride: 0

m_BuildTarget:Android

我……

在這裏插入圖片描述
好了,去看一下API
在這裏插入圖片描述
妥了。

難。真的難。工具人太難了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章