首页 >Unity3D频道 >【UGUI研究院】 > UGUI研究院之不规则按钮的响应区域(十四)
2015
05-15

UGUI研究院之不规则按钮的响应区域(十四)

接上一篇文章 UGUI研究院之忽略UI被拦截事件(十三)

比如一些不规则按钮最好可以设置它的响应区域。如下图所示,用Polygon Collider2D组件圈出精灵响应事件的区域。

Snip20150515_2

 

注意 IsRaycastLocationValid 的判断区域是RectTransform的区域。 如果 polygon Collider编辑出来的区域大于RectTransform , 必须调节RectTransform的区域。

例子:比如想把按钮的点击区域改成不规则的。

1.把按钮的image的RaycastTarget关闭勾选

2.在子节点创建新的gameObject挂上下面UIPolygon脚本。

3.编辑Polygon的区域即可。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
#if UNITY_EDITOR
using UnityEditor;
#endif
[RequireComponent(typeof(PolygonCollider2D))]
public class UIPolygon : Image 
{
    private PolygonCollider2D _polygon = null;
    private PolygonCollider2D polygon 
    {
        get{
            if(_polygon == null )
                _polygon = GetComponent<PolygonCollider2D>();
            return _polygon;
        }
    }
    protected UIPolygon()
    {
        useLegacyMeshGeneration = true;
    }
    protected override void OnPopulateMesh(VertexHelper vh)
    {
        vh.Clear();
    }
    public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
    {
        return polygon.OverlapPoint( eventCamera.ScreenToWorldPoint(screenPoint));
    }

 #if UNITY_EDITOR
    protected override void Reset()
    {
        base.Reset();
        transform.localPosition = Vector3.zero; 
        float w = (rectTransform.sizeDelta.x *0.5f) + 0.1f;
        float h = (rectTransform.sizeDelta.y*0.5f)  + 0.1f;
        polygon.points = new Vector2[] 
        {
            new Vector2(-w,-h),
            new Vector2(w,-h),
            new Vector2(w,h),
            new Vector2(-w,h)
          };
    }
#endif
}
#if UNITY_EDITOR
[CustomEditor(typeof(UIPolygon), true)]
public class UIPolygonInspector : Editor
{
    public override void OnInspectorGUI()
    {
    }
}
#endif

 

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

UGUI研究院之不规则按钮的响应区域(十四)》有 39 条评论

  1. 陈文钊说:

    在PC上,如果使用Overlay模式,会报错,要自己手动设置eventCamera吗?

  2. 111说:

    这个用不起来呀,IsRaycastLocationValid报错 NullReferenceException: Object reference not set to an instance of an object
    UIPolygon.IsRaycastLocationValid (Vector2 screenPoint, UnityEngine.Camera eventCamera) (at Assets/UIPolygon.cs:29)

  3. 手机上就不会了。 因为电脑上要判断悬浮状态。。

  4. 哟哟哟说:

    雨松大神,我使用你这种方法在960*640的画布上可以,但是到1920*1080的画布就不行了。而且在960*640的画布上如果我缩小或者放大窗口,也会出现问题。我想请问一下应该怎么修改呢?万分期待你的回复~~~~

  5. 能否针对一个toggle写个例子,框入的响应,不框入的不响应,怎么利用这个脚本去做到

  6. 李响说:

    当你把rendermode换成Camera都不行了,请问有什么好的办法吗

  7. 怎么判断我点击那块区域了,还是要用button么

  8. 我试了好久。添加了一个Polygon Collider2D到Button上,Collider的区域特别小,应该只是0.01倍。最重要的是点击Edit Collider无法编辑。后来找到了http://blog.csdn.net/fg5823820/article/details/48165659这个文章,发现我的Canvas的Z轴不是0,但是此处无法直接修改它。于是修改Canvas组件的Plane Distance直到Z变成0,这个时候奇迹发生了,Polygon Collider可以编辑了,虽然不明所以,不过我觉得可以分享给大家~

  9. 朋友说:

    这个方法好像不支持屏幕缩放吧!

  10. FG911说:

    居然不可以超过图片区域,这点相当不灵活啊

    • 林泽新说:

      你可以建一个空UI对象(想多大就多大,反正包住Collider就行),将图片作为他的子对象,Collider针对这个空UI对象,这样图片区域的限定就没有了。

    • 林泽新说:

      你可以建一个空UI对象(想多大就多大,反正长宽能包住Collider就行),将图片作为他的子对象,Collider针对这个空UI对象操作,这样图片区域的限定就没有了。

  11. 大概是判断点击在图像上的位置,来判断是否可以触发点击事件!

  12. upbins说:

    大大,如何设置图片啊。初学者求指导

  13. Dido说:

    謝謝你 雨松大大

  14. 甲霸银银说:

    请问判断点是否在区域内能否直接使用Collider2D.OverlapPoint?

  15. 博皞说:

    可以使用Image的eventAlphaThreshold啦~~~设置前需要改一下Sprite的TextureType用Advanced,然后设置Read/Write Enabled,还要不使用Sprite Atlas…限制挺多..

  16. 菜菜说:

    大神我想问下,为什么我设置了区域,点击其他地方还是会响应点击事件

  17. 美美说:

    大神,我想问下,如何扩大图片的响应区域呀?我发现当Collider2D组件范围超出图片之后。超出的那部分不会响应事件,IsRaycastLocationValid函数也没有触发。

  18. 铭戒说:

    好办法,用来改成3D物品响应也应该可以哦

留下一个回复

你的email不会被公开。 必填项已用 * 标注。