unity 3D文字遮挡穿透的问题

unity中有2D的Text,也有3D的Text,我用的是TextMesh

但是当有3D物体在3DText前边时,3DText会穿透,也能看到3DText文字,从网上找到了Shader能够解决文字穿透的问题,但是Text却不支持富文本了。所以我从网上找了解决穿透问题的Shader和支持富文本的Shader,进行了结合,使文字支持不穿透也支持富文本

解决办法:

1. 找到一个字体导入Unity,将字体的Character设置为如下图所示

然后自己写一个Shader(Standard Surface Shader),命名为3DText,内容如下

Shader "GUI/Text3D" {
    Properties {
        //这里的贴图为字体里面的FontTexture
        _MainTex ("Font Texture", 2D) = "white" {}
        _Color ("Text Color", Color) = (1,1,1,1)
    }

    SubShader {

        Tags {
            //渲染队列-通常这个索引用来渲染透明度混合的物体
            "Queue"="Transparent"
            //Projector为投影器,这样设置将会使该物体忽略任何投影类型的材质或贴图的影响
            "IgnoreProjector"="True"
            //渲染透明物体时使用
            "RenderType"="Transparent"
            //预览-平面
            "PreviewType"="Plane"
        }
        //关闭光照 剔除关闭(正背面全部显示) 深度测试开启 深度写入关闭
        //深度测试为当这个物体比深度缓冲中的像素靠近摄像机时显示,否则不显示
        Lighting Off Cull Off ZWrite On Fog { Mode Off }
        //以这个物体的a值为标准,设置颜色缓冲区中的颜色为1-这个物体的a值
        Blend SrcAlpha OneMinusSrcAlpha
        //这里总体设置为不受光照影响,全部渲染。透明处理为打开深度测试,关闭深度写入自己定义颜色混合(以该物体a值为标准)

        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            //大概就是vr ar,xr之类的东西了
            //https://docs.unity3d.com/Manual/SinglePassStereoRendering.html
            #pragma multi_compile _ UNITY_SINGLE_PASS_STEREO STEREO_INSTANCING_ON STEREO_MULTIVIEW_ON
            #include "UnityCG.cginc"

            struct appdata_t {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                UNITY_VERTEX_INPUT_INSTANCE_ID
                //UnityCG.cginc-UnityInstancing.cginc
                //- UNITY_VERTEX_INPUT_INSTANCE_ID Declare instance ID field in vertex shader input / output struct.在a2v或者v2f里面声明id领域
//                #ifdef SHADER_API_PSSL
//                  #define DEFAULT_UNITY_VERTEX_INPUT_INSTANCE_ID uint instanceID;
//              #else
//                  #define DEFAULT_UNITY_VERTEX_INPUT_INSTANCE_ID uint instanceID : SV_InstanceID;
//              #endif
            };

            struct v2f {
                float4 vertex : SV_POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                UNITY_VERTEX_OUTPUT_STEREO
                //UnityCG.cginc-UnityInstancing.cginc
                //- UNITY_VERTEX_OUTPUT_STEREO Declare stereo target eye field in vertex shader output struct.
//              #ifdef UNITY_STEREO_INSTANCING_ENABLED
//                  #define DEFAULT_UNITY_VERTEX_OUTPUT_STEREO                          uint stereoTargetEyeIndex : SV_RenderTargetArrayIndex;
//              #elif defined(UNITY_STEREO_MULTIVIEW_ENABLED)
//                  #define DEFAULT_UNITY_VERTEX_OUTPUT_STEREO float stereoTargetEyeIndex : BLENDWEIGHT0;
//              #endif
            };

            sampler2D _MainTex;
            uniform float4 _MainTex_ST;
            uniform fixed4 _Color;

            v2f vert (appdata_t v)
            {
                v2f o;
                UNITY_SETUP_INSTANCE_ID(v);
                // - UNITY_SETUP_INSTANCE_ID        Should be used at the very beginning of the vertex shader / fragment shader,
//                #define DEFAULT_UNITY_SETUP_INSTANCE_ID(input)      { UnitySetupInstanceID(UNITY_GET_INSTANCE_ID(input)); 
//                  void UnitySetupInstanceID(uint inputInstanceID)
//                  {
//                      #ifdef UNITY_STEREO_INSTANCING_ENABLED
//                          // stereo eye index is automatically figured out from the instance ID
//                          unity_StereoEyeIndex = inputInstanceID & 0x01;
//                          unity_InstanceID = unity_BaseInstanceID + (inputInstanceID >> 1);
//                      #else
//                          unity_InstanceID = inputInstanceID + unity_BaseInstanceID;
//                      #endif
//                  }
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
                //o.stereoTargetEyeIndex = unity_StereoEyeIndex

                //顶点坐标从模型空间(M)转换到观察空间(v,摄像机空间) 等同mul(Unity_MARTIX_MVP, v.vertex)
                o.vertex = UnityObjectToClipPos(v.vertex);
                //因为3dText的网格顶点是由TextMesh生成,TextMesh可以调整顶点颜色,这样可以使用TextMesh调整每个3d字体的特殊颜色,_Color确定总体颜色
                o.color = v.color * _Color;
                //UnityCG.cginc #define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)
                //主要计算_MainTex的tilling和offset但是感觉这个shader里面没有卵用。真的有人调整这个吗
                //感觉可以直接 o.texcoord = v.texcoord
                o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = i.color;
                col.a *= tex2D(_MainTex, i.texcoord).a;
//                col.a = (col.a + tex2D(_MainTex, i.texcoord).a)/2;
                return col;
            }
            ENDCG
        }
    }
}

然后,创建材质球,材质球引用此Shader,并且将字体下的Texture付给材质球

最后将材质球和字体分别赋给TextMesh即可

这样3D文字支持富文本也不会穿透

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Unity 3D文字特效是指在Unity引擎中使用文本来创造出独特的视觉效果和动画效果。它可以使文字呈现出炫酷的外观和动态效果,增强游戏或应用程序的视觉吸引力。 Unity 3D文字特效可以通过使用Unity中的预设或编写自定义的脚本来实现。预设是预先制作好的文本特效,包括旋转、缩放、闪烁、爆炸等效果。用户可以直接在场景中添加这些预设,并调整其参数以获得所需的外观。 另一种方式是通过编写脚本来创建自定义的文字特效。用户可以使用C#或Unity的自带脚本语言来控制文本的动态行为。例如,可以编写一个脚本来使文字改变颜色、随时间变化、根据物理效果进行移动等。 Unity 3D文字特效可以用于游戏中的标题、菜单、角色对话框等各种场景。它可以提升用户体验,增加游戏的乐趣和互动性。通过使用不同的字体、颜色、大小和动画效果,可以为游戏中的文本创造出与众不同的风格和情感。 除了游戏开发,Unity 3D文字特效也可用于其他类型的应用程序,如广告、教育、建模等。它可以帮助开发者更好地传达信息,吸引用户的注意力。 总之,Unity 3D文字特效是一种非常强大和灵活的工具,可以使文字在游戏和应用程序中展现出令人惊叹的效果。无论是通过使用预设还是编写自定义脚本,用户都可以根据自己的需求打造出独特而引人注目的文字效果。 ### 回答2: Unity 3D文字特效是一种用于在Unity游戏引擎中创建和展示炫酷的文字效果的功能。通过这个特效,我们可以在游戏中添加各种各样的文字效果,例如动态的文字动画、闪烁、投影、光影、渐变等等。 要使用Unity 3D文字特效,首先我们需要创建一个3D文本对象。在Unity中,我们可以通过在场景中创建一个空对象,然后将文字网格组件添加到该对象上来实现。添加完组件后,我们可以在资源文件夹中选择任意字体,应用到文本对象上,并设置字体的大小、位置、对齐方式和字间距等属性。 在创建完文本对象后,我们可以通过添加脚本来实现更加复杂的文字特效。例如,我们可以通过脚本来实现文字的旋转、缩放、颜色变化等动画效果。我们还可以通过添加碰撞器和物理材料,使得文字在游戏场景中可交互,例如文字随着玩家的触碰而变大或者发生碰撞。 此外,Unity 3D文字特效还支持使用粒子系统来制作更加震撼的文字效果。我们可以通过创建一个粒子系统,将其以某种方式与文本对象关联起来,从而实现文字的粒子喷射、消散、渐变等效果。通过调整粒子系统的参数,我们可以改变粒子的形状、大小、颜色和运动方式,从而创造出很多独特的文字特效。 总之,Unity 3D文字特效是一个非常强大的功能,可以帮助我们在游戏中创建出各种各样炫酷的文字效果。无论是制作一个悬浮的菜单栏、一个震撼的开场动画,还是一个令人印象深刻的字幕效果,Unity 3D文字特效都可以帮助我们实现。 ### 回答3: Unity 3D文字特效是指在Unity 3D游戏引擎中使用特定技术和工具实现的文字效果。这些效果可以为游戏增添视觉吸引力、增强沉浸感,提升用户的游戏体验。 Unity 3D文字特效有多种实现方式。其中,使用粒子系统是常见的一种方式。通过在Unity中创建和调整粒子系统,我们可以很容易地实现文字的燃烧、爆炸、流动等效果。粒子系统可以控制粒子的形状、速度、大小、颜色等属性,使文字看起来更加生动。 另一种常见的文字特效是使用着色器(Shader)。着色器是以GPU为基础的程序,它可以修改游戏对象或文字的渲染方式。通过使用特定的着色器,我们可以实现文字的发光、阴影、扭曲、反射等效果,从而让文字看起来更加华丽和真实。 此外,Unity 3D还提供了丰富的动画功能,可以用于制作文字的动态效果。我们可以通过在Unity中创建动画控制器和动画序列帧,实现文字的位移、旋转、缩放等动态变换。这样,文字可以在游戏中呈现出平滑流畅的动画效果。 总的来说,Unity 3D文字特效能够提供丰富多样的视觉效果,丰富了游戏的画面和氛围。开发者可以根据游戏的风格和需求,选择适合的特效方式,从而为玩家带来更加吸引人的游戏体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值