Unity关于新手引导中实现遮罩镂空效果

在新手引导每一步中实现可以遮掉其他部分而显示当前需要点击的部分,只需要在每一步引导的时候设置对应的镂空区域的RectTransform.效果如下图:

代码:

public class SelfMaskSet : MaskableGraphic, ICanvasRaycastFilter
{[SerializeField]public RectTransform _target;private Vector3 _targetMin = Vector3.zero;private Vector3 _targetMax = Vector3.zero;private bool _canRefresh = true;private Transform _cacheTrans = null;/// <summary>/// 设置镂空的目标/// </summary>public void SetTarget(RectTransform target){_canRefresh = true;_target = target;_RefreshView();}private void _SetTarget(Vector3 tarMin, Vector3 tarMax){if (tarMin == _targetMin && tarMax == _targetMax)return;_targetMin = tarMin;_targetMax = tarMax;SetAllDirty();}private void _RefreshView(){if (!_canRefresh) return;_canRefresh = false;if (null == _target){_SetTarget(Vector3.zero, Vector3.zero);SetAllDirty();}else{Bounds bounds = RectTransformUtility.CalculateRelativeRectTransformBounds(_cacheTrans, _target);_SetTarget(bounds.min, bounds.max);}}protected override void OnPopulateMesh(VertexHelper vh){if (_targetMin == Vector3.zero && _targetMax == Vector3.zero){base.OnPopulateMesh(vh);return;}vh.Clear();// 填充顶点UIVertex vert = UIVertex.simpleVert;vert.color = color;Vector2 selfPiovt = rectTransform.pivot;Rect selfRect = rectTransform.rect;float outerLx = -selfPiovt.x * selfRect.width;float outerBy = -selfPiovt.y * selfRect.height;float outerRx = (1 - selfPiovt.x) * selfRect.width;float outerTy = (1 - selfPiovt.y) * selfRect.height;// 0 - Outer:LTvert.position = new Vector3(outerLx, outerTy);vh.AddVert(vert);// 1 - Outer:RTvert.position = new Vector3(outerRx, outerTy);vh.AddVert(vert);// 2 - Outer:RBvert.position = new Vector3(outerRx, outerBy);vh.AddVert(vert);// 3 - Outer:LBvert.position = new Vector3(outerLx, outerBy);vh.AddVert(vert);// 4 - Inner:LTvert.position = new Vector3(_targetMin.x-10, _targetMax.y +10);vh.AddVert(vert);// 5 - Inner:RTvert.position = new Vector3(_targetMax.x + 10, _targetMax.y + 10);vh.AddVert(vert);// 6 - Inner:RBvert.position = new Vector3(_targetMax.x +10, _targetMin.y -10);vh.AddVert(vert);// 7 - Inner:LBvert.position = new Vector3(_targetMin.x -10, _targetMin.y-10);vh.AddVert(vert);// 设定三角形vh.AddTriangle(4, 0, 1);vh.AddTriangle(4, 1, 5);vh.AddTriangle(5, 1, 2);vh.AddTriangle(5, 2, 6);vh.AddTriangle(6, 2, 3);vh.AddTriangle(6, 3, 7);vh.AddTriangle(7, 3, 0);vh.AddTriangle(7, 0, 4);}bool ICanvasRaycastFilter.IsRaycastLocationValid(Vector2 screenPos, Camera eventCamera){if (null == _target) return true;// 将目标对象范围内的事件镂空(使其穿过)return !RectTransformUtility.RectangleContainsScreenPoint(_target, screenPos, eventCamera);}protected override void Awake(){base.Awake();_cacheTrans = GetComponent<RectTransform>();}void Update(){_canRefresh = true;_RefreshView();}public void OnButtonClick() {Debug.Log("测试镂空区域!");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/410329.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab 求解非刚性微分方程(ode45)

语法 1、[t,y] ode45(odefun,tspan,y0) 2、[t,y] ode45(odefun,tspan,y0,options) 3、[t,y,te,ye,ie] ode45(odefun,tspan,y0,options) 4、sol ode45(___)描述 [t,y] ode45(odefun,tspan,y0) 其中&#xff0c;tspan [t0 tf] 为微分方程 odefun 的积分区间&#xff0c;y…

Unity之触发器

目录 &#x1f4d5;一、触发器概念 &#x1f4d5;二、碰撞与触发的区别 &#x1f4d5;三、触发器小实例 一、触发器概念 第一次玩侠盗猎车手是在小学&#xff0c;从那以后就开启了我的五星好市民之路。 下面是小编在小破站截的图&#xff0c;这是罪恶都市最开始的地方&a…

RabbitMQ交换机(1)

1.交换机Exchange RabbitMQ消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列。实际上&#xff0c;通常生产者甚至都不知道这些消息传递传递到了哪些队列中。 相反&#xff0c;生产者只能将消息发送到交换机(exchange)&#xff0c;交换机工作的内容非常简单&am…

uniapp 简易自定义日历

注&#xff1a;此日历是根据接口返回的日期自动对应星期的&#xff0c;返回的数据中也包含星期&#xff0c;其实就是一个div自定义&#xff0c;可根据自己需求更改&#xff1b; 1、组件代码 gy-calendar-self.vue <template><view class"calendar"><…

基于dinoV2分类模型修改

前言 dinoV2已经发布有一段时间了&#xff0c;faecbook豪言直接说前面的结构我们都不需要进行修改&#xff0c;只需要修改最后的全连接层就可以达到一个很好的效果。我们激动的揣摸了下自己激动的小手已经迫不及待了&#xff0c;这里我使用dinoV2进行了实验&#xff0c;来分享…

Angular系列教程之自定义指令

文章目录 前言指令的基本概念在模板中使用指令总结 前言 在Angular中&#xff0c;指令是一种非常强大的工具&#xff0c;用于扩展HTML元素的功能和行为。它们允许我们创建可重用的组件&#xff0c;并在应用程序中的多个地方使用它们。本文将介绍Angular指令的基础知识&#xf…

软件测试|sqlalchemy relationship

简介 SQLAlchemy是一个流行的Python ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它允许我们以面向对象的方式管理数据库。在SQLAlchemy中&#xff0c;relationship是一个重要的功能&#xff0c;用于建立表之间的关系。在本文中&#xff0c;我们将详细探讨relation…

基于MATLAB计算无线通信覆盖(一)环境准备

一、环境 MATLAB 2022b 注&#xff1a;开始仿真前需部署地理坐标区和地理图&#xff0c;最好采用第三种&#xff0c;直接把底图数据下载到本地&#xff0c;防止连接不上网络时只能显示darkwater的底图。 可用于地理坐标区和地理图的底图如下表所示 二、下载底图并安装 工具&…

低代码助力制造业数智转型,激发创新力迎接工业 4.0

随着科技的不断进步&#xff0c;我们迈入了一个崭新的工业时代——工业4.0。这场工业革命不仅颠覆了制造业的传统形象&#xff0c;还为全球生产方式带来了前所未有的变革。 在这一过程中&#xff0c;制造业数字化转型逐渐成为主旋律&#xff0c;而低代码技术在这其中发挥着重要…

Redis 服务器 命令

目录 1.Redis Client Pause 命令 - 在指定时间内终止运行来自客户端的命令简介语法可用版本: > 2.9.50返回值: 返回 OK。如果 timeout 参数是非法的返回错误。 示例 2.Redis Debug Object 命令 - 获取 key 的调试信息简介语法可用版本: > 1.0.0返回值: 当 key 存在时&…

Active Directory监控工具

Active Directory 是 Microsoft 为 Windows 环境实现的 LDAP 目录服务&#xff0c;它允许管理员对用户访问资源和服务实施公司范围的策略。Active Directory 通常安装在 Windows 2003 或 2000 服务器中&#xff0c;它们统称为域控制器。如果 Active Directory 出现故障&#xf…

低代码-详情页组件设计

效果图 详情页数据结构定义 layout:{// 按钮数据buttonLayout:{headButton:[], // 页头按钮footButton:[] // 页脚按钮},// 详情页表单配置config:{}, // 配置组件列表detailLayout:[]}默认行为 进表单初始化&#xff0c;只展示表单属性&#xff0c;隐藏通用、数据、事件tab项…