不规则图形的点击范围问题不规则图形代码
这几天在做LOL游,看到有定制按钮位置的功能。 如下图所示,按钮的位置可以相互不影响地放在附近。 引出常用的点击范围问题来说吧。
在提问画面中看到的按钮为圆形,实际上开发中的图像为方形,如下图所示
直接在Button上单击时,透明区域和非透明区域都会响应单击事件
在这种情况下,如果单击上图的红框区域,则在视觉上单击a的右上角,实际上触发的可能是b技能。
此时,需要使事件仅响应圆形区域的单击
名为ui.image.israycastlocationvalid的API返回是否在点击范围内,如果返回true,则响应点击事件,false不响应
Physics2D.OverlapPoint返回指定的点是否与Collider2D匹配,即是否在Collider2D的范围内
根据以上两个API可以得到以下方式。 创建CircleImage而不是Image。 调整CircleCollider2D,使碰撞区域适应圆形区域。
publicclasscircleimage 3360 image { publicoverrideboolisraycastlocationvalid (vector2screenpoint, cameraeventcamera (recttransformutility.screenpointtoworldpointinrectangle (rect transform,screenpoint,eventcamera,ra ) ) }
不规则图形在上面以圆为例,如果是下图的不规则图形呢
可以使用PolygonCollider2D代替以上的CircleCollider2D
代码中附有可以直接使用的代码
编辑器位于编辑器文件夹中
CustomImage放在普通代码文件夹中
使用时,可以直接在右键单击UI中创建CustomImage并编辑CustomImage的PolygonCollider2D组件
using UnityEditor; using UnityEngine; using UnityEngine.UI; publicclasscustomimageeditor 3360编辑器{ privateconstintui _ layer=5; [ menuitem (' game object/ui/custom image ',priority=0) ] private static void addimage { transformcanvastrans=get cans 选择. activegameobject!=null selection.activegameobject.layer==ui _ layer (image.setparent (selection.activegameobject.transform ) ) } else { image.setparent (canvas trans ); } image.local position=vector3. zero; } privatestatictransformgetcanvastrans () canvas canvas=game object.findobjectoftypecanvas ); if(canvas==null ) gameobjectcanvasobj=new game object (' canvas ' ); 设置层(canvas obj ); canvas obj.addcomponentrecttransform (; canvasObj.AddComponentCanvas ().render mode=render mode.screenspaceoverlay; canvas obj.addcomponentcanvasscaler (; canvas obj.addcomponentgraphicraycaster (; return canvasObj.transform; } else { return canvas.transform; } privatestatictransformaddcustomimage () gameobjectimage=newgameobject ) ' image ); 设置层(图像; image.addcomponentrecttransform; image.addcomponentpolygoncollider 2d (; image.AddComponentCustomImage; return image.transform; } privatestaticvoidsetlayer (gameobjectui ) { ui.layer=UI_LAYER; }} using UnityEngine; using UnityEngine.UI; publicclasscustomimage : image { privatepolygoncollider 2d _ polygon; privatepolygoncollider 2d polygon { get { if } _ polygon==null } { _ polygon=getcomponentpolygoncollider 2d (; } return _polygon; } publicoverrideboolisraycastlocationvalid (vector2screenpoint, cameraeventcamera (recttransformutility.screenpointtoworldpointinrectangle (rect transform,screenpoint,eventcamera,ra ) ) }