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 ...
随机推荐
- ES6中函数参数默认值问题
参数默认值 // 以前的参数默认值写法 let fn = (a, b) => { a = typeof a === "undefined" ? 10 : a b = type ...
- goland无法解析go mod问题解决
Goland 版本是 2018.03 由于之前使用GOPATH方式进行存在很多项目,在怎么配置后都无法解析包,但是命令行时正常的. 这边设置全局的设置,开启goland的go mod包管理. 创建新项 ...
- CentOS 7配置静态IP地址的两种方法 来自:互联网
CentOS 7配置静态IP地址的两种方法 来自:互联网 时间:2021-01-12 阅读:4 如果你想要为CentOS 7中的某个网络接口设置静态IP地址,有几种不同的方法,这取决于你是否想要使用网 ...
- shell判断一个变量是否为空方法总结
shell中如何判断一个变量是否为空 shell编程中,对参数的错误检查项中,包含了变量是否赋值(即一个变量是否为空),判断变量为空方法如下: 1.变量通过" "引号引起来 1 2 ...
- www.heihei.work站长日记
____________2020-03-30_________________晴 昨天刚加的游客IP统计选取一部分查了下地址,小朋友你是不是有很多问号??? 36.99.136.142河南 电信 47 ...
- linux进阶之SVN集中式版本控制系统篇
代码上线--版本控制系统 SVN 集中式版本控制系统 git 分布式版本控制系统 SVN是subversion的缩写,即版本控制系统,是一个开放 ...
- Python基础之变量、输入、输出
一.Hello World程序 在Windows终端执行python C:\Users\renyz02>python Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 2 ...
- mysql基础之查询缓存、存储引擎
一.查询缓存 "查询缓存",就是将查询的结果缓存下载,如果查询语句完全相同,则直接返回缓存中的结果. 如果应用程序在某个场景中,需要经常执行大量的相同的查询,而且查询出的数据不会经 ...
- Java public 和 private 访问修饰符
何为封装 从事面向对象编程的 Java 程序员,不可能不知道封装,它是面向对象编程的精髓,非常重要. 那什么是封装?字面意思就是把摆在外面的东西包起来. 一句话,封装就是对外隐藏内部细节. 那为何要封 ...
- Spring IoC容器 XML 配置与加载
IoC 容器 XML 配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...