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

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

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

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

解決済

UnityでMeshRenderを使用したオブジェクトのマテリアルを変更せずに、表示順をSortingLayerで変更したい

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

2回答

0評価

0クリップ

209閲覧

投稿2022/06/16 03:20

編集2022/06/25 11:35

前提

Unityでカメラからの距離に関係なく、複数のカメラを使わずに表示順を制御したいと調べたところ、SortingLayerを使うと実現できそうなのですが、MeshRenderのオブジェクトついて意図した表示になりません。

動作確認

まず、SortingLayerに「Front」を追加。以下のようにSprireRenderの画像を並べ、奥にある星の画像のSortingLayerを「Front」に変更しました。
すると、右の画像のように、カメラから見て奥にある星の画像が水色のてるてる坊主より手前に表示されるようになりました。ここまでは問題ありません。
イメージ説明

また、テキストについても確認してみます。星の画像のSortingLayerを「Default」に戻し、Canvasを使わないTextMeshProを星の奥にテキストを追加。
このTextMeshProのExtra SettingからSortingLayerを「Front」にすると、テキストが手前に表示されるようになりました。これも問題ありません。
イメージ説明

発生している問題

しかし、困ったのはここからです。
ヒエラルキを右クリックして、3Dから選択して作成するプリミティブなオブジェクト、MeshRenderで表示されているオブジェクトはSortingLayerの表示を無視してしまいます。
以下の画像はテキストのSortingLayerを「Front」のままですが、オブジェクトにテキストが隠れてしまっています。
イメージ説明

このMeshRendererを使用したオブジェクトはインスペクタでSortingLayerが表示されていないため、SortingLayerが反映されない(存在しない?)のかと思ったのですが、調べると以下のような変更方法についての記述が幾つか見つかります。
参考
https://tsubakit1.hateblo.jp/entry/2015/01/05/233000
https://qiita.com/miikun109/items/dada342d23bf58cc879f
https://hassakulab.com/knowledges/unity-renderer-order-between-sprite-and-mesh/

試したこと

参考にしたこちらのサイト:https://tsubakit1.hateblo.jp/entry/2015/01/05/233000
のスクリプトを元に、オブジェクトのSortingLayerを明示的にDefaultを指定して見たり、SortingLayerの設定でDefaultより小さいSortingLayerの追加、オブジェクトに設定したりしましたが、やはりオブジェクトの表示にはSortingLayerが反映されず、上記画像の位置関係であれば常に手前に表示されてしまいます。

SortingLayerを使用してMeshRenderを使ったオブジェクトの表示順を変更するにはどうすればよいのでしょうか。

頂いた追記・修正の依頼を元に補足

イメージ説明
Bongoさんの指摘を元にオブジェクトのマテリアルをFadeに変更したところ、上記のように実現することが出来ました。
しかし、この方法では既存の3Dモデルのアセットをすべてのマテリアルを変更しなければならず(それが最初から変えておくか、実行中に動的に変えるかはともかく)、手間が掛かったり、見た目が変わってしまう可能性があります。
ですので、今回作成したプリミティブなオブジェクトのように、マテリアルを変更せずに表示順の変更を実現したいです。

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

確認をしたunityのバージョンは2021.3.4f1です。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

Bongo

2022/06/19 21:04

テラシュールブログさんの記事には、末尾に なお、この方法が使えるのは透明を使っている「スプライト」や「StandardShaderのTransparent/Fade」、「Transparentシェーダー云々」「パーティクルのシェーダー」です。要は透明を使っているシェーダーは描画順にコレを使ってるってだけの話です。 との注意書きがありますが、キューブのマテリアルは変更していますでしょうか。あるいは、マテリアルはデフォルトのままで描画順をコントロールしたい(その場合はおそらくキューブ以外...スプライトやTextMesh Proのマテリアルに手を加えることになる気配がします)ということでしょうか?
退会済みユーザー

退会済みユーザー

2022/06/20 01:01

質問、ありがとうございます。 テラシュールブログさんの記事の末尾は見落としていたので、マテリアルの変更について確認したところ実現したので、補足として追加させていただきました。 しかし、おっしゃっているようにマテリアルをデフォルト、あるいはそのアセットの元のまま変更せずに描画順を変更するのが実現したいことなので(タイトルも変更しました)、この方法では問題が解決しておらず、もし解決方法をご存じならば、ご教授いただければ幸いです。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。