欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Unity實現(xiàn)新手引導(dǎo)鏤空效果

 更新時間:2020年02月13日 09:29:58   作者:LLLLL__  
這篇文章主要為大家詳細介紹了Unity實現(xiàn)新手引導(dǎo)的鏤空效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Unity實現(xiàn)新手引導(dǎo)鏤空效果的具體代碼,供大家參考,具體內(nèi)容如下

一、實現(xiàn)思路

創(chuàng)建有8個頂點的Mesh,內(nèi)外邊界都是四邊形(矩形)。只生成內(nèi)、外邊之間的Mesh,內(nèi)層矩形就產(chǎn)生了鏤空部分,外層的4個頂點,是組件自身RectTransform的四個頂點,內(nèi)層的4個頂點,使用鏤空目標(_target)RectTransform的四個頂點。確定內(nèi)層的頂點的時候需要注意,多數(shù)情況下_target和HollowOutMask都不在同一個本地坐標空間,所以需要使用CalculateRelativeRectTransformBounds計算出HollowOutMask空間下坐標
這種鏤空的表現(xiàn),可以稍稍提高下性能。因為鏤空的位置不參與渲染,Overdraw會降低

UGUI提供了ICanvasRaycastFilter接口,我們實現(xiàn)IsRaycastLocationValid方法,就可以很方便的控制HollowOutMask是否要攔截下在某一點觸發(fā)的事件

二、這個組件的作用

這個組件做了兩件事情:表現(xiàn)上鏤空一塊區(qū)域和不攔截鏤空范圍上的事件

三、代碼實現(xiàn)

using UnityEngine;
using UnityEngine.UI;
 
/// <summary>
/// 實現(xiàn)鏤空效果的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>
 /// 設(shè)置鏤空的目標
 /// </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);
 
 // 設(shè)定三角形
 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;
 // 將目標對象范圍內(nèi)的事件鏤空(使其穿過)
 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組件的游戲物體身上,設(shè)置Color的顏色以及Target區(qū)域的大小即可

——此組件掛載的游戲物體身上只能有一個繼承Graphics類的組件
——若自定義添加Image控制Target區(qū)域大小,記得將Image的Alpha設(shè)置為0并且取消射線檢測

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Unity UGUI實現(xiàn)卡片橢圓方向滾動

    Unity UGUI實現(xiàn)卡片橢圓方向滾動

    這篇文章主要為大家詳細介紹了UGUI實現(xiàn)卡片橢圓方向滾動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Revit API取得變量的內(nèi)參名稱實例代碼

    Revit API取得變量的內(nèi)參名稱實例代碼

    這篇文章介紹了Revit API取得變量的內(nèi)參名稱實例代碼,有需要的朋友可以參考一下
    2013-11-11
  • C#語言MVC框架Aspose.Cells控件導(dǎo)出Excel表數(shù)據(jù)

    C#語言MVC框架Aspose.Cells控件導(dǎo)出Excel表數(shù)據(jù)

    這篇文章主要為大家詳細介紹了C#語言MVC框架Aspose.Cells控件導(dǎo)出Excel表數(shù)據(jù),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 最新評論