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

9
回复
331
查看
打印 上一主题 下一主题
[ 复制链接 ]
5熟悉之中
660/1000
排名
5900
昨日变化

16

主题

80

帖子

660

积分

Rank: 5Rank: 5

UID
122072
好友
3
蛮牛币
953
威望
0
注册时间
2015-9-10
在线时间
328 小时
最后登录
2019-9-16
100蛮牛币
怎么让unity图片UI   按钮button背景图 透明部分不可点击或点击无效  ?       , 第一个按钮的透明部分覆盖住了第二个按钮没有透明的部分, 点击第二个按钮的时候,怎么做才不会第一个按钮遮挡?


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

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

这是两个问题  求大神解答
7日久生情
3093/5000
排名
782
昨日变化

60

主题

788

帖子

3093

积分

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

UID
69941
好友
1
蛮牛币
9440
威望
0
注册时间
2015-1-20
在线时间
1011 小时
最后登录
2019-9-13
沙发
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
6蛮牛粉丝
1416/1500
排名
2160
昨日变化

0

主题

119

帖子

1416

积分

Rank: 6Rank: 6Rank: 6

UID
34290
好友
1
蛮牛币
2209
威望
0
注册时间
2014-7-15
在线时间
653 小时
最后登录
2019-9-17
板凳
2019-9-2 09:20:47 只看该作者
重写UI点击事件
6蛮牛粉丝
1416/1500
排名
2160
昨日变化

0

主题

119

帖子

1416

积分

Rank: 6Rank: 6Rank: 6

UID
34290
好友
1
蛮牛币
2209
威望
0
注册时间
2014-7-15
在线时间
653 小时
最后登录
2019-9-17
地板
2019-9-2 09:21:54 只看该作者
重写Image底层的点击事件方法
6蛮牛粉丝
1475/1500
排名
2108
昨日变化

17

主题

225

帖子

1475

积分

Rank: 6Rank: 6Rank: 6

UID
221064
好友
2
蛮牛币
1529
威望
0
注册时间
2017-5-7
在线时间
585 小时
最后登录
2019-9-17
5#
2019-9-2 09:33:28 只看该作者
按钮上射线检测处理一下
6蛮牛粉丝
1416/1500
排名
2160
昨日变化

0

主题

119

帖子

1416

积分

Rank: 6Rank: 6Rank: 6

UID
34290
好友
1
蛮牛币
2209
威望
0
注册时间
2014-7-15
在线时间
653 小时
最后登录
2019-9-17
6#
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;
        }
    }
}
6蛮牛粉丝
1416/1500
排名
2160
昨日变化

0

主题

119

帖子

1416

积分

Rank: 6Rank: 6Rank: 6

UID
34290
好友
1
蛮牛币
2209
威望
0
注册时间
2014-7-15
在线时间
653 小时
最后登录
2019-9-17
7#
2019-9-2 10:38:05 只看该作者
本帖最后由 麻辣隔壁 于 2019-9-2 11:29 编辑


图片要设置成可读写
排名
331
昨日变化

82

主题

709

帖子

4124

积分

Rank: 9Rank: 9Rank: 9

UID
93357
好友
6
蛮牛币
20590
威望
0
注册时间
2015-4-18
在线时间
1483 小时
最后登录
2019-9-17

专栏作家认证开发者

QQ
8#
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
9#
2019-9-5 15:54:16 只看该作者
去勾 RayCast Target就可以
5熟悉之中
666/1000
排名
4883
昨日变化

8

主题

199

帖子

666

积分

Rank: 5Rank: 5

UID
8758
好友
3
蛮牛币
917
威望
0
注册时间
2013-11-23
在线时间
141 小时
最后登录
2019-9-16
个人测试 RayCast Target 无效 使用2D 射线 多边形碰撞可以解决
您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则