1.先重写Image类,实现对Image图形范围的重写;

  2.对不规则按钮添加Polygon Collider2D组件,调整大小圈中要点击的范围;

  3.将重写的Image类添加到不规则按钮上时,需要移除不规则按钮上原来的Image组件,因为这个是继承Image,一个物体上不能同时有两个Image组件,并取消注释下面不绘制图片的代码;

或者在不规则按钮下新建个空物体添加脚本,此时需要注意取消勾选父物体的Image组件的Raycast Target属性,并且不规则按钮下的Image、Text等都需要取消勾选该属性。

  4.注意 IsRaycastLocationValid(判断点击是否生效的范围) 的判断区域是RectTransform的区域。 如果 polygon Collider编辑出来的区域大于RectTransform , 必须调节RectTransform的区域。

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI; [RequireComponent(typeof(PolygonCollider2D))]
public class MyUIPolygon : Image
{
// Polygon -- 多边形
private PolygonCollider2D polygon = null;
public PolygonCollider2D Polygon {
get {
if (polygon == null)
polygon = transform.GetComponent<PolygonCollider2D>();
return polygon;
}
} #region 不绘制图片
//protected MyUIPolygon()
//{
// useLegacyMeshGeneration = true;
//} ////UI元素需要生成顶点时的回调函数
////由 Text、Image 和 RawImage 使用,例如用于生成特定于其用例的顶点
////VertexHelper:可辅助为 UI 生成网格的 Utility 类。
//protected override void OnPopulateMesh(VertexHelper vh)
//{
// vh.Clear();
//}
#endregion //检测点击到的图片位置是否生效
//相机必须为正交视角。具体不知道
//IsRaycastLocationValid 给定一个点和一个摄像机,判断射线投射是否有效。
//重载该方法 该方法会在父类中调用
//重新该方法还可以阻断子物体接收射线检测
public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
{
//point 世界空间中的点。
bool isResult = Polygon.OverlapPoint(eventCamera.ScreenToWorldPoint(screenPoint));
print(isResult);
return isResult;
} #if UNITY_EDITOR
//重置PolygonCollider2D大小和图片位置
protected override void Reset()
{
base.Reset();
transform.localPosition = Vector3.zero;
var w = rectTransform.sizeDelta.x * 0.5f + 0.1f;
var h = rectTransform.sizeDelta.y * 0.5f + 0.1f;
Polygon.points = new[]
{
new Vector2(-w, -h),
new Vector2(w, -h),
new Vector2(w, h),
new Vector2(-w, h)
};
}
[CustomEditor(typeof(MyUIPolygon), true)]
public class MyUIPolygonInspector : Editor
{
public override void OnInspectorGUI()
{ }
}
#endif }

详细的可以看雨松大大的文章 https://www.xuanyusong.com/archives/3492

Unity 不规则按钮实现的更多相关文章

  1. Unity不规则按钮点击区域(UGUI)

    文章目录 一. 前言 二. 最终效果 三. 实现 1.创建UICamera 2. UIPolygon节点 3. 编辑碰撞区域 5. 运行测试 6. UIPolygon代码 一. 前言 游戏开发中,可能 ...

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

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

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

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

  4. [示例] Firemonkey 不规则按钮实做

    利用 Firemonkey 控件的组合及可塑性,可以做出千变万化的效果及功能,下面展示一个不规则按钮的实做: 效果图: 实做方法: 开一个新工程 Multi-Device Application 放一 ...

  5. 源码推荐(7.17):不规则按钮类似于遥控器按钮,一个可以最大程度简化PageView与TabView切换的第三方框架

    不规则按钮,类似于遥控器按钮,可以单独控制按钮的上下左右(作者:masa_chu) 不规则按钮,类似于遥控器按钮,可以单独控制按钮的上下左右 测试环境:Xcode 6.2,iOS 6.0以上 Lazy ...

  6. Qt5:不规则按钮的实现---通过贴图实现

    在应用开发中,有时候为了美观会在UI界面中增加不规则的按钮 现在我们就来看看Qt中是怎么实现不规则按钮的 /////////////////////////////////////////////// ...

  7. iOS 开源一个高度可定制支持各种动画效果,支持单击双击,小红点,支持自定义不规则按钮的tabbar

    TYTabbarAnimationDemo 业务需求导致需要做一个tabbar,里面的按钮点击带有动画效果,tabbar中间的按钮凸出,凸出部分可以点击,支持badge 小红点等,为此封装了一个高度可 ...

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

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

  9. 在UNITY中按钮的高亮用POINT灯实现,效果别具一番风味

    在UNITY中按钮的高亮用POINT灯实现,效果别具一番风味

随机推荐

  1. Java基础篇(JVM)——类加载机制

    这是Java基础篇(JVM)的第二篇文章,紧接着上一篇字节码详解,这篇我们来详解Java的类加载机制,也就是如何把字节码代表的类信息加载进入内存中. 我们知道,不管是根据类新建对象,还是直接使用类变量 ...

  2. 04 jumpserver资产管理

    4.资产管理: (1)管理用户: 管理用户是资产(被控服务器)上的 root,或拥有 NOPASSWD: ALL sudo 权限的用户, JumpServer 使用该用户来 `推送系统用户`.`获取资 ...

  3. Oracle查询wm_concat返回[oracle.sql.CLOB@7D6414ed]之坑!

    在orcale中使用wm_concat函数将字段分组连接. 在linux环境下需要将wm_concat(字段)进行to_char(wm_concat(字段))处理.

  4. css文字动画(自动换文字)

    html: <div class="content"> <div class="content__container"> <p c ...

  5. SpringMVC的注解关键词解释

    SpringMVC的注解关键词解释 @Controller控制器定义 和Struts1一样,Spring的Controller是Singleton的.这就意味着会被多个请求线程共享.因此,我们将控制器 ...

  6. linux 开机自启动的两种方式

    方法 1 – 使用 rc.local sudo vi /etc/rc.local 在文件最后加上: sh /root/script.sh & 如果是 CentOS,我们修改的是文件 /etc/ ...

  7. 在一个py脚本中调用另外一个py脚本中的类或函数

    1.两个文件在同一目录,直接import即可 2.两个文件在不同目录 在导入文件的时候,Python只搜索当前脚本所在的目录,加载(entry-point)入口脚本运行目录和sys.path中包含的路 ...

  8. Linux | Shell脚本的编写

    Shell 脚本的介绍 Shell脚本通过Shell终端解释器当作人与计算机硬件之间的翻译官,用户可以通过它执行各种命令,不仅有简单的,还有复杂的,比如:判断.循环.分支等这些高级编程中才有的特性.S ...

  9. GO系列-ini文件处理

    gopkg.in/ini.v1 配置加载 创建一个空的配置 cfg := ini.Empty() 直接加载存在的配置文件,如果文件不存在就会报错 cfg, err := ini.Load(" ...

  10. 小哈学Python ----XML

    XML XML是实现不同语言或程序之间进行数据交换的协议,XML文件格式如下: <data> <country name="Liechtenstein"> ...