これちのPost-it

技術ネタをペラペラと

画像の手前にTextMeshを表示していたら見る角度によってTextMeshが消えた

今回見つかった問題

Unityのシーン内でTextMeshを特定の画像の手前に表示しようとした時、特定の角度から眺めるとTextMeshのテキストが消えてしまいました
f:id:korechi:20170810100223g:plain こんな感じに。
(gifの撮影はScreen To Gifというアプリを使いました)
ちゃんとTextMeshは画像より手前にあるはずなのに突然消えてしまう!
一方向からしか見ないなら問題はないんだけど、ARとかVRでオブジェクトを表示するといろんな角度から眺めることもあるので対応する必要があります。
そのため今回、この問題について調査してみました。

発生状況

  • Unity 5.6.2f1
  • OS:Windows10

原因

どうもTextMeshではなく、後ろにある画像オブジェクトのMaterialの設定が良くなかったみたいです。
f:id:korechi:20170810104043p:plain
このように、materialのshaderをUnlit/Transparentにしていました。それを
f:id:korechi:20170810104313p:plain
Unlit/Transparent Cutoutに変えたところTextMeshが消えなくなりました!
f:id:korechi:20170810110411g:plain

おまけ

ビルトインシェーダー

さっきのmaterialのshader、結局どう変わったの?という疑問が自分にあったので、Unityのシェーダー/マテリアルについてちょっと調べました。

ビルトインシェーダー 内容
Standard 石、木、ガラス、プラスチック、金属など「現実世界」のオブジェクトをレンダリングするのに使用され、広範囲のシェーダータイプや組み合わせをサポート
FX ライティングとガラスのエフェクト
GUIとUI UI グラフィック
Mobile モバイル デバイス用に簡素化されたハイパフォーマンス シェーダー
Nature 樹木および地形
Particles パーティクルシステムエフェクト
Skybox すべてのジオメトリの裏側でレンダリングする背景環境
Sprites 2D スプライトシステムとともに使用
Toon カートゥーン(漫画)風のレンダリング
Unlit すべてのライトとシャドウイングを完全にバイパスするレンダリング
Legacy スタンダードシェーダーに取って代わられる古いシェーダーの大きい集合

シェーダー

シェーダーとは、モデル表面のピクセルの見え方を決めるための、数学的な計算とアルゴリズムを格納したスクリプトです。
シェーダーが定義するのは、

  • オブジェクトを描画する方法です。光源の角度や、視野角、そしてその他の関連性のある計算を含む、コードと数学的な計算です。シェーダーでは、エンドユーザーのグラフィックスハードウェアに依存する、さまざまな方法を使う事もできます。
  • テクスチャマップや色、その他数々のマテリアルインスペクターで変更できるパラメータ。

マテリアルが定義するのは、

  • マテリアルをレンダリングするために使用するシェーダー
  • シェーダー パラメーターの特定の値 - テクスチャマップ、色、数的値など
    です。