因项目要求,希望将文字进行标题那样的弧线排列,如下图:

对FaryGUI的文字Shader进行了一些修改,基本达到要求,shader设置如下:

shader代码如下:
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "FairyGUI/Text-HM"
{
    Properties
    {
        _MainTex ("Alpha (A)", 2D) = "white" {}
        _StencilComp ("Stencil Comparison", Float) = 8
        _Stencil ("Stencil ID", Float) = 0
        _StencilOp ("Stencil Operation", Float) = 0
        _StencilWriteMask ("Stencil Write Mask", Float) = 255
        _StencilReadMask ("Stencil Read Mask", Float) = 255
        _ColorMask ("Color Mask", Float) = 15
        _BlendSrcFactor ("Blend SrcFactor", Float) = 5
        _BlendDstFactor ("Blend DstFactor", Float) = 10
        _Angel("角度",Float)=45
        _Radius("半径",Float)=1
        _TestWidth("宽度",Float)=192
    }
    SubShader
    {
        LOD 100
        Tags
        {
            "Queue" = "Transparent"
            "IgnoreProjector" = "True"
            "RenderType" = "Transparent"
        }
        Stencil
        {
            Ref [_Stencil]
            Comp [_StencilComp]
            Pass [_StencilOp] 
            ReadMask [_StencilReadMask]
            WriteMask [_StencilWriteMask]
        }
        Cull Off
        Lighting Off
        ZWrite Off
        Fog { Mode Off }
        Blend [_BlendSrcFactor] [_BlendDstFactor]
        ColorMask [_ColorMask]
        Pass
        {
            CGPROGRAM
                #pragma multi_compile NOT_GRAYED GRAYED
                #pragma multi_compile NOT_CLIPPED CLIPPED SOFT_CLIPPED
                #pragma vertex vert
                #pragma fragment frag
                #include "UnityCG.cginc"
                struct appdata_t
                {
                    float4 vertex : POSITION;
                    fixed4 color : COLOR;
                    float4 texcoord : TEXCOORD0;
                };
                struct v2f
                {
                    float4 vertex : SV_POSITION;
                    fixed4 color : COLOR;
                    float4 texcoord : TEXCOORD0;
                    #ifdef CLIPPED
                    float2 clipPos : TEXCOORD1;
                    #endif
                    #ifdef SOFT_CLIPPED
                    float2 clipPos : TEXCOORD1;
                    #endif
                    float4 vertexTest:TEXCOORD2;
                };
                sampler2D _MainTex;
                CBUFFER_START(UnityPerMaterial)
                float  _Angel;
               float _Radius;
                float _TestWidth;
                #ifdef CLIPPED
                float4 _ClipBox = float4(-2, -2, 0, 0);
                #endif
                #ifdef SOFT_CLIPPED
                float4 _ClipBox = float4(-2, -2, 0, 0);
                float4 _ClipSoftness = float4(0, 0, 0, 0);
                #endif
                CBUFFER_END
                v2f vert (appdata_t v)
                {
                    v2f o;
                    o.vertexTest.x=v.vertex.x;
                    o.vertexTest.y=v.vertex.y;
                    o.vertexTest.z=v.vertex.z;
                    //根据x算y偏移
                    float oJiao=_Angel*min(abs((v.vertex.x-_TestWidth/2)/(_TestWidth/2) ),1);
                    float a_angel=(180-oJiao)/2;
                    float cab=90-a_angel;
                    float ab=2*_Radius*sin(oJiao/2*UNITY_PI / 180.0);
                    float cb=sin(cab*UNITY_PI / 180.0)*ab;
                    
                    
                      
                    //根据y算x偏移
                    float ruiAngel=(90-a_angel);
                    float ad=(abs(v.vertex.y))/cos(ruiAngel*UNITY_PI / 180.0);
                    float ed=sin(ruiAngel*UNITY_PI / 180.0)*ad;
                   
                    //倾斜偏移
                    float edAngel=90-(180-ruiAngel)/2;
                    float ef=cos(edAngel*UNITY_PI/180.0)*ed;
                    float fq=ef*(sin(edAngel*UNITY_PI/180.0));
                    float eq=ef*(cos(edAngel*UNITY_PI/180.0));
                     if(v.vertex.x>_TestWidth/2)
                    {
                          v.vertex.x-=ed+eq;
                    }
                    else
                    {
                          v.vertex.x+=ed+eq;
                    }
                     v.vertex.y-=(cb);
                     v.vertex.y+=fq*min(abs((v.vertex.x-_TestWidth/2)/(_TestWidth/2) ),1);
                    
                    //
                    // o.vertexTest.x=oJiao;
                    o.vertex = UnityObjectToClipPos(v.vertex);
                    o.texcoord = v.texcoord;
                    #if !defined(UNITY_COLORSPACE_GAMMA) && (UNITY_VERSION >= 550)
                    o.color.rgb = GammaToLinearSpace(v.color.rgb);
                    o.color.a = v.color.a;
                    #else
                    o.color = v.color;
                    #endif
                    // #ifdef CLIPPED
                    // o.clipPos = mul(unity_ObjectToWorld, v.vertex).xy * _ClipBox.zw + _ClipBox.xy;
                    // #endif
                    //
                    // #ifdef SOFT_CLIPPED
                    // o.clipPos = mul(unity_ObjectToWorld, v.vertex).xy * _ClipBox.zw + _ClipBox.xy;
                    // #endif
                    return o;
                }
                fixed4 frag (v2f i) : SV_Target
                {
                    // float a=-i.vertexTest.y/39.0;
                    // return fixed4(a,a,a,1);
                    fixed4 col = i.color;
                    col.a *= tex2D(_MainTex, i.texcoord).a;
                
                    #ifdef GRAYED
                    fixed grey = dot(col.rgb, fixed3(0.299, 0.587, 0.114));  
                    col.rgb = fixed3(grey, grey, grey);
                    #endif
                    #ifdef SOFT_CLIPPED
                    float2 factor = float2(0,0);
                    if(i.clipPos.x<0)
                        factor.x = (1.0-abs(i.clipPos.x)) * _ClipSoftness.x;
                    else
                        factor.x = (1.0-i.clipPos.x) * _ClipSoftness.z;
                    if(i.clipPos.y<0)
                        factor.y = (1.0-abs(i.clipPos.y)) * _ClipSoftness.w;
                    else
                        factor.y = (1.0-i.clipPos.y) * _ClipSoftness.y;
                    col.a *= clamp(min(factor.x, factor.y), 0.0, 1.0);
                    #endif
                    #ifdef CLIPPED
                    float2 factor = abs(i.clipPos);
                    col.a *= step(max(factor.x, factor.y), 1);
                    #endif
                    return col;
                }
            ENDCG
        }
    }
}



















