Unity实现新手引导镂空效果

本文实例为大家分享了Unity实现新手引导镂空效果的具体代码,供大家参考,具体内容如下

一、实现思路

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

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

二、这个组件的作用

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

三、代码实现

using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// 实现镂空效果的Mask组件
/// </summary>
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;

 /// <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, _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<RectTransform>();
 }

#if UNITY_EDITOR
 void Update()
 {
 _canRefresh = true;
 _RefreshView();
 }
#endif
}

四、使用说明

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Unity shader实现遮罩效果

    本文实例为大家分享了Unity shader实现遮罩效果的具体代码,供大家参考,具体内容如下 效果: shader代码: Shader "Custom/Mask" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {}//目标图片,即需要被遮罩的图片 _MaskLayer("Culling Mask",2D) = "white"{}//混合的图片,设置

  • Unity3D Shader实现动态屏幕遮罩

    屏幕可视范围跟随目标物体移动,可修改可视范围大小,边缘渐变大小.以及遮罩颜色,支持最高物体数量可在Shader中修改,当前版本支持最多9个物体. 效果图如下: 控制面板如下: Shader代码如下: Shader "Peter/DarkEffect" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { // No culling or depth Cull Off

  • Unity Shader实现新手引导遮罩镂空效果

    这两天实现了下新手引导需要的遮罩镂空shader效果,记录一下. 1.圆形镂空shader代码:  //计算片元世界坐标和目标中心位置的距离 float dis = distance(IN.worldPosition.xy, _Center.xy); //过滤掉距离小于(半径-过渡范围)的片元 clip(dis - (_Radius - _TransitionRange)); //优化if条件判断,如果距离小于半径则执行下一步,等于if(dis < _Radius) fixed tmp = st

  • Unity实现新手引导镂空效果

    本文实例为大家分享了Unity实现新手引导镂空效果的具体代码,供大家参考,具体内容如下 一.实现思路 创建有8个顶点的Mesh,内外边界都是四边形(矩形).只生成内.外边之间的Mesh,内层矩形就产生了镂空部分,外层的4个顶点,是组件自身RectTransform的四个顶点,内层的4个顶点,使用镂空目标(_target)RectTransform的四个顶点.确定内层的顶点的时候需要注意,多数情况下_target和HollowOutMask都不在同一个本地坐标空间,所以需要使用CalculateR

  • Unity shader实现消融效果

    本文实例为大家分享了Unity shader实现消融效果的具体代码,供大家参考,具体内容如下 效果图: shader代码: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Custom/EdgeColo" { Properties { _MainTex ("Texture", 2D) = "white" {} _N

  • iOS 引导页的镂空效果实例

    初衷 最近项目新功能更改较大,产品童鞋要求加入新功能引导,于是一口气花了两天的时间做了一个引导页,当然加上后面的修修补补的时间,就不只两天了,不过这事情其实是一劳永逸的事情,值得做.同时为了能够更好的复用,我把它做成了pod库,项目地址在这里:EAFeatureGuideView. EAFeatureGuideView能做什么 EAFeatureGuideView是UIView的一个扩展,用来做新功能引导提示,达到这样的效果: 局部区域高亮(可以设置圆角) 有箭头指向高亮区域 可以设置一段介绍文

  • iOS中一行代码实现 UIView 镂空效果

    这是一种实现 UIView 镂空效果的方案,可以快速实现任意形状的镂空.文字的镂空.带镂空的毛玻璃效果等.本质上是 UIView 的 maskView 效果. 前言 首先来复习一下遮罩效果的实现.如果我们有一张图片,又恰好有一个圆,当我们把圆设置为图片的遮罩时,会得到这样的结果. 代码实现看上去像是这样: view.maskView = maskView; 那么问题来了,如果我们希望得到下面的结果,该怎么做呢?这看起来像是图层的相减,即原来的图层减去遮罩的部分. 可惜苹果爸爸不够贴心,没有提供方

  • Unity实现虚拟摇杆效果

    本文实例为大家分享了Unity实现虚拟摇杆效果的具体代码,供大家参考,具体内容如下 首先添加两者图片 从左到右分别是Back和Front 将Front放到Back中心 在Front身上添加脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems;//导入命名空间 public class JoyStick : MonoBehavi

  • Unity实现引导页效果

    本文实例为大家分享了Unity实现引导页效果的具体代码,供大家参考,具体内容如下 效果图: 1.创建Canvas,设置RenderMode=ScreenSpace-Overlay,UIScaleMode = ScaleWithScreenSize, ReferenceResolution(x=1080,y=1920) 2.创建一个RawImage,命名为(parentGoImg),并做如下设置 3.在parentGoImg下建几个RawImage,赋予想展示的图片,并做如下设置 4.添加如下脚本

  • Unity Shader模拟玻璃效果

    本文实例为大家分享了Unity Shader实现玻璃效果的具体代码,供大家参考,具体内容如下 Shader "Glass Refraction" { Properties { _MainTex ("Main Tex", 2D) = "white" {} _BumpMap ("Normal Map", 2D) = "bump" {} _Cubemap ("Environment Cubemap&qu

  • Unity实现弧形移动效果

    本文实例为大家分享了Unity实现弧形移动效果的具体代码,供大家参考,具体内容如下 一.实现效果 二.第一种实现方法--弧形插值 using UnityEngine; public class ArcMove : MonoBehaviour { public GameObject curGo;//当前物体 public GameObject targetGo;//目标物体 public float value; private void Update() { //计算中心点 Vector3 ce

  • Unity实现刮奖效果

    本文实例为大家分享了Unity实现刮奖效果的具体代码,供大家参考,具体内容如下 需要一个Shader和一个CS脚本: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Custom/Transparent Colored Eraser" { Properties { _MainTex ("Base (RGB), Alpha (A)",

随机推荐