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 ...
随机推荐
- 阅读vue源码-----内置组件篇(keep-alive)
1.前言: <keep-alive>是vue实现的一个内置组件,也就是说vue源码不仅实现了一套组件化的机制,也实现了一些内置组件. <keep-alive>官网介绍如下:&l ...
- [DB] Hadoop免密登录原理及设置
情景: 现有两台电脑bigdata111.bigdata112,bigdata111想免密码登录bigdata112 过程: 1.bigdata111生成公钥(用于加密,给别人)和私钥(用于解密,自己 ...
- k8s运行容器之Job应用(6)
容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序,完成后容 ...
- 062.Python前段框架Django视图CBV
一 CBV与FBV CBV:Class Based View FBV:Function Based View 之前写过的都是基于函数的view,就叫FBV.还可以把view写成基于类的,那就是CBV. ...
- shell基础之多功能nginx(安装、重启、停止等)
1 #!/bin/bash 2 #要求:检查本机是否已编译安装nginx,检查本机是否存在nginx源码包,编译安装nginx,实现开启.停止.查看状态等功能 3 #检查是否已编译安装nginx 4 ...
- Windows 10正式版官方原版镜像!(备忘)
本文搜集整理微软官方发布的Windows 10正式版镜像下载链接,从RTM原始正式版开始,按照时间倒序排列,即越往上的越新. 注意:以下资源均来自于微软官方原版,ed2k可视为P2P下载链接.下载完成 ...
- 2. Servlet3.0注解方式 @WebServlet
web.xml配置还是比较麻烦,这次使用注解方式 编写servlet import javax.servlet.ServletException; import javax.servlet.annot ...
- SSTI漏洞-fastapi
0x00 原理 SSTI漏洞全称服务器模板注入漏洞,服务器模板接收了用户输入的恶意代码,未经过滤便在服务端执行并通过渲染模板返回给用户,使得用户可以通过构造恶意代码在服务端执行命令. 0x01 c ...
- 使用vue-cli 来创建vue项目
前置条件 需要安装node环境 安装vue\cli工具 vue\cli官网 传送门 vue-cli 安装node.js nodejs中文网 点击之后会发现这个界面 可以点击下载或者选择其他版本的包,尽 ...
- JVM-栈帧之局部变量表
1.栈帧的内部结构 每个栈帧中存储着: 局部变量表(Local Variables) 操作数栈(Operand Stack)(或表达式栈) 动态链接(Dynamic Linking)(或指向运行时常量 ...