NGUI根据图片是否透明来决定是否可以点中

该博文介绍了如何在Unity3D中实现一个名为UIHitAlphaTest的脚本,用于根据图片的透明度决定UI元素是否响应点击事件。脚本通过检查像素的alpha值与预设阈值进行比较,从而确定点击是否有效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. using  UnityEngine ;
  2. using  System.Collections ;
  3. using  System.Collections.Generic ;
  4.  
  5. [RequireComponent ( typeof (UIWidget ) ) ]
  6. public  class UIHitAlphaTest  : MonoBehaviour
  7. {
  8.          [Range (0 .01f,1f ) ]
  9.          public  float threshold  = 0 .5f ;
  10.  
  11.         List <UIWidget > childs  =  new List <UIWidget > ( ) ;
  12.  
  13.          void Start  ( )
  14.          {
  15.                 UIWidget w  = GetComponent <UIWidget > ( ) ;
  16.                 w . hitCheck  = HitCheck ;
  17.  
  18.                 childs . Add (w ) ;
  19.                 childs . AddRange (w . GetComponentsInChildren <UIWidget > ( ) ) ;
  20.          }
  21.  
  22.         Vector3 t1p1  = Vector3 . zero ;
  23.         Vector3 t1p2  = Vector3 . zero ;
  24.         Vector3 t1p3  = Vector3 . zero ;
  25.  
  26.         Vector3 t2p1  = Vector3 . zero ;
  27.         Vector3 t2p2  = Vector3 . zero ;
  28.         Vector3 t2p3  = Vector3 . zero ;
  29.  
  30.         Vector2 t1uv1  = Vector2 . zero ;
  31.         Vector2 t1uv2  = Vector2 . zero ;
  32.         Vector2 t1uv3  = Vector2 . zero ;
  33.  
  34.         Vector2 t2uv1  = Vector2 . zero ;
  35.         Vector2 t2uv2  = Vector2 . zero ;
  36.         Vector2 t2uv3  = Vector2 . zero ;
  37.  
  38.          bool HitCheck (Vector3 worldPos )
  39.          {
  40.                  for  ( int widgetIndex  =  0 ; widgetIndex  < childs . Count ; widgetIndex ++ )
  41.                  {
  42.                         UIWidget widget  = childs [widgetIndex ] ;
  43.                         Vector3 localPos  = widget . cachedTransform . InverseTransformPoint (worldPos ) ;
  44.                         Texture2D tex  = widget . mainTexture  as Texture2D ;
  45.  
  46.                          for (  int i  =  0 ; i  < widget . geometry . verts . size ; i  +=  4  )
  47.                          {
  48.                                 t1p1  =  widget . geometry . verts . buffer [i ] ;
  49.                                 t1p2  =  widget . geometry . verts . buffer [+  1 ] ;
  50.                                 t1p3  =  widget . geometry . verts . buffer [+  2 ] ;
  51.  
  52.                                 t2p1  =  widget . geometry . verts . buffer [+  2 ] ;
  53.                                 t2p2  =  widget . geometry . verts . buffer [+  3 ] ;
  54.                                 t2p3  =  widget . geometry . verts . buffer [i ] ;
  55.  
  56.  
  57.                                 t1uv1  = widget . geometry . uvs . buffer [i ] ;
  58.                                 t1uv2  = widget . geometry . uvs . buffer [+  1 ] ;
  59.                                 t1uv3  = widget . geometry . uvs . buffer [+  2 ] ;
  60.  
  61.                                 t2uv1  = widget . geometry . uvs . buffer [+  2 ] ;
  62.                                 t2uv2  = widget . geometry . uvs . buffer [+  3 ] ;
  63.                                 t2uv3  = widget . geometry . uvs . buffer [i ] ;
  64.  
  65.                                  bool t1  = CheckTriangle
  66.                                          (localPos,
  67.                                                 t1p1, t1p2, t1p3,
  68.                                                 t1uv1, t1uv2, t1uv2,
  69.                                                 tex ) ;
  70.  
  71.                                  bool t2  = CheckTriangle
  72.                                          (localPos,
  73.                                                 t2p1, t2p2, t2p3,
  74.                                                 t2uv1, t2uv2, t2uv3,
  75.                                                 tex ) ;
  76.  
  77.                                  if  (t1  || t2 )
  78.                                  {
  79.                                          return  true ;
  80.                                  }
  81.                          }
  82.                  }
  83.  
  84.                  return  false ;
  85.          }
  86.  
  87.          bool CheckTriangle (Vector3 pos, Vector3 v1, Vector3 v2, Vector3 v3, Vector2 uv1, Vector2 uv2, Vector2 uv3, Texture2D tex )
  88.          {
  89.                  // Normal of triangle
  90.                 Vector3 normal  = Vector3 . Cross ( v3 -v1, v2 -v1  ) ;
  91.  
  92.                  if ( normal . sqrMagnitude  < 0 .01f  )
  93.                          return  false ;
  94.  
  95.                 pos  = pos  - Vector3 . Dot ( pos -v1, normal  )  * normal ;  // Project point onto plane
  96.  
  97.                  float xScale  =  (pos . x  - v2 . x )  /  (v3 . x  - v2 . x ) ;
  98.                  float yScale  =  (pos . y  - v1 . y )  /  (v2 . y  - v1 . y ) ;
  99.  
  100.                 Vector2 finalUV  =  new Vector2 (uv2 . x  +  (uv3 . x  - uv2 . x )  * xScale, uv1 . y  +  (uv2 . y  - uv1 . y )  * yScale ) ;
  101.                 Color pixel  = tex . GetPixel (  ( int ) (finalUV . x  * tex . width )( int ) (finalUV . y  * tex . height )  ) ;
  102.  
  103.                  return pixel . a  >= threshold ;
  104.          }
  105. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值