找回密码
 注册帐号

扫一扫,访问微社区

GUI 怎么让unity图片UI透明部分不可点击或点击无效

11
回复
720
查看
[ 复制链接 ]
5熟悉之中
695/1000
排名
5900
昨日变化

18

主题

86

帖子

695

积分

Rank: 5Rank: 5

UID
122072
好友
3
蛮牛币
1440
威望
0
注册时间
2015-9-10
在线时间
357 小时
最后登录
2019-11-9
2019-8-31 19:08:42 显示全部楼层 阅读模式
100蛮牛币
怎么让unity图片UI   按钮button背景图 透明部分不可点击或点击无效  ?       , 第一个按钮的透明部分覆盖住了第二个按钮没有透明的部分, 点击第二个按钮的时候,怎么做才不会第一个按钮遮挡?


上个图  。。。。 无标题.png     白色的飞机是第一个按钮, 怎么才能只有点击不是透明的部分才可以触发按钮点击事件?

第二个按钮是旁边的小圆球,    第一个白色飞机的按钮覆盖在个第二个圆球按钮上面,  现在点击第二个圆球按钮,触发的是第一个白色飞机按钮的事件, 怎么才能不触发第一个按钮,实现第二个按钮的事件?

这是两个问题  求大神解答
回复

使用道具 举报

7日久生情
3160/5000
排名
782
昨日变化

61

主题

808

帖子

3160

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
69941
好友
1
蛮牛币
10125
威望
0
注册时间
2015-1-20
在线时间
1057 小时
最后登录
2020-1-26
2019-8-31 19:08:43 显示全部楼层
自己去baidu搜“UGUI 不规则”能得到一大堆结果
中心思想
Image image = GetComponent<Image>();
image.alphaHitTestMinimumThreshold = 0.1f;
没试过 感兴趣就自己测试一下吧 来源:
https://blog.csdn.net/Vitens/article/details/79418213
https://blog.csdn.net/cloudyjzj/article/details/54702573
回复

使用道具 举报

7日久生情
1542/5000
排名
2160
昨日变化

0

主题

128

帖子

1542

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
34290
好友
1
蛮牛币
2548
威望
0
注册时间
2014-7-15
在线时间
770 小时
最后登录
2020-1-21
2019-9-2 09:20:47 显示全部楼层
重写UI点击事件
回复

使用道具 举报

7日久生情
1542/5000
排名
2160
昨日变化

0

主题

128

帖子

1542

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
34290
好友
1
蛮牛币
2548
威望
0
注册时间
2014-7-15
在线时间
770 小时
最后登录
2020-1-21
2019-9-2 09:21:54 显示全部楼层
重写Image底层的点击事件方法
回复

使用道具 举报

7日久生情
1553/5000
排名
2108
昨日变化

17

主题

234

帖子

1553

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
221064
好友
2
蛮牛币
1656
威望
0
注册时间
2017-5-7
在线时间
654 小时
最后登录
2020-1-15
2019-9-2 09:33:28 显示全部楼层
按钮上射线检测处理一下
回复

使用道具 举报

7日久生情
1542/5000
排名
2160
昨日变化

0

主题

128

帖子

1542

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
34290
好友
1
蛮牛币
2548
威望
0
注册时间
2014-7-15
在线时间
770 小时
最后登录
2020-1-21
2019-9-2 10:25:15 显示全部楼层
本帖最后由 麻辣隔壁 于 2019-9-2 11:27 编辑

[C#] 纯文本查看 复制代码
using UnityEngine;using UnityEngine.UI;

public class ImageRaycastFilter : MonoBehaviour, ICanvasRaycastFilter
{
    private Image _image;
    private Sprite _sprite;

    [Tooltip("设定Sprite响应的Alpha阈值")]
    [Range(0, 0.5f)]
    public float alpahThreshold = 0f;

    void Start()
    {
        _image = GetComponent<Image>();
    }

    /// <summary>
    /// 重写IsRaycastLocationValid接口
    /// </summary>
    /// <param name="sp"></param>
    /// <param name="eventCamera"></param>
    /// <returns></returns>
    public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
    {
        _sprite = _image.sprite;

        var rectTransform = (RectTransform)transform;
        Vector2 localPositionPivotRelative;
        RectTransformUtility.ScreenPointToLocalPointInRectangle((RectTransform)transform, sp, eventCamera, out localPositionPivotRelative);

        // 转换为以屏幕左下角为原点的坐标系
        var localPosition = new Vector2(localPositionPivotRelative.x + rectTransform.pivot.x * rectTransform.rect.width,
            localPositionPivotRelative.y + rectTransform.pivot.y * rectTransform.rect.height);

        var spriteRect = _sprite.textureRect;
        var maskRect = rectTransform.rect;

        var x = 0;
        var y = 0;
        // 转换为纹理空间坐标
        switch (_image.type)
        {

            case Image.Type.Sliced:
                {
                    var border = _sprite.border;
                    // x 轴裁剪
                    if (localPosition.x < border.x)
                    {
                        x = Mathf.FloorToInt(spriteRect.x + localPosition.x);
                    }
                    else if (localPosition.x > maskRect.width - border.z)
                    {
                        x = Mathf.FloorToInt(spriteRect.x + spriteRect.width - (maskRect.width - localPosition.x));
                    }
                    else
                    {
                        x = Mathf.FloorToInt(spriteRect.x + border.x +
                                             ((localPosition.x - border.x) /
                                             (maskRect.width - border.x - border.z)) *
                                             (spriteRect.width - border.x - border.z));
                    }
                    // y 轴裁剪
                    if (localPosition.y < border.y)
                    {
                        y = Mathf.FloorToInt(spriteRect.y + localPosition.y);
                    }
                    else if (localPosition.y > maskRect.height - border.w)
                    {
                        y = Mathf.FloorToInt(spriteRect.y + spriteRect.height - (maskRect.height - localPosition.y));
                    }
                    else
                    {
                        y = Mathf.FloorToInt(spriteRect.y + border.y +
                                             ((localPosition.y - border.y) /
                                             (maskRect.height - border.y - border.w)) *
                                             (spriteRect.height - border.y - border.w));
                    }
                }
                break;
            case Image.Type.Simple:
            default:
                {
                    // 转换为统一UV空间
                    x = Mathf.FloorToInt(spriteRect.x + spriteRect.width * localPosition.x / maskRect.width);
                    y = Mathf.FloorToInt(spriteRect.y + spriteRect.height * localPosition.y / maskRect.height);
                }
                break;
        }

        // 如果texture导入过程报错,则删除组件
        try
        {
            return _sprite.texture.GetPixel(x, y).a > alpahThreshold;
        }
        catch (UnityException e)
        {
            Debug.LogError("Mask texture not readable, set your sprite to Texture Type 'Advanced' and check 'Read/Write Enabled'" + e.Message);
            return false;
        }
    }
}
回复

使用道具 举报

7日久生情
1542/5000
排名
2160
昨日变化

0

主题

128

帖子

1542

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
34290
好友
1
蛮牛币
2548
威望
0
注册时间
2014-7-15
在线时间
770 小时
最后登录
2020-1-21
2019-9-2 10:38:05 显示全部楼层
本帖最后由 麻辣隔壁 于 2019-9-2 11:29 编辑

20190902112812.png 1567394846.jpg
图片要设置成可读写
回复

使用道具 举报

排名
331
昨日变化

87

主题

734

帖子

4246

积分

Rank: 9Rank: 9Rank: 9

UID
93357
好友
6
蛮牛币
21161
威望
0
注册时间
2015-4-18
在线时间
1576 小时
最后登录
2020-1-22

专栏作家认证开发者

QQ
2019-9-3 10:11:58 显示全部楼层
不用很麻烦,可以投机取巧
1 : 将飞机和它的尾巴分成两个部分,飞机是按钮, 尾巴只是图片,去勾 RayCast Target
2 :  因为你的飞机属于规则的矩形,所以可以判断点击时鼠标是否在该举行内,放在回掉函数的开始,每次点击都判断一下
回复

使用道具 举报

0

主题

4

帖子

5

积分

Rank: 1

UID
330645
好友
0
蛮牛币
12
威望
0
注册时间
2019-8-31
在线时间
1 小时
最后登录
2019-9-5
2019-9-5 15:54:16 显示全部楼层
去勾 RayCast Target就可以
回复

使用道具 举报

5熟悉之中
674/1000
排名
4884
昨日变化

8

主题

200

帖子

674

积分

Rank: 5Rank: 5

UID
8758
好友
3
蛮牛币
946
威望
0
注册时间
2013-11-23
在线时间
148 小时
最后登录
2019-12-19
2019-9-11 18:01:32 显示全部楼层
个人测试 RayCast Target 无效 使用2D 射线 图片1.png 多边形碰撞可以解决
回复

使用道具 举报

4四处流浪
418/500
排名
8570
昨日变化

0

主题

94

帖子

418

积分

Rank: 4

UID
270109
好友
0
蛮牛币
687
威望
0
注册时间
2018-3-1
在线时间
184 小时
最后登录
2020-1-17
2019-10-10 18:15:48 显示全部楼层
麻辣隔壁 发表于 2019-9-2 10:38
图片要设置成可读写

大佬可以说下你做法的思路吗?小白看不懂
回复

使用道具 举报

7日久生情
1542/5000
排名
2160
昨日变化

0

主题

128

帖子

1542

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
34290
好友
1
蛮牛币
2548
威望
0
注册时间
2014-7-15
在线时间
770 小时
最后登录
2020-1-21
2019-10-12 10:18:07 显示全部楼层
就是获取图片图片透明度,判断是否透明,然后重写UGUI的射线检测侧方法
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则