読者です 読者をやめる 読者になる 読者になる

【Unity】テクスチャインポーターをつくる

インポーターはざっくり言うとアセットのインポート時にフックして、インポート設定や該当アセットに関する何らかの処理を行うことができるものです。
作成は簡単で、AssetPostprocessorを継承したクラスを作成し、処理を行いたい対象に適したメソッドを記述するだけです。
docs.unity3d.com

今回はテクスチャのインポートをフックしたいので、OnPreprocessTextureを実装します 。
また、以下の設定を行う想定としてみます。

  • 設定する対象の拡張子は.tgaのみ
  • Texture Type:Advanced
  • Non Power of 2
  • Alpha Is Transparency:true
  • Generate Mip Maps:false

これを満たすものがだいたいこんな感じ。

実運用では設定をScriptableObjectとかで管理したほうが柔軟でいい感じですけど、今回はインポーターに焦点をあてるために省略してます。

インポーターはざっくり、以下のタイミングで実行されます。

  • 対象ファイルが初めてインポートされたとき
  • Reimportを実行したとき
  • インポート設定を変更してApplyを選択したとき

利用者が上2つの操作しか行わないのであれば、上に書いた要件は27行目までの実装でだいたい満たせています。
ただ、最後の「インポート設定を変更してApplyを選択」という操作をされた場合、その限りではありません。

では具体的にどんなとき28行目以降の操作が必要になるかと言うと、TextureTypeやImportTypeなどを変更されたときがこれにあたります。

TextureTypeはAdvancedを指定してるので操作されても問題ないだろうと思っちゃうんですけど、TextureTypeの変更は副作用を伴います。
たとえばCubeMapを指定した場合、同時に「generateCubemap」や「wrapMode」といった値も書き換えられてしまいます。
なので、31、32行目で明示的にAdvancedが選択されているときに適切な値を指定しています。

また、次にImportTypeですが、こちらは上の要件にないんですけど、勝手に変更されたくないのでTextureTypeを変更された際と同様に、明示的にデフォルトのものを指定してやります。
ただ、このImportTypeはちょっと厄介で、通常Inspector上では「Default」という値になっているんですが、まずそもそもプロパティとしてImportTypeというものがありません。
ではImportTypeがDefaultであるということをコード上で示すためにはどうすればよいかというと、28行目と29行目でやっている通り、以下のように書いてやる必要があります。

importer.lightmap = false;
importer.normalmap = false;

分かりづらいでござる…。
30行目でlinearTextureを指定しているのは、ImportTypeを変更した副作用でこちらのプロパティが変更されてしまうためです。
このあたりはUnityEngineのTextureImporterInspector.csを読むと、それぞれの値を変更したときにどんなことが起こるのかわかるとおもいます。

多分まだ触ってないプルダウンを触ると他にも制限しないといけないところがあるんだと思うんですが、なんというかいたちごっこな感じになるのつらい…。

スポンサーリンク