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

来源:互联网 发布:文明6 mac版 编辑:程序博客网 时间:2024/05/17 04:08
  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. }
0 0
原创粉丝点击