Edited at

【Unity】テクスチャーのインポート設定を自動で行う

Unityでは以下のように、テクスチャー(画像ファイル)のインポート設定がある。これを上手く設定しないと画像がぼやける、容量が無駄に増える、そもそも表示されないなどの問題が生じる。

インポート設定

見ての通り、設定すべき項目が多い。

問題はこれをテクスチャーをインポートする度に行わなくてはならない事である。これの何が不味いかと言うと、画像毎に設定に差異が生じる場合がある。複数人で開発を行っている場合は差異が生じる可能性がぐんと上がってしまうだろう。

だからと言って差異を無くすために画像をインポートする度にCtrl+Aで全選択し、設定するのも時間が掛かってしまう。

なので、この記事ではUnityのエディター拡張を行い、画像のインポート時に設定を自動で行うようにする。記事は初級編、中級編、上級編の三段階に分けてある。


初級編

ここからはテクスチャのインポート設定において特に重要だと思われる設定とその変更方法について説明する。

初級編で記述する初期設定を行うだけでもテクスチャのインポート設定を行う手間が大幅に減るだろう。


エディター拡張用ファイルを作る

Assetフォルダ以下にEditorフォルダを作成し、そこにImportManager.csファイルを作ってみよう。以下にその雛型を載せる。


ImportManager.cs

using UnityEngine;

using UnityEditor;
using System.Collections;

public class ImportProcess : AssetPostprocessor
{
//画像のインポート時、インポート設定変更時に実行される関数
void OnPreprocessTexture ()
{
//assetImporterにインポートするオブジェクトが入る。それをテクスチャ型にキャスト
TextureImporter Ti = assetImporter as TextureImporter;

//この下に色々書く
}
}


UnityにはTextureImporterという便利なクラスがあるのでそれを利用する。

上のOnPreprocessTexture()は画像のインポート時、またはインポート設定を変えた時に呼ばれる関数である。この中に色々書く。この記事では特に設定すべきであろう物だけ紹介する。他の設定も見たい場合はTextureImporterのスクリプトリファレンスも参照。


共通設定


Texture Type

Texture Typeは画像が何に使われるのかを設定する。この設定を誤ると最悪画像が表示されない。

Ti.textureType = TextureImporterType.Sprite;//スプライト(主に2D用)

Ti.textureType = TextureImporterType.GUI;//GUI(主に3D用)


Generate Mip Maps

Generate Mip Mapsはテクスチャのミップマップの生成を設定する。遠くからスプライトを見る場面があればtrueにすれば良い感じか。

Ti.mipmapEnabled = true;//ミップマップをtrueに設定する


Asset Path

Asset Pathはテクスチャのパスを取得する。読み取り専用。

Debug.Log (Ti.assetPath);//テクスチャの置かれているパスを取得し、ログに表示する

//Assets/Resources/Pictures/hogehoge/hugahuga.pngのようなstringが取得可能


Filter Mode

Filter Modeはテクスチャのフィルタリングモードを設定する。ドット絵はPoint、それ以外はBilinearにすれば画像が綺麗になるかも。

Ti.filterMode = FilterMode.Bilinear;//Bilinear

Ti.filterMode = FilterMode.Point;//Point


Max Size

Max Texture Sizeはテクスチャの最大サイズを設定する。長辺が設定したサイズ以上の場合は設定値へとスケールダウンされる。設定値は32~8192までの2のべき乗限定。

Ti.maxTextureSize = 1024;//長辺のサイズを1024までに制限する

Ti.maxTextureSize = 2048;//長辺のサイズを2048までに制限する


Compression

Texture Importer Compressionはテクスチャの圧縮タイプを設定する。この設定はプラットフォームごとの設定によっては上書きされる(詳しくは中級編を参照)。

Ti.textureCompression = TextureImporterCompression.Compressed;//圧縮タイプをNormal Qualityに設定する

Ti.textureCompression = TextureImporterCompression.CompressedHQ;//圧縮タイプをHigh Qualityに設定する(高品質、メモリ使用増)


Sprite専用設定


Sprite Mode

Sprite Modeはスプライトのインポートモードを設定する。エフェクトなどのアニメーションはMultiple、立ち絵や背景はSingleと言った感じか。

Ti.spriteImportMode = SpriteImportMode.Single;//シングル

Ti.spriteImportMode = SpriteImportMode.Multiple;//マルチタイプ


Packing Tag

Packing Tagはスプライトのパッキングタグ。

Ti.spritePackingTag = "hogehoge";//パッキングタグをhogehogeに設定する


実際に使用する場合の例(初級編)

以下に参考になりそうなコードを置いておく。4つのフォルダが登場するが、フォルダの説明は以下の通り。


  • BackGround:背景画像のフォルダ。長辺サイズが1500前後のjpgファイルが入っている。

  • Character:キャラクターの立ち絵のフォルダ。長辺サイズが600前後の透過pngファイルが入っている。

  • Dot:ドット絵のフォルダ。長辺サイズが16または24の透過pngまたはgifファイルが入っている。

  • Effect:エフェクトアニメーションのフォルダ。長辺サイズが800前後の透過pngファイルが入っている。


ImportManager.cs

using UnityEngine;

using UnityEditor;
using System.Collections;

public class ImportProcess : AssetPostprocessor
{
//画像のインポート時、インポート設定変更時に実行される関数
void OnPreprocessTexture ()
{
//assetImporterにインポートするオブジェクトが入る。それをテクスチャ型にキャスト
TextureImporter Ti = assetImporter as TextureImporter;

//インポート設定変更時もこのメソッドが呼ばれる都合上、一部のテクスチャだけ初期設定を無効化するには何かしらの処理が必要
//今回はパッキングタグが何かしら設定されている場合、初期設定を行わないように設定する
if (Ti.spritePackingTag != "")
{
return;
}

//今回は全てスプライト扱いにする
Ti.textureType = TextureImporterType.Sprite;
Ti.mipmapEnabled = false;
Ti.textureCompression = TextureImporterCompression.Compressed;

//ここからはインポートするテクスチャがどのフォルダ内にあるかで処理を変える
if (Ti.assetPath.Contains ("Assets/Resources/Pictures/BackGround"))
{
Ti.spriteImportMode = SpriteImportMode.Single;
Ti.filterMode = FilterMode.Bilinear;
Ti.maxTextureSize = 2048;
}
else if (Ti.assetPath.Contains ("Assets/Resources/Pictures/Character"))
{
Ti.spriteImportMode = SpriteImportMode.Single;
Ti.filterMode = FilterMode.Bilinear;
Ti.maxTextureSize = 1024;
}
else if (Ti.assetPath.Contains ("Assets/Resources/Pictures/Dot"))
{
Ti.spriteImportMode = SpriteImportMode.Single;
Ti.filterMode = FilterMode.Point;//Bilinearにすると変にぼやけてドット絵の良さが失われるので、これだけPoint
Ti.maxTextureSize = 32;
}
else if (Ti.assetPath.Contains ("Assets/Resources/Pictures/Effect"))
{
Ti.spriteImportMode = SpriteImportMode.Multiple;//スプライトエディターで画像を切り分けるので、これだけMultiple
Ti.filterMode = FilterMode.Bilinear;
Ti.maxTextureSize = 1024;
}
}
}



中級編

ここからはプラットフォームごとの個別設定について解説する。

「スタンドアロンでは容量がデカくなっても良いから画像を綺麗にしたいが、他のプラットフォームでは画像が多少荒くなっても良いから容量を小さくしたい」という感じに初級編より設定をこだわりたい人向けの内容である。


自動で設定を行うメソッド「SetPlatformTextureSettings()」

SetPlatformTextureSettings()関数の引数にTextureImporterPlatformSettingsクラスを渡して設定を行う。

Ti.SetPlatformTextureSettings (new TextureImporterPlatformSettings

{
overridden = true,
name = "Android",
maxTextureSize = 1024,
format = TextureImporterFormat.RGBA16,
textureCompression = TextureImporterCompression.Compressed,
resizeAlgorithm = TextureResizeAlgorithm.Mitchell
});

ここで設定したmaxTextureSizeなどは上書きされ、初級編で設定した値よりもここで設定した値が優先される。

この記事では特に設定すべきであろう物だけ紹介する。他の設定も見たい場合はTextureImporterPlatformSettingsのスクリプトリファレンスも参照。


overridden

overriddenがtrueならプラットフォームで設定を上書きし、falseならデフォルトの設定を用いる。falseにする意味は無いに等しいので実質true一択だろう。

overridden = true,


name

nameは設定を上書きしたいプラットフォーム。なぜかenumではなくstringで指定させられる。

name = "Android",

name = "iPhone",
name = "Standalone",//PCのスタンドアロン
name = "WebGL",


maxTextureSize

maxTextureSizeはテクスチャの最大サイズを設定する。初級編で説明したのと同じ。

maxTextureSize = 1024,

maxTextureSize = 2048,


format

formatは圧縮するテクスチャの形式を設定する。この設定次第でテクスチャの綺麗さや容量の大きさが変わるので最も重要な設定項目であると言える。

format = TextureImporterFormat.RGB24,

format = TextureImporterFormat.RGBA32,
format = TextureImporterFormat.RGBA16,//Android、iPhoneなど
format = TextureImporterFormat.ARGB16,//Standalone、WebGLなど

この設定で厄介なのは本来は選択不可能なフォーマットもスクリプト上で選択できてしまう点である。例えばAndroidでARGB16、WebGLでRGBA16が選択できてしまう。もし選択した場合はフォーマットはデフォルトの物(DXT1など)になってしまうので注意が必要。


textureCompression

textureCompressionはテクスチャの圧縮タイプを設定する。初級編で説明したのと同じ……はずなのだが、いざ設定してもエディター上では「-」としか表示されないのでこの設定は本当に有効なのかは怪しい。

textureCompression = TextureImporterCompression.Uncompressed,//圧縮無し

textureCompression = TextureImporterCompression.Compressed,//圧縮
textureCompression = TextureImporterCompression.CompressedHQ,//高品質、低速圧縮
textureCompression = TextureImporterCompression.CompressedLQ,//高速、低品質圧縮


resizeAlgorithm

resizeAlgorithmはテクスチャのリサイズアルゴリズムを設定する。迷ったらデフォルト設定のMitchellで良いだろう。

resizeAlgorithm = TextureResizeAlgorithm.Mitchell,

resizeAlgorithm = TextureResizeAlgorithm.Bilinear,


実際に使用する場合の例(中級編)

以下に参考になりそうなコードを置いておく。内容としてはメモリとHDDが潤沢なスタンドアロンはテクスチャを綺麗に見せる事を優先し、そうでもないそれ以外のプラットフォームはテクスチャの容量を小さくすることを優先している。


ImportManager.cs

using UnityEngine;

using UnityEditor;
using System.Collections;

public class ImportProcess : AssetPostprocessor
{
//画像のインポート時、インポート設定変更時に実行される関数
void OnPreprocessTexture ()
{
//assetImporterにインポートするオブジェクトが入る。それをテクスチャ型にキャスト
TextureImporter Ti = assetImporter as TextureImporter;

//インポート設定変更時もこのメソッドが呼ばれる都合上、一部のテクスチャだけ初期設定を無効化するには何かしらの処理が必要
//今回はパッキングタグが何かしら設定されている場合、初期設定を行わないように設定する
if (Ti.spritePackingTag != "")
{
return;
}

//今回は全てスプライト扱いにする
Ti.textureType = TextureImporterType.Sprite;
Ti.mipmapEnabled = false;

//ここからはプラットフォームごとに設定を変える
Ti.SetPlatformTextureSettings (new TextureImporterPlatformSettings
{
overridden = true,
name = "Android",
maxTextureSize = 1024,
format = TextureImporterFormat.RGBA16
});
Ti.SetPlatformTextureSettings (new TextureImporterPlatformSettings
{
overridden = true,
name = "WebGL",
maxTextureSize = 1024,
format = TextureImporterFormat.ARGB16
});
Ti.SetPlatformTextureSettings (new TextureImporterPlatformSettings
{
overridden = true,
name = "iPhone",
maxTextureSize = 1024,
format = TextureImporterFormat.RGBA16
});
Ti.SetPlatformTextureSettings (new TextureImporterPlatformSettings
{
overridden = true,
name = "Standalone",
maxTextureSize = 8192,
format = TextureImporterFormat.RGBA32
});
}
}



外部リンク

TextureImporterのスクリプトリファレンス

TextureImporterPlatformSettingsのスクリプトリファレンス

テクスチャのマニュアル