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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

1回答

509閲覧

UNITY 3Dモデルのテクスチャをスクリプトから別の名前で保存したい

Qoo

総合スコア1249

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

1クリップ

投稿2018/12/27 04:40

表題の通りですが、3Dモデルのテクスチャをスクリプトから別の名前(.png形式)で保存したいと思います。
3Dのマテリアルは renderer.material.mainTexture になります。

下記のように3Dモデル表示中にスクリーン上に表示されている画像をpngで保存してみたのですが、
単純なスクリーンキャプチャになってしまい、3Dモデルのテクスチャとして適用すると合いません。

3dモデルのテクスチャとして出力するにはどうすればよいでしょうか

c#

1 2void Update() 3{ 4 if(Input.GetMouseButtonDown(0)){ 5 StartCoroutine(TexCreate()); 6 } 7} 8 9private IEnumerator TexCreate() 10{ 11 Texture2D texture = new Texture2D(Screen.width, Screen.height, TextureFormat.ARGB32, false); 12 yield return new WaitForEndOfFrame(); 13 14 texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0); 15 texture.Apply(); 16 17 byte[] bytes = texture.EncodeToPNG(); 18 UnityEngine.Object.Destroy(texture); 19 20 string exportPath = "Assets/tex.png"; 21 File.WriteAllBytes(exportPath, bytes); 22 23} 24

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

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

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

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

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

guest

回答1

0

mainTextureをそのままEncodeToPNGでPNGデータ化しようとしてもダメだったということでしょうか?
でしたら、下記のようなパターンではどうでしょうか。

C#

1using System.IO; 2using UnityEngine; 3 4public class TextureToPng : MonoBehaviour 5{ 6 void Update() 7 { 8 if (Input.GetMouseButtonDown(0)) 9 { 10 TexCreate(); 11 } 12 } 13 14 // マテリアルのテクスチャを保存するならフレーム末尾を待つ必要はないはずなので 15 // コルーチンではなく通常のメソッドにしました 16 private void TexCreate() 17 { 18 // 元のテクスチャ 19 Texture2D sourceTexture = GetComponent<Renderer>().material.mainTexture as Texture2D; 20 21 if (sourceTexture == null) 22 { 23 // mainTextureがRenderTextureである可能性はあるでしょうか? 24 // もしRenderTextureにも対応させたい場合、もうちょっと修正が必要かと思います 25 Debug.LogError("mainTexture is not Texture2D or null!"); 26 return; 27 } 28 29 // 元のテクスチャが読み取り不可かもしれないので、コピーを作成する 30 Texture2D textureClone = new Texture2D(sourceTexture.width, sourceTexture.height, sourceTexture.format, true); 31 Graphics.CopyTexture(sourceTexture, textureClone); 32 33 // さらに、フォーマットがPNG出力に対応していないかもしれないので、もう一枚テクスチャを作成し 34 // 色データを読み取って新しいテクスチャに送り込む 35 Texture2D texture = new Texture2D(sourceTexture.width, sourceTexture.height); 36 texture.SetPixels32(textureClone.GetPixels32()); 37 texture.Apply(); 38 UnityEngine.Object.Destroy(textureClone); 39 40 byte[] bytes = texture.EncodeToPNG(); 41 UnityEngine.Object.Destroy(texture); 42 43 // 念のため申し上げますと、実験目的ならAssets直下に保存してもいいと思いますが 44 // 実際のアプリケーション実行時にはデータ永続保存用の領域...Application.persistentDataPathなどへ 45 // 保存した方がいいでしょう 46 string exportPath = "Assets/tex.png"; 47 File.WriteAllBytes(exportPath, bytes); 48 } 49} 50

もしエラーメッセージや、その他の異常などお気付きの点がありましたらコメントいただけますと、対処のヒントになるかと思います。

投稿2018/12/27 22:58

Bongo

総合スコア10807

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

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

Qoo

2018/12/27 23:21

回答ありがとうございます。 すみません、質問の仕方が悪かったのですが、 mainTextureをPNGで保存できなかったということではなく 3Dのモデルに適用されているテクスチャ(meshに適用されているテクスチャ)を 別のの名前で保存しなおしたいという意味になります。 私のスクリプトですと、pngで保存もできていますが、テクスチャが単なるスクリーンショットなので 3Dモデルのテクスチャとして適用するとおかしくなります。 頂きましたスクリプトも実行してみましたが Debug.LogError("mainTexture is not Texture2D or null!"); に入りました。 もし対応方法がわかるようでしたら教授頂けると助かりますw
Bongo

2018/12/28 00:06

「mainTextureをPNGで保存できなかったということではなく 3Dのモデルに適用されているテクスチャ(meshに適用されているテクスチャ)を 別のの名前で保存しなおしたい」とおっしゃる意味をいまいち理解しきれずすみません。 mainTextureを出力したいオブジェクトは、このPNG出力スクリプトがアタッチされているオブジェクト自体ではなくて別に存在するということでしょうか(たとえば、シーン内のすべてのオブジェクトを走査して、mainTextureを持つRendererが見つかればそれらを全部PNGファイルとして出力したい...とか)? 少なくとも回答に投稿しましたスクリプトでテクスチャを取れなかったということは、このスクリプトをアタッチしたオブジェクトのマテリアルにはテクスチャが付いていなさそうですね... あるいは、renderer.material.mainTextureで取得できるテクスチャは、オブジェクトが複数のマテリアルを持っていてもその内の一つだけですが、それ以外のすべてのマテリアルからもテクスチャを取得したいということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問