微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Unity不规则按钮点击区域UGUI

 

文章目录

 

一. 前言

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

在这里插入图片描述

二. 最终效果

在这里插入图片描述

注:有同学私信说没做出来,所以我把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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐