head_hexagonはにらぼ☆てっくtale_hexagon

[Unity]Texture Atlas ツールを作る

Posted by koichi on 2014/06/20 under Development | Be the First to Comment


こんにちわ、koichiです。

みなさま、よきゲームライフを送ってますか?
「エースコンバット・インフィニティ」面白いですよ。

さて、今日はTexture Atlas を作るツールを作ってみた話です。

複数のテクスチャをまとめる

Asset Storeにもたくさんある、いくつかのテクスチャをひとまとめにするTextureAtlas系。
要はテクスチャをできるだけひとまとめにして用意し、描画を軽くするというのが目的。
テクスチャの切り替えを少なくする狙いですね。

実はTexture2Dにはすでにそのパックする関数Texture2D.PackTextures() が設けられています。
作る流れとしては、
・土台となるテクスチャを作る。
・ひとまとめにしたいテクスチャをロードする。
・PackTextureに食わせる。
・Assetsの下にセーブする。
こんな感じですね。

この部分の一連の流れのコードは

Texture2D atlas = new Texture2D (texSize, texSize, TextureFormat.ARGB32, false);

Textures.Add (Resources.Load ("Textures/chara_walk_1", typeof(Texture2D)) as Texture2D);		
Textures.Add (Resources.Load ("Textures/chara_walk_2", typeof(Texture2D)) as Texture2D);

rects = atlas.PackTextures(Textures.ToArray(), 0, texSize);
atlas.alphaIsTransparency = true;

AssetDatabase.CreateAsset(atlas,"Assets/Atlas_Cat.asset");
AssetDatabase.SaveAssets();

ねこちゃんパックされる。

sc_cat

メニュー起動に

メニューに登録しておけば、いつでも呼び出し可能です。
まぁ、とりあえず中身は決めうちなので・・・w

[MenuItem("MyTools/Pack Cat Texture")]

こう書くとメニューに表示されます。

cat_menu

全コードです。
AtlasInfoとしてアトラス情報もテキストファイルで出してます。

using UnityEngine;
using UnityEditor;
using System.IO;
using System.Collections;
using System.Collections.Generic;

public class ToolTexturePack : MonoBehaviour {

	[MenuItem("MyTools/Pack Cat Texture")]
	static void Create()
	{
		List<Texture2D> Textures = new List<Texture2D> ();
		Rect[] rects;
		int texSize = 1024;

		Texture2D atlas = new Texture2D (texSize, texSize, TextureFormat.ARGB32, false);		

		Textures.Add (Resources.Load ("Textures/chara_walk_1", typeof(Texture2D)) as Texture2D);		
		Textures.Add (Resources.Load ("Textures/chara_walk_2", typeof(Texture2D)) as Texture2D);

		rects = atlas.PackTextures(Textures.ToArray(), 0, texSize);
		atlas.alphaIsTransparency = true;

		AssetDatabase.CreateAsset(atlas,"Assets/Atlas_Cat.asset");
		AssetDatabase.SaveAssets();

		string fileName = "Assets/AtlasInfo_Cat.txt";
		StreamWriter sw = File.CreateText (fileName);
		for (int i=0; i<rects.Length; i++) {
			sw.WriteLine ("atlas:{0},{1},{2},{3}", rects[i].x, rects[i].y, rects[i].width, rects[i].height);
		}
		sw.Close ();
	}
}

コメントを残す