unity反向椭圆遮罩shader

Unity uGUI源码深度解析:从核心架构到定制化开发实战 在Unity游戏开发中,UI系统是连接玩家与游戏世界的核心桥梁。其底层原理基于组件化架构与即时渲染管线,通过Canvas、Graphic等核心组件协同工作,实现高效的界面渲染与交互。理解这套机制的技术价值在于,开发者能突破标准UI组件的限制,针对性能瓶颈与特殊交互需求进行深度优化。例如,通过剖析合批机制与脏标记系统,可以显著降低Draw Call,提升帧率;而定制事件系统与Graphic类族,则能实现不规则点击区域、高性能动态文本等复杂应用场景。本文聚焦于uGUI源码层面的定制化开发,通过实战案例演示如何优 阅读详情

策划要求做一个新手引导的遮罩,之前一直没做过新手引导,记得之前游戏都是方框的可以点击区域,其他地方鼠标不能穿透点击。网上找了一下还没找到相关现成的资源,花了一些功夫研究了下。

思路如下:
遮挡点击可以利用Image组件的RaycastTarget.只有透明部分让鼠标可以穿透,就可以复写Image的IsRaycastLocationValid方法.计算是否点击在椭圆内。

制作如下:
因为遮罩是椭圆或者圆形的可点击区域。随便找一个绘制椭圆的shader,改一改
改的一个从椭圆遮罩变为反向椭圆遮罩,椭圆部分alpha为0,可以实现新手引导使用,增加了一点边缘alpha过渡,看起来没毛刺。
_LengthRate用来调整椭圆大小.
_LengthRateTransition是我增加用来增加一点alpha过渡,这样显示出来的圆没毛刺。不过偷懒了,椭圆远的地方和近的地方过渡长度不一样,后面可以优化下。

//对图片的mask处理,只有椭圆部分
Shader "Unlit/Transparent Colored Mask UnRound"
{
	Properties
	{
		_MainTex("Base (RGB), Alpha (A)", 2D) = "black" {}
		_CenterX("CenterX", float) = 0.5
		_CenterY("CenterY", float) = 0.5
		_Width("Width", float) = 0.5
		_Height("Height", float) = 0.15
		_LengthRate("LengthRate", float) = 0.1 
		_LengthRateTransition("LengthRateLerp", float) = 0.01
	}

		SubShader
		{
			LOD 200

			Tags
		{
			"Queue" = "Transparent"
			"IgnoreProjector" = "True"
			"RenderType" = "Transparent"
		}

			Pass
		{
			Cull Off
			Lighting Off
			ZWrite Off
			Fog{ Mode Off }
			Offset -1,-1
			Blend SrcAlpha OneMinusSrcAlpha

			CGPROGRAM
	#pragma vertex vert
	#pragma fragment frag            
	#include "UnityCG.cginc"

			sampler2D _MainTex;
		half4 _MainTex_ST;
		half _CenterX;
		half _CenterY;
		half _Width;
		half _Height;
		half _LengthRate;
		half _LengthRateTransition;

		struct appdata_t
		{
			half4 vertex : POSITION;
			half2 texcoord : TEXCOORD0;
			fixed4 color : COLOR;
		};

		struct v2f
		{
			half4 vertex : SV_POSITION;
			half2 texcoord : TEXCOORD0;
			fixed4 color : COLOR;
		};

		v2f o;

		v2f vert(appdata_t v)
		{
			o.vertex = UnityObjectToClipPos(v.vertex);
			o.texcoord = v.texcoord;
			o.color = v.color;
			return o;
		}

		fixed4 frag(v2f IN) : COLOR
		{
			half2 pt = IN.texcoord - half2(_CenterX,(1 - _CenterY));
			half h = (pt.x*pt.x) / (_Width*_Width) + (pt.y*pt.y) / (_Height*_Height);

			half4  c = tex2D(_MainTex, IN.texcoord) * IN.color;
			half sub = _LengthRate - h;
			if (h < _LengthRate && sub < _LengthRateTransition)
			{
				c.a = c.a - sub / _LengthRateTransition ;
				return c;
			}
			else if (h < _LengthRate)
			{
				discard;
			}

			return c;
		}
			ENDCG
		}
		}

			SubShader
		{
			LOD 100

			Tags
		{
			"Queue" = "Transparent"
			"IgnoreProjector" = "True"
			"RenderType" = "Transparent"
		}

			Pass
		{
			Cull Off
			Lighting Off
			ZWrite Off
			Fog{ Mode Off }
			Offset -1,-1
			ColorMask RGB
			Blend SrcAlpha OneMinusSrcAlpha
			ColorMaterial AmbientAndDiffuse

			SetTexture[_MainTex]
		{
			Combine Texture * Primary
		}
		}
		}
}

配合Image组件使用,令透明区域可以穿透点击,其他地方阻挡。修改IsRaycastLocationValid方法,计算鼠标点击位置。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CGuideImage : Image
{
    [SerializeField]
    protected Vector2 _Center = new Vector2(0.5f, 0.5f);

    [SerializeField]
    protected Vector2 _Size = new Vector2(0.5f, 0.15f);

    [SerializeField]
    protected float radius = 0.1f;

    public bool LocationCanClick = false;

    //BoxCollider2D coll;
    //protected override void Start()
    //{
    //    base.Start();
    //    coll = gameObject.GetComponent<BoxCollider2D>();
    //}

    public void changePlace(Vector2 pos, Vector2 sz, float r)
    {
        _Center = pos;
        _Size = sz;
        radius = r;

        material.SetFloat("_CenterX", pos.x);
        material.SetFloat("_CenterY", pos.y);
        material.SetFloat("_Width", sz.x);
        material.SetFloat("_Height", sz.y);
        material.SetFloat("_LengthRate", r);
    }

    Vector2 local;
    //是否是有效点击位置,返回true表示不能穿透.
    public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
    {
        if (alphaHitTestMinimumThreshold <= 0)
        {
            LocationCanClick = false;
            return true;
        }

        if (alphaHitTestMinimumThreshold > 1)
        {
            LocationCanClick = true;
            return false;
        }



        if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, screenPoint, eventCamera, out local))
        {
            LocationCanClick = true;
            return false;
        }

        //Debug.Log("local" + local.ToString());

        Rect rect = GetPixelAdjustedRect();

        // Convert to have lower left corner as reference point.
        local.x += rectTransform.pivot.x * rect.width;
        local.y += rectTransform.pivot.y * rect.height;

        //Debug.Log("local2" + local.ToString());
        Vector2 at = new Vector2(local.x / rectTransform.sizeDelta.x, 1f - local.y / rectTransform.sizeDelta.y);
        Vector2 pt = at - _Center;
        float h = (pt.x * pt.x) / (_Size.x * _Size.x) + (pt.y * pt.y) / (_Size.y * _Size.y);

        //Debug.Log("to:" + at.x.ToString() + "," + at.y.ToString() + " h :" + h.ToString());

        if (h < radius)
        {
            LocationCanClick = true;
            return false;
        }
        LocationCanClick = false;
        return true;
    }
}

这样就实现了鼠标穿透了,如果用了Input的鼠标点击方法,还可以取LocationCanClick变量来判断是否在区域内。

效果

材质:
在这里插入图片描述

IsRaycastLocationValid方法当时想法是获取alpha来判断是否椭圆区域,但是发现根本没办法拿到,因为走的材质球的,渲染都在显卡,除非是用相机加一个RenderTexture来获取再给Image的图片附加,感觉复杂了,没有进一步研究。

方法有点麻烦,欢迎探讨,相互交流。

UGUI新手引导反向遮罩.unitypackage UGUI做的反向遮罩,导入资源资源包即可使用,适应于新手引导及各种场合,有什么需要请在下方留言,更多有趣资源请关注我的博客 立即下载

相关推荐

UnmaskForUGUI:Unity中uGUI元素的反向掩码

为UGUI取消屏蔽 Unity中uGUI元素的反向掩码。 <<| | | >> 描述 取消遮罩提供以下功能: 反面罩 射线穿过未遮盖的矩形 跟随另一个对象 支持嵌套 零件 产品特点 屏幕截图 揭露 父蒙版组件的反向蒙版。 适合目标/适合于后期更新:适合图形的变换以适合于LateUpdate上的目标变换。 仅适用于儿童:遮罩仅适用于儿童。 显示未遮罩图形:显示与未遮罩渲染区域关联的图形。 取消遮罩RaycastFilter 射线穿过未遮盖的矩形。 您可以单击背面的未屏蔽按钮。 演示版 安装 需求 Unity 5.5或更高版本 支持2017.x,2018.x,2019.x和2020.x.

unity中实现反遮罩(第一张图局部显示第二张图)

反遮罩

han1320226678的博客 1647

UNITY 简易反向遮罩资源文件

UNITY 简易反向遮罩资源文件

Unity UI反向Mask遮罩,零代码,微信扫扫功能

Unity Mask反向遮罩,微信扫扫功能 情景复原: 在程序开发中,需要开发一些 类似扫描二维码的功能。如图 由图所示,其中UI 中间是空的。其他地方是黑色的。而Unity的遮罩组件Mask是无法实现这个效果的。所以查找了一些资源。最后发现… 不需要编写额外的shader和任何代码,只使用自带的功能就可以实现完美的反向遮罩的功能。 原文地址:https://answers.unity.com...

Edwin Lee的博客 6630

Unity3D实现mask遮罩的脚本1

Unity3D实现mask遮罩的脚本 Posted on 2013年04月07日 by U3d / Unity3D脚本/插件/被围观 259 次 Unity3D

VC Spyglass:Lint实战指南之TCL脚本自动化解析

本文详细介绍了如何利用TCL脚本实现VC Spyglass Lint检查的自动化流程。通过实战指南,从基础脚本编写到高级参数化技巧,帮助数字IC设计工程师摆脱手动操作,提升验证效率,并实现与CI/CD流程的集成。

h3i4j的博客 799

【URP】Unity[后处理]晕影Vignette

在Unity中,早期版本通过标准资源包实现,随着URP/HDRP管线的推出,该效果被整合到Volume框架中,成为模块化后处理系统的一部分。‌距离衰减函数‌:通过计算像素坐标与屏幕中心(0.5,0.5)的欧氏距离,使用length(abs(uv - center))生成径向梯度。‌平滑度控制‌:对原始距离值应用pow(saturate(dist), smoothness)运算,通过指数函数调整边缘过渡曲线。‌恐怖游戏‌:高强度(0.7)黑色晕影配合低平滑度(0.1),营造隧道视野效果。

2501_94612082的博客 476

unity 腾讯地图sdk移动和缩放代码

unity 腾讯地图sdk 实现移动端 缩放 和 移动

。。。。。 1283

Unity笔刷系统全解析:从地形绘制到网格雕刻的架构与优化

在游戏开发与虚拟仿真领域,交互式绘制与编辑是核心功能之一,其背后依赖的是笔刷系统这一关键技术。笔刷系统本质上是一个数据驱动的修改器管道,它将离散的用户输入(如鼠标轨迹)转化为对场景对象(如地形高度图、网格顶点)的连续、区域化修改。其技术价值在于为游戏、创意工具及仿真应用提供了直观、高效的实时编辑能力,直接影响用户体验与创作自由度。在Unity引擎中实现一个高性能、可扩展的笔刷系统,需要深入理解其核心架构,这通常包括输入控制器、笔刷逻辑、目标数据接口、可视化反馈及历史记录等模块。针对不同的应用场景,如地形编辑

weixin_34323858的博客 383

用LT1166+MOS管打造实验室级恒流源:闭环反馈与推挽驱动的深度调优

本文详细介绍了基于LT1166电流模式控制器与MOS管推挽架构的实验室级恒流源设计方法。通过闭环反馈调优和动态响应优化,实现带宽达100kHz、纹波低于0.1%的高性能恒流输出,适用于精密仪器校准和半导体测试等场景。重点解析了系统架构设计、MOS管选型策略以及频率响应测试等关键技术要点。

weixin_29290379的博客 208

将 SAP BTP ABAP environment 与 SAP S/4HANA Cloud 公有云版集成:从架构理念到落地实战

本文探讨了在SAP云环境中实现ABAP扩展应用与S/4HANA Cloud系统集成的技术方案。通过建立标准化的远程通信通道,开发者可在SAP BTP ABAP环境中开发扩展应用,同时安全访问S/4HANA Cloud的核心业务数据和服务。文章详细介绍了整体架构设计、开发实现步骤(包括定义通信场景、生成服务消费模型和编写调用代码)以及管理员在S/4HANA侧的配置工作(创建通信安排和技术用户)。通过一个业务伙伴自助注册平台的案例,展示了如何在不修改标准系统的情况下实现云扩展,体现了SAP"干净核心&

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 241

【包教包会】CocosShader实战——挖洞(Demo演示战斗迷雾、放大镜、新手引导、转场动画)

挖洞组件,可以实现战争迷雾、放大镜、新手引导、转场动画等效果

CocosCreator水煮肉片饭的博客 785

想在 Visual Studio Code 里进行 ABAP 开发,需要安装的扩展列表

安装完毕后,我们可以将 SAP 系统配置为 Visual Studio Code 连接的远程文件系统。为了连接到 SAP 系统,需要启用 ABAP 开发工具 (ADT) ICF 节点,这与 SAP Hana Studio 等工具使用的服务相同。打开 SAP GUI 并连接到目标系统,运行事务 SICF,然后激活 ADT_SRV 服务,如下所示。这启用了允许代码编辑器和 IDE 连接到 SAP 系统的服务。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3125

UNITY UI简易反向遮罩

UNITY UI简易反向遮罩

qq_55895529的博客 2016

Eclipse邂逅Deepseek:本地化部署全攻略

通过前面一系列的步骤,我们成功地在 Eclipse 中完成了 Deepseek 的本地化部署,并且对部署后的功能进行了测试和优化,还解决了可能遇到的一些常见问题。这一过程不仅让我们体验到了将强大的大语言模型与高效的开发环境相结合的魅力,也为我们在软件开发过程中带来了诸多便利。本地化部署 Deepseek 到 Eclipse,使得我们在代码编写过程中能够获得智能的代码补全和精准的问答支持,大大提高了开发效率。同时,本地化部署保障了数据的安全性和隐私性,避免了数据在传输过程中可能面临的风险。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 4522

基于STM32设计的智能防盗单车锁_349

本设计基于STM32F103RCT6单片机,研制了一种适用于户外环境的智能防盗单车锁系统。系统集成了GPS定位模块、ADXL345加速度传感器、4G通信模块(Air780E)、OLED显示屏、继电器模拟锁控模块等硬件,通过姿态感知实现车辆异常移动检测,在锁车状态下自动触发蜂鸣器报警并通过短信与APP通知用户。

868

【免费下载】 探索Unity中的反向遮罩:Mask Inverter

在Unity的UI开发中,遮罩(Mask)组件是一个非常常用的工具,用于限制子元素的显示区域。然而,有时我们需要的是反向遮罩,即遮罩区域外的部分显示,而遮罩区域内的部分隐藏。为了满足这一需求,`Mask Inverter`应运而生。`Mask Inverter`是一个开源的Unity插件,它允许开发者轻松实现反向遮罩效果,极大地扩展了Unity UI的灵活性和表现力。 ## 项目技术分析 `M...

gitblog_00862的博客 1309

RuntimeError: The current installed version of g++ (4.8.5) is less than the mininum version CUDA解决方案

本文主要介绍了RuntimeError: The current installed version of g++ (4.8.5) is less than the mininum version CUDA解决方案,希望能对学习python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 8万+

Unity遮罩 反向遮罩实现

1 .创建两个材质球 分别是遮罩和背景 参数值如下设置 2 创建两个image 放在同一层级 3 把材质托给 image 效果实现

梦回唐朝 3781

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Unity使用反向遮罩实现镂空shader

2,使用两张image,遮罩层在父节点,被遮罩层在子节点,然后分别添加材质球与镂空图片。

Tel17610887670的博客 1499

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

UnityGUI扩展实例:图片挖洞效果 Mask的反向实现

转载自https://www.taidous.com/forum.php?mod=viewthread&fid=211&tid=55259 我想大家在用uGUI做界面时,可能经常会碰到一种需求,就是在图片上“挖洞”。 说起来我们可以有几种实现方案,比如最简单的方式,直接导入带有“洞”的图片。这种方式简单,但不适合需要动态变化的场合。考虑有这种需求:当我们上线一个新功...

angle0524的博客 2279

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【亲测免费】 Unmask For UGUI:Unity中的反向遮罩神器

作者:[mob-sakai](https://github.com/mob-sakai) 许可证:MIT

gitblog_00635的博客 732

Unity反向遮罩:Mask Inverter组件详解

在Unity UI开发中,遮罩(Mask)组件是常用的界面元素控制工具,用于限制子元素的显示区域。然而,有时我们需要实现反向遮罩效果,即遮罩区域外的部分显示,而遮罩区域内的部分隐藏。`Mask Inverter`正是为此需求而生的开源Unity插件,它扩展了Unity的遮罩功能,为开发者提供了更灵活的UI设计可能性。 ## 技术原理分析 `Mask Inverter`的核心技术在于对Unity

gitblog_00479的博客 461

Diem旅游出行:区块链技术如何重塑共享经济与支付体验

Diem区块链技术正在彻底改变旅游出行行业的支付方式和共享经济模式。作为新一代的区块链支付网络,Diem通过其创新的双因素认证机制和旅行规则协议,为全球旅游行业提供了一个安全、高效且合规的支付解决方案。Diem的核心优势在于其能够将复杂的跨境支付流程简化为几个简单的步骤,同时确保完全符合国际金融监管要求。 ## 🔒 Diem双因素认证机制:保障旅游支付安全 Diem的**双因素认证模块**是

gitblog_00038的博客 1184

Unity反向遮罩技术突破:Mask Inverter组件全方位革新指南

在Unity UI开发中,传统遮罩(Mask)组件如同给界面元素戴上了"可视枷锁"🔒——只能显示遮罩区域内的内容。当我们需要实现**反向显示逻辑**(如高亮提示框外区域、创建异形裁切效果)时,开发者不得不编写复杂的自定义着色器或使用多相机分层渲染,这不仅增加开发成本,还可能导致性能损耗。 ## 核心价值:三大创新突破 **1. 组件化逆向思维** 将原本需要 shader 编程的复杂逻辑

gitblog_00113的博客 344
上一篇: 简单的加密解密
下一篇: 利用加速度转盘的实现
Thinbug
博客等级 码龄22年 2万+粉丝 187原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinbug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值