昨晚,好友在电话里问我在Unity3d中使用3D Text,不想让其穿透模型显示,即想让场景中的3D Text与模型有正确的遮挡关系,怎么解?
今早谷歌上查了查,明白了原因,因为3D Text的默认材质的shader是GUI/Text Shader(自然就有了GUI的穿透显示的特性),而且不可以去手动更改。
记录解决方式如下:
1、自己写个想要的shader,并建个使用它的材质球;
2、导入自己的中文字体;
3、替换掉3D Text上的默认材质球。
首先,搭建一个好友在电话里描述的场景;
新建一个shader,命名为3D Text Shader,并在其中贴上以下代码:
Shader "Custom/3D Text Shader" { Properties { _MainTex ("Font Texture", 2D) = "white" {} _Color ("Text Color", Color) = (1,1,1,1) } SubShader { Tags{ "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } Lighting Off Cull Off ZWrite On Fog { Mode Off } Blend SrcAlpha OneMinusSrcAlpha Pass { Color [_Color] SetTexture [_MainTex] { combine primary, texture * primary } } } }
给一个截图:
新建一个Material,并指定上刚写的shader;
下一步是导个字体文件进来,去控制面板的字体路径中,找一个喜欢的中文字体复制到Unity3d的Assets文件夹中,我复制了一个黑体过来;
回到Unity3d中,把字体文件的Character选项改为Unicode,这样字体文件下面的那张Font Texture就会出现密密麻麻地文字;
最后,选中场景中的需要被正确遮挡的3D Text物体,进行以下3个操作,就完成了:
1、字体文件拖给Text Mesh组件中的Font;
2、刚才自己建的材质球拖给Mesh Renderer组件中的Element 0;
3、字体下的Font Texture拖给材质球。
如图:
PS:
1、如果要调整字体颜色,3D Text中的Color属性已经失效,需要去调整那个自己建的材质球的Text Color;
2、关于字体,如果无视内存占用的话,字体就去控制面板里面的字体随便复制来用,否则,想做到最优的话,建议去网上找那个三四千字的精简字库。