using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;
[RequireComponent(typeof(PolygonCollider2D))]
public class PolygonClick : Image, IPointerClickHandler
{
public delegate void VoidDelegate(GameObject go);
public VoidDelegate OnClick;
/// <summary>
/// 多边形碰撞器
/// </summary>
PolygonCollider2D polygonCollider;
protected override void Start()
{
//获取多边形碰撞器
polygonCollider = transform.GetComponent<PolygonCollider2D>();
}
public void OnPointerClick(PointerEventData eventData)
{
//对2D屏幕坐标系进行转换
Vector2 local;
local = eventData.position;
local.x = eventData.position.x - (float)Screen.width / 2.0f;
local.y = eventData.position.y - (float)Screen.height / 2.0f;
if (Contains(polygonCollider.points, local))
{
if (OnClick != null)
OnClick(gameObject);
}
}
/// <summary>
/// 使用Crossing Number算法获取指定的点是否处于指定的多边形内
/// </summary>
private bool Contains(Vector2[] pVertexs, Vector2 pPoint)
{
var crossNumber = 0;
for (int i = 0, count = pVertexs.Length; i < count; i++)
{
var vec1 = pVertexs[i];
var vec2 = i == count - 1 // 如果当前已到最后一个顶点,则下一个顶点用第一个顶点的数据
? pVertexs[0]
: pVertexs[i + 1];
if (((vec1.y <= pPoint.y) && (vec2.y > pPoint.y))
|| ((vec1.y > pPoint.y) && (vec2.y <= pPoint.y)))
{
if (pPoint.x < vec1.x + (pPoint.y - vec1.y) / (vec2.y - vec1.y) * (vec2.x - vec1.x))
{
crossNumber += 1;
}
}
}
return (crossNumber & 1) == 1;
}
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;
[RequireComponent(typeof(PolygonCollider2D))]
public class PolygonClick : Image, IPointerClickHandler
{
public delegate void VoidDelegate(GameObject go);
public VoidDelegate OnClick;
/// <summary>
/// 多边形碰撞器
/// </summary>
PolygonCollider2D polygonCollider;
protected override void Start()
{
//获取多边形碰撞器
polygonCollider = transform.GetComponent<PolygonCollider2D>();
}
public void OnPointerClick(PointerEventData eventData)
{
//对2D屏幕坐标系进行转换
Vector2 local;
local = eventData.position;
local.x = eventData.position.x - (float)Screen.width / 2.0f;
local.y = eventData.position.y - (float)Screen.height / 2.0f;
if (Contains(polygonCollider.points, local))
{
if (OnClick != null)
OnClick(gameObject);
}
}
/// <summary>
/// 使用Crossing Number算法获取指定的点是否处于指定的多边形内
/// </summary>
private bool Contains(Vector2[] pVertexs, Vector2 pPoint)
{
var crossNumber = 0;
for (int i = 0, count = pVertexs.Length; i < count; i++)
{
var vec1 = pVertexs[i];
var vec2 = i == count - 1 // 如果当前已到最后一个顶点,则下一个顶点用第一个顶点的数据
? pVertexs[0]
: pVertexs[i + 1];
if (((vec1.y <= pPoint.y) && (vec2.y > pPoint.y))
|| ((vec1.y > pPoint.y) && (vec2.y <= pPoint.y)))
{
if (pPoint.x < vec1.x + (pPoint.y - vec1.y) / (vec2.y - vec1.y) * (vec2.x - vec1.x))
{
crossNumber += 1;
}
}
}
return (crossNumber & 1) == 1;
}
}
2.
unity ui 不规则点击.
1 需要将 图集设置未 可读写.
2 设置 Image.alphaHitTestMinimumThreshold = 0.1f
1 需要将 图集设置未 可读写.
2 设置 Image.alphaHitTestMinimumThreshold = 0.1f