Unity中实现新手引导的镂空效果
发布日期:2021-06-30 19:57:13
浏览次数:2
分类:技术文章
本文共 3176 字,大约阅读时间需要 10 分钟。
一:实现思路
——UGUI中的OnPopulateMesh函数:
获取外层的4个顶点,也就是镂空组件自身RectTransform的四个顶点,获取内层的4个顶点,也就是镂空区域的四个顶点。生成内外层之间的Mesh,一共八个三角形,则产生了镂空效果确定内层的顶点的时候需要注意,需要使用CalculateRelativeRectTransformBounds计算出镂空区域在空间下的坐标——UGUI提供了ICanvasRaycastFilter接口,实现IsRaycastLocationValid方法,就可以很方便的控制射线是否穿透
二:代码实现
using UnityEngine;using UnityEngine.UI;////// 镂空遮罩/// public class HollowOutMask : Graphic, ICanvasRaycastFilter{ [Header("镂空区域")] [Space(25)] public RectTransform inner_trans; private RectTransform outer_trans;//背景区域 private Vector2 inner_rt;//镂空区域的右上角坐标 private Vector2 inner_lb;//镂空区域的左下角坐标 private Vector2 outer_rt;//背景区域的右上角坐标 private Vector2 outer_lb;//背景区域的左下角坐标 [Header("是否实时刷新")] [Space(25)] public bool realtimeRefresh; protected override void Awake() { base.Awake(); outer_trans = GetComponent(); //计算边界 CalcBounds(); } protected override void OnPopulateMesh(VertexHelper vh) { if (inner_trans == null) { base.OnPopulateMesh(vh); return; } vh.Clear(); UIVertex vertex = UIVertex.simpleVert; vertex.color = color; //0 outer左下角 vertex.position = new Vector3(outer_lb.x, outer_lb.y); vh.AddVert(vertex); //1 outer左上角 vertex.position = new Vector3(outer_lb.x, outer_rt.y); vh.AddVert(vertex); //2 outer右上角 vertex.position = new Vector3(outer_rt.x, outer_rt.y); vh.AddVert(vertex); //3 outer右下角 vertex.position = new Vector3(outer_rt.x, outer_lb.y); vh.AddVert(vertex); //4 inner左下角 vertex.position = new Vector3(inner_lb.x, inner_lb.y); vh.AddVert(vertex); //5 inner左上角 vertex.position = new Vector3(inner_lb.x, inner_rt.y); vh.AddVert(vertex); //6 inner右上角 vertex.position = new Vector3(inner_rt.x, inner_rt.y); vh.AddVert(vertex); //7 inner右下角 vertex.position = new Vector3(inner_rt.x, inner_lb.y); vh.AddVert(vertex); //绘制三角形 vh.AddTriangle(0, 1, 4); vh.AddTriangle(1, 4, 5); vh.AddTriangle(1, 5, 2); vh.AddTriangle(2, 5, 6); vh.AddTriangle(2, 6, 3); vh.AddTriangle(6, 3, 7); vh.AddTriangle(4, 7, 3); vh.AddTriangle(0, 4, 3); } /// /// 过滤掉射线检测 /// bool ICanvasRaycastFilter.IsRaycastLocationValid(Vector2 screenPos, Camera eventCamera) { if (inner_trans == null) { return true; } return !RectTransformUtility.RectangleContainsScreenPoint(inner_trans, screenPos, eventCamera); } ////// 计算边界 /// private void CalcBounds() { if (inner_trans == null) { return; } Bounds bounds = RectTransformUtility.CalculateRelativeRectTransformBounds(outer_trans, inner_trans); inner_rt = bounds.max; inner_lb = bounds.min; outer_rt = outer_trans.rect.max; outer_lb = outer_trans.rect.min; } private void Update() { if (realtimeRefresh == false) { return; } //计算边界 CalcBounds(); //刷新 SetAllDirty(); }}
转载地址:https://liuhaowen.blog.csdn.net/article/details/104263122 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月12日 20时34分00秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
字体图标库(Font Awesome)的使用--绝佳的图标字体库和CSS框架
2019-04-30
select下拉框分组展示插件的使用--(select-mania插件的使用)
2019-04-30
Java 8新特性之--lambda表达式的使用和应用
2019-04-30
Java Lambda表达式的应用--Stream API操作集合框架
2019-04-30
省市区三级联动插件Distpicker--前端实现地区三级联动
2019-04-30
solr的使用详解
2019-04-30
Myslq连接(JDBC)url属性的参数的设置
2019-04-30
关于Java继承,重载及运行的顺序的总结
2019-04-30
关于Spring MVC与前端的交互
2019-04-30
Mybatis逆向工程的使用
2019-04-30
关于Hibernate的优缺点
2019-04-30
常用的 Maven 命令
2019-04-30
常用的20个正则表达式
2019-04-30
数据结构之顺序表的实现
2019-04-30
数据结构之线性链表
2019-04-30
JQuery使用validate插件完成校验
2019-04-30
关于java的继承
2019-04-30
关于java的内部类
2019-04-30
关于java的枚举
2019-04-30