NGUI根据图片是否透明来决定是否可以点中
2016-07-21 18:14
543 查看
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[RequireComponent(typeof(UIWidget))]
public class UIHitAlphaTest : MonoBehaviour
{
[Range(0.01f,1f)]
public float threshold = 0.5f;
List<UIWidget> childs = new List<UIWidget>();
void Start ()
{
UIWidget w = GetComponent<UIWidget>();
w.hitCheck = HitCheck;
childs.Add(w);
childs.AddRange(w.GetComponentsInChildren<UIWidget>());
}
Vector3 t1p1 = Vector3.zero;
Vector3 t1p2 = Vector3.zero;
Vector3 t1p3 = Vector3.zero;
Vector3 t2p1 = Vector3.zero;
Vector3 t2p2 = Vector3.zero;
Vector3 t2p3 = Vector3.zero;
Vector2 t1uv1 = Vector2.zero;
Vector2 t1uv2 = Vector2.zero;
Vector2 t1uv3 = Vector2.zero;
Vector2 t2uv1 = Vector2.zero;
Vector2 t2uv2 = Vector2.zero;
Vector2 t2uv3 = Vector2.zero;
bool HitCheck(Vector3 worldPos)
{
for (int widgetIndex = 0; widgetIndex < childs.Count; widgetIndex++)
{
UIWidget widget = childs[widgetIndex];
Vector3 localPos = widget.cachedTransform.InverseTransformPoint(worldPos);
Texture2D tex = widget.mainTexture as Texture2D;
for( int i = 0; i < widget.geometry.verts.size; i += 4 )
{
t1p1 = widget.geometry.verts.buffer[i];
t1p2 = widget.geometry.verts.buffer[i + 1];
t1p3 = widget.geometry.verts.buffer[i + 2];
t2p1 = widget.geometry.verts.buffer[i + 2];
t2p2 = widget.geometry.verts.buffer[i + 3];
t2p3 = widget.geometry.verts.buffer[i];
t1uv1 = widget.geometry.uvs.buffer[i];
t1uv2 = widget.geometry.uvs.buffer[i + 1];
t1uv3 = widget.geometry.uvs.buffer[i + 2];
t2uv1 = widget.geometry.uvs.buffer[i + 2];
t2uv2 = widget.geometry.uvs.buffer[i + 3];
t2uv3 = widget.geometry.uvs.buffer[i];
bool t1 = CheckTriangle
(localPos,
t1p1, t1p2, t1p3,
t1uv1, t1uv2, t1uv2,
tex);
bool t2 = CheckTriangle
(localPos,
t2p1, t2p2, t2p3,
t2uv1, t2uv2, t2uv3,
tex);
if (t1 || t2)
{
return true;
}
}
}
return false;
}
bool CheckTriangle(Vector3 pos, Vector3 v1, Vector3 v2, Vector3 v3, Vector2 uv1, Vector2 uv2, Vector2 uv3, Texture2D tex)
{
// Normal of triangle
Vector3 normal = Vector3.Cross( v3-v1, v2-v1 );
if( normal.sqrMagnitude < 0.01f )
return false;
pos = pos - Vector3.Dot( pos-v1,
normal ) * normal; // Project point onto plane
float xScale = (pos.x - v2.x) / (v3.x - v2.x);
float yScale = (pos.y - v1.y) / (v2.y - v1.y);
Vector2 finalUV = new Vector2(uv2.x + (uv3.x - uv2.x) * xScale,
uv1.y + (uv2.y - uv1.y) * yScale);
Color pixel = tex.GetPixel( (int)(finalUV.x * tex.width), (int)(finalUV.y * tex.height) );
return pixel.a >= threshold;
}
}
using System.Collections;
using System.Collections.Generic;
[RequireComponent(typeof(UIWidget))]
public class UIHitAlphaTest : MonoBehaviour
{
[Range(0.01f,1f)]
public float threshold = 0.5f;
List<UIWidget> childs = new List<UIWidget>();
void Start ()
{
UIWidget w = GetComponent<UIWidget>();
w.hitCheck = HitCheck;
childs.Add(w);
childs.AddRange(w.GetComponentsInChildren<UIWidget>());
}
Vector3 t1p1 = Vector3.zero;
Vector3 t1p2 = Vector3.zero;
Vector3 t1p3 = Vector3.zero;
Vector3 t2p1 = Vector3.zero;
Vector3 t2p2 = Vector3.zero;
Vector3 t2p3 = Vector3.zero;
Vector2 t1uv1 = Vector2.zero;
Vector2 t1uv2 = Vector2.zero;
Vector2 t1uv3 = Vector2.zero;
Vector2 t2uv1 = Vector2.zero;
Vector2 t2uv2 = Vector2.zero;
Vector2 t2uv3 = Vector2.zero;
bool HitCheck(Vector3 worldPos)
{
for (int widgetIndex = 0; widgetIndex < childs.Count; widgetIndex++)
{
UIWidget widget = childs[widgetIndex];
Vector3 localPos = widget.cachedTransform.InverseTransformPoint(worldPos);
Texture2D tex = widget.mainTexture as Texture2D;
for( int i = 0; i < widget.geometry.verts.size; i += 4 )
{
t1p1 = widget.geometry.verts.buffer[i];
t1p2 = widget.geometry.verts.buffer[i + 1];
t1p3 = widget.geometry.verts.buffer[i + 2];
t2p1 = widget.geometry.verts.buffer[i + 2];
t2p2 = widget.geometry.verts.buffer[i + 3];
t2p3 = widget.geometry.verts.buffer[i];
t1uv1 = widget.geometry.uvs.buffer[i];
t1uv2 = widget.geometry.uvs.buffer[i + 1];
t1uv3 = widget.geometry.uvs.buffer[i + 2];
t2uv1 = widget.geometry.uvs.buffer[i + 2];
t2uv2 = widget.geometry.uvs.buffer[i + 3];
t2uv3 = widget.geometry.uvs.buffer[i];
bool t1 = CheckTriangle
(localPos,
t1p1, t1p2, t1p3,
t1uv1, t1uv2, t1uv2,
tex);
bool t2 = CheckTriangle
(localPos,
t2p1, t2p2, t2p3,
t2uv1, t2uv2, t2uv3,
tex);
if (t1 || t2)
{
return true;
}
}
}
return false;
}
bool CheckTriangle(Vector3 pos, Vector3 v1, Vector3 v2, Vector3 v3, Vector2 uv1, Vector2 uv2, Vector2 uv3, Texture2D tex)
{
// Normal of triangle
Vector3 normal = Vector3.Cross( v3-v1, v2-v1 );
if( normal.sqrMagnitude < 0.01f )
return false;
pos = pos - Vector3.Dot( pos-v1,
normal ) * normal; // Project point onto plane
float xScale = (pos.x - v2.x) / (v3.x - v2.x);
float yScale = (pos.y - v1.y) / (v2.y - v1.y);
Vector2 finalUV = new Vector2(uv2.x + (uv3.x - uv2.x) * xScale,
uv1.y + (uv2.y - uv1.y) * yScale);
Color pixel = tex.GetPixel( (int)(finalUV.x * tex.width), (int)(finalUV.y * tex.height) );
return pixel.a >= threshold;
}
}
相关文章推荐
- 【最长下降子序列】【动态规划】【二分】XMU 1041 Sequence
- 百度UEditor编辑器使用教程与使用方法
- Leetcode 225. Implement Stack using Queues (Easy) (cpp)
- 【杭电oj】2152 - Fruit(母函数)
- Android开发,建立具有键值对(key-value)关系的spinner
- 隐藏title,requestWindowFeature(Window.FEATURE_NO_TITLE);失效
- leetcode 376. Wiggle Subsequence
- UVA 11538-Chess Queen
- 关于android中的BuildConfig
- Leetcode: N Queen I & II
- MYSQL实现主从insert和query分开操作
- Webpack + vue-loader构建单文件vue组件
- Dialogs 介绍
- 陪学网Axure原型设计比赛开响!你敢来挑战吗?
- 关于OSGI模块化编程中MENIFEST.MF文件中的Required Plug-ins和Imported Packages的区别
- mui中的关闭页面的几种方法
- FLASH禁止覆盖绝对定位 wmode="opaque"
- adbd cannot run as root in production builds的解决方法
- finished with non-zero exit value 2 百度地图jar包
- XEN - Managing and Monitoring Fedora based Xen Guest Systems