Unity实现新手引导镂空效果的方法-创新互联

这篇文章将为大家详细讲解有关Unity实现新手引导镂空效果的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

10年积累的成都做网站、网站建设、外贸营销网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有兴城免费网站建设让你可以放心的选择与我们合作。

具体内容如下

Unity实现新手引导镂空效果的方法

一、实现思路

创建有8个顶点的Mesh,内外边界都是四边形(矩形)。只生成内、外边之间的Mesh,内层矩形就产生了镂空部分,外层的4个顶点,是组件自身RectTransform的四个顶点,内层的4个顶点,使用镂空目标(_target)RectTransform的四个顶点。确定内层的顶点的时候需要注意,多数情况下_target和HollowOutMask都不在同一个本地坐标空间,所以需要使用CalculateRelativeRectTransformBounds计算出HollowOutMask空间下坐标
这种镂空的表现,可以稍稍提高下性能。因为镂空的位置不参与渲染,Overdraw会降低

UGUI提供了ICanvasRaycastFilter接口,我们实现IsRaycastLocationValid方法,就可以很方便的控制HollowOutMask是否要拦截下在某一点触发的事件

二、这个组件的作用

这个组件做了两件事情:表现上镂空一块区域和不拦截镂空范围上的事件

三、代码实现

using UnityEngine;
using UnityEngine.UI;
 
/// 
/// 实现镂空效果的Mask组件
/// 
public class HollowOutMask : MaskableGraphic, ICanvasRaycastFilter
{
 [SerializeField]
 private RectTransform _target;
 
 private Vector3 _targetMin = Vector3.zero;
 private Vector3 _targetMax = Vector3.zero;
 
 private bool _canRefresh = true;
 private Transform _cacheTrans = null;
 
 /// 
 /// 设置镂空的目标
 /// 
 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, _targetMax.y);
 vh.AddVert(vert);
 // 5 - Inner:RT
 vert.position = new Vector3(_targetMax.x, _targetMax.y);
 vh.AddVert(vert);
 // 6 - Inner:RB
 vert.position = new Vector3(_targetMax.x, _targetMin.y);
 vh.AddVert(vert);
 // 7 - Inner:LB
 vert.position = new Vector3(_targetMin.x, _targetMin.y);
 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();
 }
 
#if UNITY_EDITOR
 void Update()
 {
 _canRefresh = true;
 _RefreshView();
 }
#endif
}

四、使用说明

将以上组件挂载到有RectTransform组件的游戏物体身上,设置Color的颜色以及Target区域的大小即可

——此组件挂载的游戏物体身上只能有一个继承Graphics类的组件
——若自定义添加Image控制Target区域大小,记得将Image的Alpha设置为0并且取消射线检测

关于“Unity实现新手引导镂空效果的方法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站名称:Unity实现新手引导镂空效果的方法-创新互联
当前路径:http://scyanting.com/article/ecpgj.html