首页 > 编程知识 正文

flash形状提示点使用技巧,unity按钮点击没反应

时间:2023-05-04 12:03:54 阅读:137351 作者:4203

不规则图形的点击范围问题不规则图形代码

这几天在做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 ) ) }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。