unityでいってみよう!

unityがチョットワカル位の人のブログ

TextureImporterを通さないでイテレーションを高速化

UnityのTextureImporterを通さないとは?

UnityのプロジェクトへPNG等の画像ファイルと登録すると、Unityはその画像ファイルをUnityが使える形に変換してくれます。

この変換を担っているのがTextureImporterな訳ですが、非常に生真面目な性格でプロジェクトを開いたりプラットフォームを切り替える都度にプロジェクトに登録されている全ての画像ファイルを再度インポートし直してくれます。

アプリケーション開発の初めは良いのですが、プロジェクトに登録されている画像ファイルが多くなるとこの時間が尋常では無くなります。

今回はTextureImporterを通さず、画像ファイルをUnityで使うことによる開発イテレーションの効率化のご提案です。

 

Unityに画像ファイルとして認識させない方法

 

実は簡単で単純にファイルの拡張子を変更するだけです。

例えばここにsample.pngという画像ファイルがあるとします。

f:id:kimukats:20171021125614p:plain

このファイルをUnityのプロジェクトに追加すると通常下記のように表示されます。

f:id:kimukats:20171021130224p:plain

これは追加したファイルをUnityが画像ファイルと判断しTextureImporterが実行されたことを意味しています。


次は事前エクスプローラーなどでsample.pngをsample.binと拡張子を変更した上でUnityのプロジェクトファイルに追加してみます。

f:id:kimukats:20171021131114p:plain

Inspectorの表示がシンプルになりました。
当然このままではTextureとしては使えません。

どうやってTextureとしてつかうの?

一旦ファイルとして読み込み、スクリプトからAPIを介してTextureオブジェクトを作成します。
通常はAssetBundleを介してファイルを読み込むケースが多いと思いますが、今回はStreamingAssetsからC#APIを使って読み込みTextureオブジェクト化して使用するサンプルを作成しました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class sample : MonoBehaviour {
	[SerializeField] UnityEngine.UI.RawImage m_rawImage;

	// Use this for initialization
	void Start () {
		var fpath = System.IO.Path.Combine(Application.	streamingAssetsPath,"sample.bin");
		if(System.IO.File.Exists(fpath) == true){
			var bufs = System.IO.File.ReadAllBytes(fpath);
			var texture = new Texture2D(512,512,TextureFormat.ARGB32,false);
			if(texture){
				texture.LoadImage(bufs);
				texture.Apply();
				m_rawImage.texture = texture;
			}
		}
	}	
}


一度、バイナリーデータがMonoヒープに乗ってしまうのが難点ですがそこは必要経費とします。

日々のイメージとしては、デザイナーサイドでUIの配置を行う場合は画像データとしてUnityに取り込み作業を行い、作業がひと段落したらプログラマーサイドで元の画像ファイルをUnityから削除し、ここで紹介したプロセスを踏めば皆が幸せになるかと思います。


GitHubにサンプルプロジェクトを丸ごとアップしておきます。
github.com