🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら

Q&A

解決済

1回答

7335閲覧

Unityで複数画像を読み取り、1枚のテクスチャにまとめる

momiji0210

総合スコア60

0グッド

0クリップ

投稿2021/03/16 07:25

Unityで複数画像(同じサイズ)を読み込み、横並びに
配置して1枚の画像にするという処理をしたいです。

本来、Photoshopなどで配置すればよい話なのですが、
デバッグ用で横並びのテクスチャ(スプライト画像でも可)を作成したいです。

こういった場合、指定した位置に画像をどのように配置すればよいのでしょうか。
調べてみたのですが、画像同士の合成方法がわからなかったため
アドバイスをいただけますと幸いです。

C#

1 public Vector2Int input = new Vector2Int(32, 32); // 一つ一つの画像サイズ 2 public Vector2Int output = new Vector2Int(128, 128); // 出力するサイズ 3 public SpriteRenderer imageOutput = null; 4 5 // Start is called before the first frame update 6 void Start() { 7 Vector2Int sizeSingle = Vector2Int.zero; // 単一画像の配置数 8 sizeSingle.x = (int)Mathf.Floor(output.x / input.x); 9 sizeSingle.y = (int)Mathf.Floor(output.y / input.y); 10 11 Object[] textures; 12 textures = Resources.LoadAll("Image", typeof(Texture2D)); 13 14 foreach (var t in textures) { 15 Debug.Log(t.name); 16 } 17 18 /* 19 Texture2D tex = (Texture2D)textures[3]; 20 21 Sprite sprite = Sprite.Create( 22 texture : tex, 23 rect : new Rect(0, 0, tex.width, tex.height), 24 pivot : new Vector2(0.5f, 0.5f) 25 ); 26 27 imageOutput.sprite = sprite; 28 29 Texture2D texture = new Texture2D(output.x, output.y); 30 */ 31 //Debug.Log(sizeSingle); 32 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Texture2D.SetPixelsTexture2D.SetPixels32のリファレンスの下の方に書き込み範囲を指定できるオーバーロードが載っておりますので、それを使ってみてはいかがでしょうか。

lang

1public Vector2Int input = new Vector2Int(32, 32); // 一つ一つの画像サイズ 2public Vector2Int output = new Vector2Int(128, 128); // 出力するサイズ 3public SpriteRenderer imageOutput = null; 4 5// Start is called before the first frame update 6void Start() { 7 Vector2Int sizeSingle = Vector2Int.zero; // 単一画像の配置数 8 sizeSingle.x = (int)Mathf.Floor(output.x / input.x); 9 sizeSingle.y = (int)Mathf.Floor(output.y / input.y); 10 11 Texture2D[] textures = Resources.LoadAll<Texture2D>("Image"); 12 13 foreach (Texture2D t in textures) { 14 Debug.Log(t.name); 15 } 16 17 Texture2D texture = new Texture2D(output.x, output.y); 18 19 for (int j = 0; j < sizeSingle.y; j++) 20 { 21 bool exitLoop = false; 22 23 for (int i = 0; i < sizeSingle.x; i++) 24 { 25 int index = j * sizeSingle.x + i; 26 27 if (index >= textures.Length) 28 { 29 exitLoop = true; 30 break; 31 } 32 33 Texture2D t = textures[index]; 34 texture.SetPixels32(i * input.x, j * input.y, input.x, input.y, t.GetPixels32()); 35 } 36 37 if (exitLoop) 38 { 39 break; 40 } 41 } 42 43 texture.Apply(); 44 45 Sprite sprite = Sprite.Create( 46 texture : texture, 47 rect : new Rect(0, 0, texture.width, texture.height), 48 pivot : new Vector2(0.5f, 0.5f) 49 ); 50 51 imageOutput.sprite = sprite; 52 53 Debug.Log(sizeSingle); 54}

投稿2021/03/16 11:23

Bongo

総合スコア10811

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momiji0210

2021/03/16 15:59

Bongo様 ありがとうございます!そういった関数用意されているのですね。 お陰様で実装できました。困っていたので本当に助かりました。 丁寧にサンプルソースまでありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問