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

news2024/11/28 12:53:49

在新手引导每一步中实现可以遮掉其他部分而显示当前需要点击的部分,只需要在每一步引导的时候设置对应的镂空区域的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:LT
        vert.position = new Vector3(outerLx, outerTy);
        vh.AddVert(vert);
        // 1 - Outer:RT
        vert.position = new Vector3(outerRx, outerTy);
        vh.AddVert(vert);
        // 2 - Outer:RB
        vert.position = new Vector3(outerRx, outerBy);
        vh.AddVert(vert);
        // 3 - Outer:LB
        vert.position = new Vector3(outerLx, outerBy);
        vh.AddVert(vert);

        // 4 - Inner:LT
        vert.position = new Vector3(_targetMin.x-10, _targetMax.y +10);
        vh.AddVert(vert);
        // 5 - Inner:RT
        vert.position = new Vector3(_targetMax.x + 10, _targetMax.y + 10);
        vh.AddVert(vert);
        // 6 - Inner:RB
        vert.position = new Vector3(_targetMax.x +10, _targetMin.y -10);
        vh.AddVert(vert);
        // 7 - Inner:LB
        vert.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.coloradmin.cn/o/1392678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器变矿机,该如何应对?

开始 恶意的挖矿程序会导致服务器cpu的异常占用&#xff0c;很让人讨厌。起初&#xff0c;我只是使用top命令显示出占用cpu不正常的进程&#xff0c;发现其中一个进程占用了百分之九十九点几&#xff0c;然后通过kill -9 <PID>命令干掉它。但总是过不了几天&#xff0c;…

Linux下安装Mysql【CentOS7 】

Linux下安装Mysql 一、Linux下安装Mysql-5.7.41【tar包下载安装】1.1.首先检查是否已经安装过mysql1.2.下载Linux版本的Mysql-5.71.3.解压缩1.4.安装执行 rpm 安装包需要先下载 openssl-devel 插件1.5.安装 Mysql5.7 执行 rpm 安装包1.6.Mysql相关操作命令1.7.查看Mysql-5.7 临…

2024年【危险化学品生产单位主要负责人】免费试题及危险化学品生产单位主要负责人实操考试视频

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品生产单位主要负责人免费试题考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品生产单位主要负责人实操考试视频题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品生产单位主要…

在ubuntu上交叉编译NVIDIA Jetson的arm64应用程序

在使用orin的时候,由于orin上的cpu编译速度较慢还有其他一些原因没有在自己电脑ubuntu上的x86上直接编译方便。直接在x86上编译出来的程序由于平台不同是不能在arm平台上运行的,要在x86上编译出arm平台的程序需要使用交叉编译工具。 1.在nvidia官网Jetson Linux Archive | N…

直流继电器 JT3-22/5 线圈电压DC220V电磁式 柜内固定安装 JOSEF约瑟

JT3系列直流继电器 系列型号 JT3-42/3电磁继电器;JT3A-40/3电磁继电器 JT3-11/3电磁继电器;JT3A-03/3电磁继电器 JT3-30/3电磁继电器;JT3A-20/3电磁继电器 JT3-02/3电磁继电器;JT3A-12/3电磁继电器 JT3-22/1电磁继电器;JT3A-24/1电磁继电器 JT3-42/1电磁继电器;JT3A-31/1电磁…

【已解决】c语言const/指针学习笔记

本博文源于笔者正在复习const在左与在右&#xff0c;指针优先级、a,&a,*a的区别。 1、const在左与在右 int const *p const int *p int * const p int const * const p const int * const p* 在const右边&#xff0c;指向的数据不可以改变&#xff0c;可以改变地址 * 在c…

二叉树【Java】

文章目录 一、树型结构二、二叉树2.1概念2.2两种特殊的二叉树2.3二叉树的性质2.4二叉树的遍历 三、二叉树的基本操作3.1获取树中节点的个数3.2获取叶子节点的个数3.3获取第K层节点的个数3.4获取二叉树的高度3.5检测值为value的元素是否存在 一、树型结构 树是一种非线性的数据…

Rust 错误处理(下)

目录 1、用 Result 处理可恢复的错误 1.1 传播错误的简写&#xff1a;? 运算符 1.2 哪里可以使用 ? 运算符 2、要不要 panic! 2.1 示例、代码原型和测试都非常适合 panic 2.2 当我们比编译器知道更多的情况 2.3 错误处理指导原则 2.4 创建自定义类型进行有效性验证 …

欧盟玩具CE认证标准EN71详细介绍

玩具EN71认证简介 EN71是欧盟市场玩具类产品的规范标准。许多国家都就这些产品建立了自己的安全规章&#xff0c;生产公司必须保证其产品在该地区销售前符合相关标准。制造商必须对因生产缺陷、不良设计或不适当材料的使用而导致的事故负责。由此在欧洲推出玩具EN71认证法令&am…

设计模式-创建者模式

1.单例模式 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一&#xff0c;此模式保证某个类在运行期间&#xff0c;只有一个实例对外提供服务&#xff0c;而这个类被称为单例类。 使用单例模式要做的两件事 1. 保证一个类只有一个实例 2.…

【UE5】交互式展厅数字博物馆交互是开发实战课程

长久以来&#xff0c;我们总是不断被初学者问到类似这样的问题&#xff1a;如何从头到尾做一个交互式程序开发项目&#xff1f;本套课程尝试对这个问题进行解答。 课程介绍视频如下 【UE5】数字展厅交互式开发全流程 【谁适合学习这门课】 本套课程面向初学者&#xff0c;满足…

关于C#中Monitor的wait/pulse的理解

wait&#xff1a;表示释放对象上的锁并阻止当前线程&#xff0c;直到它重新获取该锁。 pulse&#xff1a;表示通知等待队列中的线程锁定对象状态的更改。 当线程调用 Wait 时&#xff0c;它会释放对象上的锁并进入对象的等待队列。 对象的就绪队列中的下一个线程 (如果有一个…

【数据库】聊聊数据库中的 fetchsize 参数

聊聊数据库中的 fetchsize 参数 1.介绍2.案例3.MySQL 中的 fetchsize4.Oracle 中的 fetchsize 1.介绍 在使用查询语句的时候&#xff0c;经常需要根据条件来进行查询得到最终的总记录条数&#xff0c;然后得到结果之后需要来进行处理。 场景&#xff1a;Java 端从数据库读取 …

【数据结构与算法】之数组系列-20240117

这里写目录标题 一、167. 两数之和 II - 输入有序数组二、164. 最大间距三、128. 最长连续序列四、122. 买卖股票的最佳时机 II五、78. 子集六、75. 颜色分类 一、167. 两数之和 II - 输入有序数组 中等 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递…

【python】基础知识类的语法功能讲解

Python代码定义了一个名为Calculation的类&#xff0c;用于执行基础的数学运算&#xff08;加法、减法、乘法、除法和取模&#xff09;。下面我将详细解释各个部分的功能&#xff0c;并以列表形式总结&#xff1a; 类定义&#xff1a; class Calculation: 定义了一个名为Cal…

Simulink|双机并联自适应虚拟阻抗下垂控制仿真模型

目录 主要内容 模型研究 结果一览 下载链接 主要内容 风电高渗透率下&#xff0c;电力系统对风电场频率调节能力提出了技术要求。考虑风机惯性控制和变桨距控制的频率响应能力&#xff0c;提出将储能与风电自身调频手段相结合&#xff0c;参与系统频率调节。模型…

JSP简单学习

jsp是在html中嵌入java代码 jsp也是在j2ee服务端中的java组件 第一次运行 在第一次运行jsp代码时会经历以下步骤&#xff0c;将jsp转为java代码&#xff0c;将java代码转为class文件。 所以通常会比较慢&#xff0c;编译后就好多了。 四大作用域 requestsessionpageapplica…

25考研英语复习计划

Hello各位小伙伴大家好&#xff0c;今天要给大家分享的是英语备考计划&#xff0c;大家可以作为参考&#xff0c;制定适合自己的备考计划。 【英一/二】 英语分为英一、英二&#xff0c;一般学硕英一&#xff0c;专硕英二。 英一要比英二难度大。 【复习计划】 1-2月&#xf…

python - 无法正常显示xlabel / ylabel

python 无法正常显示xlabel / ylabel 如上述所示&#xff0c; 第一个子图是不带投影的&#xff0c;可以正常显示横纵轴标签和标题第二个子图带有投影&#xff0c;横纵轴通过手动设置范围&#xff0c;可以正常显示横纵轴标签和标题第三个子图带有投影&#xff0c;横纵轴的tick …

基于LDA的评论大数据的分析及主题建模

1.微博的关键词大数据采集&#xff1b; 已完成&#xff0c;待优化 2.LDA 错误1&#xff1a;使用了import pyLDAvis.sklearn&#xff0c;提示没有模块no module named pyldavis.sklearn。 默认安装 pyLDAvis3.4.1&#xff0c;最后降级处理&#xff0c;解决方式&#xff1a; …