unity不规则按钮解决方案

一种是alpha检测

一种是设置collider

参考:

https://zhuanlan.zhihu.com/p/34204396

下面给出第二种方案代码

///按钮多边形点击方案,注意Canvas模式应该是Screen Space - Camera  需设置 Render Camera
///选中按钮右键UI->变更为多边形按钮,编辑子物体的Collider2D即可
///如果无法编辑Collider 则是Unity编辑器bug 切换下Unity编辑器的布局模式,即可恢复正常

using UnityEngine;
using UnityEngine.UI;
#if UNITY_EDITOR
using UnityEditor;
#endif

[RequireComponent(typeof(PolygonCollider2D))]
public class NonRectangularButtonImage : Image
{
    private PolygonCollider2D areaPolygon;

    protected NonRectangularButtonImage()
    {
        useLegacyMeshGeneration = true;
    }

    private PolygonCollider2D Polygon
    {
        get
        {
            if (areaPolygon != null)
                return areaPolygon;

            areaPolygon = GetComponent<PolygonCollider2D>();
            return areaPolygon;
        }
    }

    protected override void OnPopulateMesh(VertexHelper vh)
    {
        vh.Clear();
    }

    public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
    {
        return Polygon.OverlapPoint(eventCamera.ScreenToWorldPoint(screenPoint));
    }

#if UNITY_EDITOR
    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)
        };
    }
#endif
}
#if UNITY_EDITOR
[CustomEditor(typeof(NonRectangularButtonImage), true)]
public class CustomRaycastFilterInspector : Editor
{
    public override void OnInspectorGUI()
    {
    }
}

public class NonRectAngularButtonImageHelper
{
    [MenuItem("GameObject/UI/变更为多边形按钮")]
    public static void CreateNonRectAngularButtonImage()
    {
        var goRoot = Selection.activeGameObject;
        if (goRoot == null)
            return;

        var button = goRoot.GetComponent<Button>();

        if (button == null)
        {
            Debug.Log("Selecting Object is not a button!");
            return;
        }

        // 关闭原来button的射线检测
        var graphics = goRoot.GetComponentsInChildren<Graphic>();
        foreach (var graphic in graphics)
        {
            graphic.raycastTarget = false;
        }

        var polygon = new GameObject("NonRectangularButtonImage");
        polygon.AddComponent<PolygonCollider2D>();
        polygon.AddComponent<NonRectangularButtonImage>();
        polygon.transform.SetParent(goRoot.transform, false);
        polygon.transform.SetAsLastSibling();
        //设置锚点方案,注意rect transfrom的框必须包住多边形,否则超出的部分无效
        polygon.GetComponent<RectTransform>().SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, 0, 0);
        polygon.GetComponent<RectTransform>().SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, 0, 0);
        polygon.GetComponent<RectTransform>().SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, 0, 0);
        polygon.GetComponent<RectTransform>().SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, 0, 0);
        polygon.GetComponent<RectTransform>().anchorMin = new Vector2(0, 0);
        polygon.GetComponent<RectTransform>().anchorMax = new Vector2(1, 1);
    }
}

#endif

原文地址:https://www.cnblogs.com/sanyejun/p/11231406.html

时间: 2024-10-15 01:39:36

unity不规则按钮解决方案的相关文章

【原】cocos2d-x开发笔记:获取Sprite上某一个点的透明度,制作不规则按钮

本篇文章主要讲一下怎么做一个不规则的按钮,比如如下图的八卦,点击绿色和点击红色部分,需要执行不同的事件 一般情况下,如果要检测某一个精灵是否被点中,做法如下 bool HelloWorld::ccTouchBegan(cocos2d::CCTouch* pTouch, cocos2d::CCEvent* pEvent) { CCSize sprSize = pSpr->getContentSize(); CCPoint point = pSpr->convertTouchToNodeSpace

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

利用 Firemonkey 控件的组合及可塑性,可以做出千变万化的效果及功能,下面展示一个不规则按钮的实做: 效果图: 实做方法: 开一个新工程 Multi-Device Application 放一个 Layout1 (TLayout) 再放四个 TRectangle 到 Layout1 里面 将 Layout1.RotationAngle 设定为 45 度 再放一个 RoundRect1 (TRoundRect) 到 Layout1 里面,并将 Align = Center 接着在 Rect

WPF 如何绘制不规则按钮,并且有效点击范围也是不规则的

最近在做一个东西,如地图,点击地图上的某一区域,这一区域需要填充成其他颜色.区域是不规则的,而且点击该区域的任一点,都能够变色.普通的按钮只是简单的加载一幅图肯定是不行的.查了很多资料,终于把它搞定了.实现方法不是原创,也是参照了网上的实现. 具体的思想:就是根据图片文件来画这个按钮,画出的按钮,形状正好是该图片的样子. 这里的图片是有要求的,背景必须是透明的PNG图片,而且该图片必须是建立了路径的. 样式实现: <Style x:Key="ButtonStyle_Custom"

unity 退出程序按钮实现

退出程序按钮实现 1.新建场景命名为"Quit" 2.在场景中新建"UI"----"Button"按钮, 修改按钮的文本属性,输入"退出"(或者关闭) 3.新建C#脚本,命名为"Btn_Quit" 编写脚本,如下: using UnityEngine;using System.Collections; public class Btn_Quit : MonoBehaviour { public void Q

unity 背景 按钮 场景跳转

public Texture2D pic; private bool Cl = false; void OnGUI() { GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), pic); GUIStyle style = new GUIStyle(); //实例化一个新的GUIStyle,名称为style ,后期使用 style.fontSize = 50; //字体的大小设置数值越大,字越大,默认颜色为黑色 style.no

Unity路径规划

Unity路径规划 背景 酷跑游戏中涉及到弯道.不规则道路. 找来一些酷跑游戏的案例来看,很多都是只有直线道路,也就不存在所谓的路径问题,设置一个方向即可,本文主要给出几种我自己用过.看过的Unity中可以用做路径规划的一些资料. 方案一 Unity自带解决方案Navigation,可以参考小赵的文章: unity自带寻路Navmesh入门教程(一) unity自带寻路Navmesh入门教程(二) unity自带寻路Navmesh入门教程(三) 这几篇文章还是不错的,配合官方文档,对其功能就能就

Unity使用JsonFX插件进行序列化

孙广东  2015.6.25 Unity and JSON – Quick Guide: 相比较XML的沉重和密集,Json更加高效. Introduction: 什么是 Json ?如果你从未使用过它,它的内部是字典结构.但你进行序列化和反序列化一些数据之后,你就会想知道他是怎么工作的. Unity没有为 JSON 提供内置的解决方案. 获得Dark Table的 JsonFX: Dark Table 已经创建了Unity中的解决方案, JsonFx.  你能得到 DLL 在这, if you

atitit.GUI图片非规则按钮跟动态图片切换的实现模式总结java .net c# c++ web html js

atitit.GUI图片非规则按钮跟动态图片切换的实现模式总结java .net c# c++ web html js 1. 图片按钮的效果总结 1 1.1. 按钮图片自动缩放的. 1 1.2. 不要边框,如果用自定义图片做按钮背景可以设为 false. 2 1.3. 异形按钮 2 1.4. 不绘制焦点 2 1.5. 鼠标经过时的图标 2 1.6. 选中时的图标 2 1.7. 禁用时显示的图标 2 1.8. 可能需要按钮半透明效果 2 2. 图片按钮的实现 2 2.1. 优先模式:button控

GJM :Unity UI 之 UGUI 开发

转载URL:http://www.manew.com/thread-41633-1-1.html 最近因为要做各种UI控件,于是与UGUI杠上了.首当其冲的就是RectTransform,最坑爹的是,这货竟然不是UGUI框架的,代码竟然封装在unityengine里面,所以,不得不吐槽下unity的开源动机,根本就是留一手,估计只是因为自己的研发力量不足,所以开放一部分出来而已.       RectTransform继承于Transform,配合Canvas专门交给UGUI使用,具体这边就不展