Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
21
Help us understand the problem. What is going on with this article?
@TD12734

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

More than 1 year has passed since last update.

Unityでは以下のように、テクスチャー(画像ファイル)のインポート設定がある。これを上手く設定しないと画像がぼやける、容量が無駄に増える、そもそも表示されないなどの問題が生じる。
インポート設定
見ての通り、設定すべき項目が多い。
問題はこれをインポートする度に行わなくてはならない事であり、画像毎に設定に差異が生じる場合がある。複数人で開発を行っている場合は差異が生じる可能性が大きく上昇する。
しかし、差異を無くすために画像をインポートする度にCtrl+Aで全選択し、設定するのも時間が掛かってしまう。

そこで、この記事ではUnityのエディター拡張を行い、画像のインポート時に設定を自動で行うようにする。

画像のインポート設定を自動で設定する

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

画像のインポート時とインポート設定を変えた時に呼ばれる関数である、AssetPostprocessorクラスのOnPreprocessTextureメソッドと画像のインポート設定を変更するTextureImporterクラスを使用する。
この記事では特に設定すべきであろう物だけ紹介する。他の設定も見たい場合はTextureImporterのスクリプトリファレンスも参照。

使用例

Assetフォルダ以下にEditorフォルダを作成し、そこにImportManager.csファイルを作ってみよう。
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;
        }
    }
}

共通設定

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に設定する

応用編

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

プラットフォームごとに設定を変える

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のスクリプトリファレンス
テクスチャのマニュアル

21
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
TD12734
Unity/C#を用いて東方二次創作ゲームの制作を行っています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
21
Help us understand the problem. What is going on with this article?