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

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

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

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

Unity

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

Q&A

解決済

1回答

2840閲覧

【Unity】ビルド後とエディター上でのテクスチャの挙動の違いを修正したい

amisia

総合スコア12

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2022/03/20 19:32

前提・実現したいこと

現在、以下のGIFの様にPlaneオブジェクトに貼り付けたテクスチャの上をオブジェクトが通った部分だけ透明で塗るという処理を実装しています。
この処理は
https://www.wwwmaplesyrup-cs6.work/entry/2020/01/20/010704
を参考にしました。このGIFはUnityエディタ上です。
イメージ説明
この処理をビルドすると、なぜか以下のGIFの様にオブジェクトがテクスチャに触れた瞬間に置き換わってしまいます。この現象を修正したいです。このGIFはビルド後です。
イメージ説明
ちなみにビルド設定はプラットフォームがWindows、Architectureが64bitです。
イメージ説明
さらにテクスチャのインポート設定は以下の画像の様になっており、フォーマットをRGBA32bitに変更しています。
ちなみにプラットフォーム事のオーバーライドはしていません。
このテクスチャから作成したマテリアルはシェーダがStandardでレンダリングモードをFadeにしています。
イメージ説明

該当のソースコード

実際のスクリプトはかなり長いので関係ある部分以外は省略しました。
処理としてはオブジェクトから真下にRayを飛ばして、先程のPlaneにRayが衝突したらUpdate内の処理が呼び出されるという感じです。
_tex1はTexture2D型で宣言、_paintObj1はGameObject型で宣言し先程のPlaneオブジェクトをインスペクターから入れています。

C#

1ソースコード 2void Start() 3 { 4 _tex1 = new Texture2D(_paintObj1.GetComponent<Renderer>().material.mainTexture.width, _paintObj1.GetComponent<Renderer>().material.mainTexture.height,TextureFormat.RGBA32,false); 5 Graphics.CopyTexture(_paintObj1.GetComponent<Renderer>().material.mainTexture, 0, 0, _tex1, 0, 0); 6 } 7 8void Update() 9 { 10 Vector2 pixelUV1 = hit.textureCoord; 11 pixelUV1.x *= _tex1.width; 12 pixelUV1.y *= _tex1.height; 13 14 _tex1.SetPixels((int)pixelUV1.x - _brush.brushWidth / 2, (int)pixelUV1.y - _brush.brushHeight / 2, _brush.brushWidth, _brush.brushHeight, _brush.colors); 15 _tex1.Apply(); 16 renderer.material.mainTexture = _tex1; 17 }

試したこと

この処理を実装した当初にテクスチャのフォーマットをAutomaticにしていた為に、エディタ上でも今回のビルド後の様な現象が発生していました。
その問題はテクスチャのフォーマットをRGBA32bitに変更することで修正できました。そのため今回も同様の原因と考えましたが、設定を見直しても一向に改善しませんでした。

補足情報(FW/ツールのバージョンなど)

Unity 使用ver. 2019.3.9f1

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

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

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

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

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

guest

回答1

0

ベストアンサー

Unity 2021.2.16f1上でWindows 64bit向けにビルドしてCopyTextureを試してみたところ、確かにおっしゃるようにプレイモードだとコピーできるのに、ビルドして実行した場合だと失敗してしまいました(詳細な手順をご説明いただいたおかげでやりやすかったです)。ですがあいにくログファイルを見てみても特にエラーらしきものは出力されておらず、なぜダメなのかいまいちはっきりしませんでした。

Issue Trackerに「Graphics.CopyTexture can not copy texture in Built project if "Read/Write" is not enabled」とか「Graphics.CopyTexture() fails in Build when copying a source texture with Read/Write disabled」といった報告がありましたので、試しにコピー元テクスチャの「Read/Write」をオンにしてみたところ、どうやらビルド後でもちゃんとテクスチャがコピーされるようでした。

ご参考になさった「【Unity】オブジェクトのUV値を取得して色をつける方法 - めーぷるのおもちゃばこ」では、

※他のブログでは、テクスチャの設定でRead/Writeにチェックを入れると書いているものや、他にもいくつか設定をしているものもありましたが、Read/Writeにチェックを入れるとRead用・Write用のテクスチャが確保されるため容量が倍になるので重たくなるみたいです。
この記事ではテクスチャの設定を変えずにできる方法で書いています。

との理由からそのような手順をとっているご様子ですが、よっぽど巨大・大量のテクスチャを扱うのでもなければ多少のメモリ消費は目をつぶってもいいのではないでしょうか(そもそもこの方法にしても、実行時に同サイズのTexture2Dを新規生成しているわけですから、メモリ使用量の観点からは特にアドバンテージはなさそうに見えるんですがね...)。

投稿2022/03/21 01:06

Bongo

総合スコア10816

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

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

amisia

2022/03/21 07:02

回答ありがとうございます。Bongo様の言う通りRead/Writeにチェックを入れると解決しました。 自分の中でRead/Writeにチェックを入れると処理がとても重くなるという先入観がありましたが、チェックを入れビルドしてみるとFPSはチェックを入れない時と比べ全く変わりませんでした。 アドバイス本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問