質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

7681閲覧

UnityでTexture2Dを動的に生成したい

yrema

総合スコア287

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/07/11 21:54

・やりたいこと
ピクセルごとのカラー情報からTexture2Dを生成してSpriteとして表示したい。

・問題
どんな色を指定してもグレーになってしまう。

イメージ説明

c#

1 2 private void ShowSample() 3 { 4 SpriteRenderer sr = GameObject.Find("test").GetComponent<SpriteRenderer>(); 5 6 Color[,] colorArray = new Color[128, 128]; 7 int width = colorArray.GetLength(0); 8 int height = colorArray.GetLength(1); 9 for (int y = 0; y < height; y++) { 10 for (int x = 0; x < width; x++) { 11 // とりあえず1色でお試し 12 // colorArray[x, y] = new Color(1, 0, 0, 1); 13 colorArray[x, y] = Color.green; // ★ここをいくら変えても色が変わらない 14 } 15 } 16 // Color配列からTexture2Dを生成 17 Texture2D texture = CreateTexture(colorArray); 18 // Texture2DからSpriteを生成 19 Sprite sprite = CreateSprite(texture); 20 21 sr.sprite = sprite; 22 } 23 24 /// <summary> 25 /// Colorの二次元配列からTexture2Dを生成 26 /// </summary> 27 /// <param name="colorArray"></param> 28 /// <returns></returns> 29 public static Texture2D CreateTexture(Color[,] colorArray) 30 { 31 int width = colorArray.GetLength(0); 32 int height = colorArray.GetLength(1); 33 var texture = new Texture2D(width, height, TextureFormat.RGBA32, false); 34 35 for (int y = 0; y < texture.height; y++) { 36 for (int x = 0; x < texture.width; x++) { 37 texture.SetPixel(x, y, colorArray[x, y]); 38 } 39 } 40 return texture; 41 } 42 43 /// <summary> 44 /// Texture2DからSpriteを生成 45 /// </summary> 46 /// <param name="tex"></param> 47 /// <returns></returns> 48 private Sprite CreateSprite(Texture2D tex) 49 { 50 return Sprite.Create( 51 tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f)); 52 } 53

◆環境
Unity2020.3.0f1
Windows10

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

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

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

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

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

guest

回答1

0

ベストアンサー

テクスチャを作ったのち、Applyを行ってみてはいかがでしょうか?

lang

1 /// <summary> 2 /// Colorの二次元配列からTexture2Dを生成 3 /// </summary> 4 /// <param name="colorArray"></param> 5 /// <returns></returns> 6 public static Texture2D CreateTexture(Color[,] colorArray) 7 { 8 int width = colorArray.GetLength(0); 9 int height = colorArray.GetLength(1); 10 var texture = new Texture2D(width, height, TextureFormat.RGBA32, false); 11 12 for (int y = 0; y < texture.height; y++) { 13 for (int x = 0; x < texture.width; x++) { 14 texture.SetPixel(x, y, colorArray[x, y]); 15 } 16 } 17 18 texture.Apply(); 19 20 return texture; 21 }

ちなみに、少量でしたら気にせずとも害は小さいかもしれませんが、もし何度もテクスチャやスプライトの作り直しをする場合は、古いオブジェクトの廃棄にも気を遣っていただくともっと望ましいかと思います。
動的に生成したTextureとSpriteはしっかり管理しよう! - エイリアンプログラム」あたりの記事がご参考になるでしょうか?

投稿2021/07/11 22:18

Bongo

総合スコア10811

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

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

yrema

2021/07/12 03:37

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問