【Unity】【C#】3DText(TextMesh) を半透明より手前に表示する 
2022/09/01 Thu [edit]
VRM Live Viewer には 3D空間上に名前を表示する機能があるんだけど、それを実装したときの Tips の1つ。
Unity では 3D空間にテキストを表示する方法として 3DText (Text Mesh) というものがあり、常に最前面に表示されるので便利…と思ったら、半透明なものには後ろになってしまうんだよね。
VRM Live Viewer では自由にオブジェクトを配置できるので、最前面に出てくれないと、背景オブジェクトによっては後ろに回ってテキスト(名前)が見えなくなってしまう。
なので、ググってたら描画順を変更するために、シェーダを作ってる例があった。と言っても、これらは逆に後ろに回すためのものだけどね。
(3DText を後ろに周りこませる)
・3D Textの前後関係を正しく表示する
・3DTextの主張を止めたい
しかし、このためだけにシェーダ作るのも何だな~、と思ったので(シェーダはシステム依存が強いので、後々面倒になることが多い)、スクリプトで RenderQueue を変更してみたら、上手くいったので、その時のメモ。
(※) Unity 2020.3.34f1 / Windows11(x64) で確認
●3DText (Text Mesh) のRenderQueue を変更して、透明より手前に表示させる
using UnityEngine;
using UnityEngine.Rendering;
namespace Example
{
public class TextMeshRenderQueue : MonoBehaviour
{
public TextMesh textMesh; //描画順を変更する 3DText をアタッチ
public int renderQueue = (int)RenderQueue.Transparent + 1; //3001 (とりあえず、透過より大きくしておく)
private void Reset()
{
if (textMesh == null)
textMesh = GetComponent<TextMesh>();
}
// Use this for initialization
private void Start()
{
textMesh.font.material.renderQueue = renderQueue;
}
}
}
何らかの 3DText (Text Mesh) の1つにアタッチして、プレイするだけで、描画順が透明の RenderQueue + 1(Transparent+1 [=3000+1]) に変更されるので、常に最前面に表示されるようになる。3001 以上の描画順が他にあるなら、それより大きい値にすれば良い。
ただ欠点としては、TextMesh.font.material が sharedMaterial みたいなもの(?)だったので、3DText ごとに描画順を設定できないことかな。なので、全体で1つの描画順となる。試しに Material を複製して再設定してみたが、なぜか上手く行かなかった。まぁ、使い勝手は悪いが「全てにおいて最前面に表示」みたいな使い方なら、問題無く使える。
(関連記事)
【Unity】【C#】制限付きでテキストのサイズに合わせて他のオブジェクトのサイズも変化させる
【Unity】【C#】RectTransform の矩形の実座標を取得する(GetWorldCorners)
【Unity】【C#】uGUI ドロップダウンの要素をコードで設定と取得、外観のカスタマイズなど
【Unity】【C#】固定背景画像(2D)を表示する
【Unity】【C#】HDR Color を計算(変換)する
【Unity】【C#】ガンマ(Gamma, sRGB) - リニア(Linear) 値の相互変換
| h o m e |