Unity不规则按钮点击区域(UGUI)
一. 前言
游戏开发中,可能有一些不规则按钮,而且必须严格检测不规则区域是否被点击到。一个常见的例子就是地图板块按钮。
二. 最终效果
注:有同学私信说没做出来,所以我把Demo
工程上传到GitHub
中了,感兴趣的同学可以下载来学习。
GitHub
地址:https://github.com/linxinfa/Unity-UIPolygon-Demo
三. 实现
1、创建UICamera
创建一个Camera
,重命名为UICamera
,设置Culling Mask
为UI
,设置相机的投射模式(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
旁边的按钮,即可直接编辑多边形碰撞形状。
最后要调节Width
和Height
,确保包住整个不规则碰撞区域。
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
Unity不规则按钮点击区域(UGUI)的更多相关文章
- ngui处理不规则按钮点击
吐个槽 棋牌类游戏做什么中国地图!!! 然后就要用到不规则按钮点击了 你懂的 213的unity虽然已经加入了polygoncollider 2d的支持 但是 但是 但是 是2d的 也就是说如果不 ...
- UGUI之不规则按钮的响应区域
比如一些不规则按钮最好可以设置它的响应区域.如下图所示,用Polygon Collider2D组件圈出精灵响应事件的区域. 注意 IsRaycastLocationValid 的判断区域是RectTr ...
- Unity 不规则按钮实现
1.先重写Image类,实现对Image图形范围的重写: 2.对不规则按钮添加Polygon Collider2D组件,调整大小圈中要点击的范围: 3.将重写的Image类添加到不规则按钮上时,需要移 ...
- unity不规则按钮解决方案
一种是alpha检测 一种是设置collider 参考: https://zhuanlan.zhihu.com/p/34204396 下面给出第二种方案代码 ///按钮多边形点击方案,注意Canvas ...
- 关于使用Html5 canvas、 map、jquery构造不规则变色点击区域 热点区域
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Android不规则点击区域详解
Android不规则点击区域详解 摘要 今天要和大家分享的是Android不规则点击区域,准确说是在视觉上不规则的图像点击响应区域分发. 其实这个问题比较简单,对于很多人来说根本不值得做为一篇博文写出 ...
- iOS 增加UIButton按钮的可点击区域
在很多时候,按钮可能看起来那么大,但是在它周围进行点击时,都能够触发事件,是因为它的可点击区域比我们看到的button要大. 在使用AutoLayout的时候,我们处理的是按钮的image属性,所以这 ...
- 第七篇、hitTest UITabbar中间突出按钮额外增加可点击区域
简介: 以前UITabbar使用中间有一个凸起按钮时,常常就需要用到hitTest来处理可点击的范围. 示例代码: - (UIView *)hitTest:(CGPoint)point withEve ...
- iOS扩大UIButton按钮的可点击区域
一.开发中遇到的问题 我们在开发时有时遇到这中情况:UI给的图片很小,button的点击区域要求比较大.如果用 setBackgroundImage: 方式设置图片会导致图片也跟着button的fra ...
随机推荐
- java并发编程:深入了解synchronized
简介 synchronized是Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码.同时它还保证了共享变量的内存可见性. ...
- [bug] maven“1.5不支持diamond运算符,请使用source 7或更高版本以启用diamond运算符”
原因 maven打包默认采用jdk 1.5,无法识别<> 解决 在pom.xml中加入: <properties> <maven.compiler.source>1 ...
- [刷题] 257 Binary Tree Paths
要求 给定一棵二叉树,返回所有表示从根节点到叶子节点路径的字符串 示例 ["1->2->5","1->3"] 思路 递归地返回左右子树到叶子节 ...
- 联想ThinkServer服务器安装CentOS7 Redhat7系统 驱动R110i RAID卡
1.下载对应版本的驱动(因为联想没有CentOS的驱动用redhat的驱动就可以). 2.进入BIOS里,在高级设置里找到SATA设置,把SATA模式改成RAID(重启后配置raid),sSATA模式 ...
- 【转载】在Linux系统下用dd命令制作ISO镜像U盘启动盘
#### 将U盘插入USB接口 #umount /dev/sdb* #dd if=/iso存放路径/XXX.iso of=/dev/sdb bs=1M ##### [转载]在Linux系统下用dd命令 ...
- kubernetes架构及deployment应用(4)
Kubernetes Cluster 由 Master 和 Node 组成,节点上运行着若干 Kubernetes 服务. 一.master节点 Master 是 Kubernetes Cluster ...
- Java中JDK,JRE和JVM之间的关系-(转载)
初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Envi ...
- Linux进阶之VMware Linux虚拟机运行提示“锁定文件失败 虚拟机开启模块snapshot失败”的解决办法
问题1:VMware Linux虚拟机运行提示"锁定文件失败 虚拟机开启模块snapshot失败"的解决办法 非正常关闭虚拟机(例如开关机过程中关掉VMware等操作),再次启动虚 ...
- 路由信息相关 route 网卡
目录 route命令 1.查看路由表 2.管理路由 基本网络配置 添加网卡地址 修改网卡UUID route命令 路由表管理命令,路由表主要构成: Destination: 目标网络ID,表示可以到达 ...
- MYSQL导入/迁移后事件不执行
mysql迁移后事件不执行 查看数据库是否开启事件支持 mysql> show variables like 'event_scheduler'; +-----------------+---- ...