一. 前言

游戏开发中,可能有一些不规则按钮,而且必须严格检测不规则区域是否被点击到。一个常见的例子就是地图板块按钮。

二. 最终效果

注:有同学私信说没做出来,所以我把Demo工程上传到GitHub中了,感兴趣的同学可以下载来学习。
GitHub地址:https://github.com/linxinfa/Unity-UIPolygon-Demo

三. 实现

1、创建UICamera

创建一个Camera,重命名为UICamera,设置Culling MaskUI,设置相机的投射模式(Projection)为正交模式(Orthographic),注意主摄像机的Culling Mask去掉UI层。
Canvas使用Screen Space - Camera模式,并赋值UICamera

注意,UICamera不需要Audio Listener,直接去掉。

2. UIPolygon节点

Button的子节点创建一个空节点(这里重命名为UIPolygon),挂上UIPolygon脚本(脚本代码见文章最下面),会自动挂上Polygon Collider 2D组件,将坐标归零。

3. 编辑碰撞区域

选中UIPolygon节点,点击Polygon Collider 2D组件中的Edit Collider旁边的按钮,即可直接编辑多边形碰撞形状。

最后要调节WidthHeight,确保包住整个不规则碰撞区域。

5. 运行测试

运行效果见文章开头。

6. UIPolygon代码

 1 using UnityEngine;
2 using UnityEngine.UI;
3 #if UNITY_EDITOR
4 using UnityEditor;
5 #endif
6
7 [RequireComponent(typeof(PolygonCollider2D))]
8 public class UIPolygon : Image
9 {
10 private PolygonCollider2D _polygon = null;
11 private PolygonCollider2D polygon
12 {
13 get{
14 if(_polygon == null )
15 _polygon = GetComponent<PolygonCollider2D>();
16 return _polygon;
17 }
18 }
19
20 //设置只响应点击,不进行渲染
21 protected UIPolygon()
22 {
23 useLegacyMeshGeneration = true;
24 }
25
26 protected override void OnPopulateMesh(VertexHelper vh)
27 {
28 vh.Clear();
29 }
30
31 public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
32 {
33 return polygon.OverlapPoint( eventCamera.ScreenToWorldPoint(screenPoint));
34 }
35
36 #if UNITY_EDITOR
37 protected override void Reset()
38 {
39 //重置不规则区域
40 base.Reset();
41 transform.position = Vector3.zero;
42 float w = (rectTransform.sizeDelta.x *0.5f) + 0.1f;
43 float h = (rectTransform.sizeDelta.y *0.5f) + 0.1f;
44 polygon.points = new Vector2[]
45 {
46 new Vector2(-w,-h),
47 new Vector2(w,-h),
48 new Vector2(w,h),
49 new Vector2(-w,h)
50 };
51 }
52 #endif
53 }
54
55 #if UNITY_EDITOR
56 [CustomEditor(typeof(UIPolygon), true)]
57 public class UIPolygonInspector : Editor
58 {
59 public override void OnInspectorGUI()
60 {
61 //什么都不写用于隐藏面板的显示
62 }
63 }
64 #endif

参考:http://www.xuanyusong.com/archives/3492

Unity不规则按钮点击区域(UGUI)的更多相关文章

  1. ngui处理不规则按钮点击

    吐个槽  棋牌类游戏做什么中国地图!!!  然后就要用到不规则按钮点击了 你懂的 213的unity虽然已经加入了polygoncollider 2d的支持 但是 但是 但是 是2d的 也就是说如果不 ...

  2. UGUI之不规则按钮的响应区域

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

  3. Unity 不规则按钮实现

    1.先重写Image类,实现对Image图形范围的重写: 2.对不规则按钮添加Polygon Collider2D组件,调整大小圈中要点击的范围: 3.将重写的Image类添加到不规则按钮上时,需要移 ...

  4. unity不规则按钮解决方案

    一种是alpha检测 一种是设置collider 参考: https://zhuanlan.zhihu.com/p/34204396 下面给出第二种方案代码 ///按钮多边形点击方案,注意Canvas ...

  5. 关于使用Html5 canvas、 map、jquery构造不规则变色点击区域 热点区域

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. Android不规则点击区域详解

    Android不规则点击区域详解 摘要 今天要和大家分享的是Android不规则点击区域,准确说是在视觉上不规则的图像点击响应区域分发. 其实这个问题比较简单,对于很多人来说根本不值得做为一篇博文写出 ...

  7. iOS 增加UIButton按钮的可点击区域

    在很多时候,按钮可能看起来那么大,但是在它周围进行点击时,都能够触发事件,是因为它的可点击区域比我们看到的button要大. 在使用AutoLayout的时候,我们处理的是按钮的image属性,所以这 ...

  8. 第七篇、hitTest UITabbar中间突出按钮额外增加可点击区域

    简介: 以前UITabbar使用中间有一个凸起按钮时,常常就需要用到hitTest来处理可点击的范围. 示例代码: - (UIView *)hitTest:(CGPoint)point withEve ...

  9. iOS扩大UIButton按钮的可点击区域

    一.开发中遇到的问题 我们在开发时有时遇到这中情况:UI给的图片很小,button的点击区域要求比较大.如果用 setBackgroundImage: 方式设置图片会导致图片也跟着button的fra ...

随机推荐

  1. node.js的包加载机制

    加载一个模块 require('moduleName'); 现在核心模块中加载,如果核心模块中没有,那么就去node_modules目录下去找,核心模块的优先级最高. 如果加载模块式省略了文件的后缀名 ...

  2. IDEA 全局搜索 Jar 包中源码内容

    引言 项目开发过程中,经常遇到需要在依赖的 Jar 包查看源码,查找类方法和属性,介绍两种在 IDEA 中搜索 Jar 包内容的方式 方式一:双击 SHIFT 快捷键 输入需要查询的类名或方法名 方式 ...

  3. 国外DIY网站

    https://site.douban.com/109950/widget/notes/250072/note/248811721/

  4. C++编程计算图形的面积(圆、矩形)

    C++基础,while循环与if判断实现的计算图形面积 1 #include <iostream> 2 3 int main() { 4 while (true){ 5 int input ...

  5. Ubuntu 16.04安装PyCharm

    PyCharm一个是Python集成开发环境,它既提供收费的专业版,也提供免费的社区版本.PyCharm带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Proj ...

  6. 3. servlet 和 springmvc框架关系

    在springmvc上我们会编写很多相关的配置 编写springmvc.xml 配置映射器 配置 处理适配器 ... web.xml 配置前端控制器 (DispatcherServlet) 官网: h ...

  7. redis中AOF和RDB的关闭方法

    redis中AOF和RDB的关闭方法   问题:当往redis中导入数据时,有时会出现redis server went away的情况: 原因: 导入的数据量太大,而内存不够(即内存1G,但数据有2 ...

  8. 云ERP真的已经玩不转了吗?

    欢迎关注微信公众号:sap_gui (ERP咨询顾问之家) 注:以下云ERP特指Saas ERP,非指ERP系统部署在云端. 不得不说,如今市场对传统ERP的接受度要远比云ERP高得多,95%的中大型 ...

  9. H.265视频编码与技术全析(下)

    H.265视频编码与技术全析(下) 四.帧内预测模式 共35个(h264有9个),包括Planar,DC,33个方向模式: 除了Intra_Angular预测外,HEVC还和H.264/MPEG-4 ...

  10. Git 快速控制

    Git 快速控制 聊聊学习 Git 那些事 现在回想起来,其实接触 Git 的时候是在大一的时候表哥带入门的.当时因为需要做一个项目,所以他教如何使用 Git 将写好的代码推送到 GitHub 上,然 ...