新手引导遮罩挖孔 圆形和方形

新手引导中,有时候需要挖孔遮罩。有时候需求是圆形挖孔,有时候需求是方形挖孔。
以下是通过Shader 实现:

Shader "Custom/UIMaskCircle"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}  
        _MaskShape ("Mask Shape", Float) = 0.0 // 0 for rectangle, 1 for circle  
        _Center ("Center", Vector) = (1250, 1250, 0, 0)  
        _Radius ("Radius", Range(0, 2500)) = 1250
        _Smoothness ("Smoothness", Range(0, 0.1)) = 0.03  
        _HoleSize("HoleSize", Vector) = (1250, 1250, 0, 0)
        _Transparency ("Transparency", Range(0,1)) = 1.0  
    }
    SubShader
    {
        // No culling or depth  
        Cull Off ZWrite Off ZTest [unity_GUIZTestMode]  
        Blend SrcAlpha OneMinusSrcAlpha 
  
        Pass  
        {  
            CGPROGRAM  
            #pragma vertex vert  
            #pragma fragment frag  
              
            #include "UnityCG.cginc"  
  
            struct appdata  
            {  
                float4 vertex : POSITION;  
                float2 uv : TEXCOORD0;  
                fixed4 color : COLOR;  
            };  
  
            struct v2f  
            {  
                float2 uv : TEXCOORD0;  
                float4 vertex : SV_POSITION;  
                fixed4 color : COLOR;  
            };  
  
            sampler2D _MainTex;  
            float4 _MainTex_ST;  
            float _MaskShape; 
            float2 _Center;  
            float _Radius;           
            float _Smoothness;           
            float2 _HoleSize;  
            float _Transparency;  
  
            v2f vert (appdata v)  
            {  
                v2f o;  
                o.vertex = UnityObjectToClipPos(v.vertex);  
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);  
                o.color = v.color;  
                return o;     
            }  
  
            fixed4 frag (v2f i) : SV_Target  
            {  

                float2 uv = i.uv;  

                fixed4 col = tex2D(_MainTex, uv); 
                // Check if the pixel should be masked based on the shape  
                bool isMasked = false;  

                col.a *= _Transparency; // 调整透明度 
                             
                if (_MaskShape == 0.0) // Rectangle mask  
                {  
                    float2 normalizedCenter = _Center * 0.0004 + 0.5;  
                    float2 normalizedHoleSize = _HoleSize * 0.0004;
                   // 计算挖孔矩形的UV坐标  
                    float2 holeUVMin = float2(normalizedCenter.x - normalizedHoleSize.x / 2, normalizedCenter.y - normalizedHoleSize.y / 2);  
                    float2 holeUVMax = float2(normalizedCenter.x + normalizedHoleSize.x / 2, normalizedCenter.y + normalizedHoleSize.y / 2);  
                  
                    // 检查当前片元是否在挖孔矩形内  
                    if (i.uv.x >= holeUVMin.x && i.uv.x <= holeUVMax.x && i.uv.y >= holeUVMin.y && i.uv.y <= holeUVMax.y)  
                    {  
                        // 如果在挖孔内,则设置为透明或其他颜色  
                        col.a = 0; 
                    }
                }  
                else if (_MaskShape == 1.0) // Circle mask  
                {
                    float2 normalizedCenter = _Center * 0.0004 + 0.5;                                
                    float normalizedRadius = _Radius * 0.0004;  
                    float2 toCenter = uv - normalizedCenter;  
                    float dist = length(toCenter);  
                    // Calculate the alpha value without anti-aliasing  
                    float edge = smoothstep(normalizedRadius - _Smoothness, normalizedRadius + _Smoothness, dist);                                                            
                    col.a *= edge;  
                }
                return col;
            }  
            ENDCG 
        }
    }
    FallBack "Diffuse"
}
 

由于shader 坐标原点 和UGUI坐标原点不一致,然后进行了调整。
 

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity新手引导遮罩是一种常见的界面设计元素,用于引导新手玩家了解游戏界面和操作。它通常被用于高亮显示特定的界面元素,并给予玩家相应的提示。 Unity中提供了一些内置的方法来创建新手引导遮罩。首先,开发人员可以使用UGUI(Unity的用户界面系统)来创建游戏界面,之后可以添加一张透明的图片作为新手引导遮罩层。然后,可以使用Unity的2D或3D特效来绘制遮罩层所遮挡住的界面元素。这些特效可以使被遮挡的区域变得模糊或是使其颜色变暗,以突出要引导的界面元素。 在引导过程中,可以根据玩家操作的进度来动态地更新遮罩层的位置和形状。例如,当玩家点击一个按钮时,可以使遮罩层逐渐展开,直到完全显示该按钮为止。还可以使用动画效果来增强引导的效果,如淡入淡出或平滑移动的效果。 同时,为了提供更多的交互性,可以为遮罩层添加响应玩家操作的功能。比如,在遮罩层上添加一个按钮,当玩家点击该按钮时,遮罩层可以自动更新到下一个引导步骤,或者直接跳转至其他相关的功能界面。 总之,Unity新手引导遮罩是一个非常实用的功能,可以帮助开发人员创建出更具吸引力和易于理解的游戏体验。它不仅可以引导玩家了解游戏的操作流程,还可以提供更好的用户体验,使玩家更容易上手游戏。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值