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