【Unity】ダウンロードした画像からスプライトを作成する。

たまには技術的な話題を。

いま制作しているゲームでは、魔法カードや町の風景の書割など、DLCとしてHTTP経由で取ってきたものを表示している。

そうすることで、リリース後もアプリをバージョンアップすることなく、コンテンツを増やしていけるようにするためだ。

ただ画像をテクスチャにするだけじゃなく、スプライトにして利用したい場合もあるはずだ。

いろいろ試してみたところ、次のようなやり方で、落としてきた画像からマルチスライスのスプライトを作成することができた。

【前提】
HTTP経由で落としてきた画像を適当な場所に保存しているものとする。(Application.persistentDataPath配下など)

【概要】
1.保存した画像をテクスチャ2Dとして読込む。
2.テクスチャ2Dからマルチスライスのスプライトを生成する。

【保存した画像をテクスチャ2Dとして読込む】

//画像を保存しているパスから画像の全バイトを読込む。
byte[] bytes = File.ReadAllBytes(path);

//テクスチャ2Dのコンストラクタ
//三番目と四番目の引数は省略可能。ここでは、軽めの透過画像で、ミップマップなし、を指定している。
Texture2D texture = new Texture2D(width, height, TextureFormat.ARGB4444, false);

//バイトデータから画像を読込み
texture.LoadImage(bytes);

//こちらも任意。省略した場合はBilinear
texture.filterMode = FilterMode.Point;

//これも任意。こうするとUnity上のメモリが若干軽くなった
texture.Compress(false);

【テクスチャ2Dからマルチスライスのスプライトを生成する】
基本的には下記の要領なので、理解しやすいと思う。

Sprite sprite = Sprite.Create(texture, new Rect(left, top, spriteWidth, spriteHeight), new Vector2(0.5f, 0.5f));

【おまけ】
列数×行数のグリッドでスライスするロジックも載せておこう。


Sprite[] result;
float spHig = texture.height / rowMax;
float spWid = texture.width / colMax;
result = new Sprite[rowMax * colMax];

Rect rect;

int index = 0;

//スプライト単位の中心
Vector2 pivot = new Vector2(0.5f, 0.5f);

for (int row = 0; row < rowMax; ++row) { for (int col = 0; col < colMax; ++col) { //スプライトをスライスする順番がやや特殊なので、 //ちょっとトリッキーなやり方で格納してある。 index = ((rowMax - row - 1) * colMax) + col; rect = new Rect(col * spWid, row * spHig, spWid, spHig); // ### 実際にスプライトにスライスしている箇所 ### result[index] = Sprite.Create(texture, rect, pivot); result[index].name = texture.name + index; } } [/csharp] 【注意】 上記コードは、あくまで個人的な調査に基づくものなので、利用する場合は自己責任でお願いします。 また、上記方法で読込む場合、読込んだリソースは、UnityのResources管理下にないため、手動で使わなくなったリソースを解放する必要があるようだ。 具体的には、別ステージの読込などでテクスチャが不要になったら、そのテクスチャを使っているGameObjectを破棄した後に、DestroyImmediate(texture)してやれば大丈夫だと思われる。

4年前

コメントを残す

メールアドレスが公開されることはありません。