Image透明度点击简述以及Unity2019之后存在无法点击的BUG修复

news/2024/7/8 16:28:56 标签: unity, Image, ui

前言

自Unity2019之后Unity将UGUI模块从内置库修改成了通过PackageManger引入的方式。Image就来源于com.unity.modules.imgui模块。其实代码大体代码跟2018是一致的,但是还是有些细微差别,Image透明度点击不命中就是2019之后才有的问题,2018版本是没有这个问题的,我都怀疑是开发人员抄代码没抄全。

首先这个点击不命中是在你使用图集的方式打包UI图片时出现,Unity使用SpriteAtlas自动打包图集。

什么时候使用透明度点击

有时候美术做的图片,希望在交互的时候避免玩家点击空白处也能响应,但是由于图片是矩形的,这个时候就要使用透明度点击,也就是设置ImagealphaHitTestMinimumThreshold值,设置这个值需要满足以下条件:

  • Sprite所在纹理(图集)压缩格式不为Crunch类型
  • Sprite所以纹理(图集)是可读的

简述透明度点击原理

每次我们点击屏幕Unity我使用射线检查判断当前点击的对象是否可以点击。当判定到了当前点击对象的时候,会去调用IsRaycastLocationValid 来对当前点击的位置进行判断是否可以点击,如果没有设置透明度点击(alphaHitTestMinimumThreshold值为0)就直接可以点击。如果设置了就将屏幕点击点换算到Sprite所在纹理坐标中,再通过这个纹理坐标(uv)去读取这个坐标像素的alpha值,如果大于设置的alphaHitTestMinimumThreshold值就表示可以点击。

Unity的Bug

我们首先来看看Unity的源码
在这里插入图片描述
我们可以看到Unity在计算uv的时候,拿的是Sprite的Rect内的x,y坐标去除的Sprite对应的图集的尺寸,得出来的结果肯定就是错的。
正确的做法应该是拿到Sprite在图集的偏移位置除以图集的尺寸。

// Convert local coordinates to texture space.
Rect spriteRect = overrideSprite.textureRect;
float x = (spriteRect.x + local.x) / overrideSprite.texture.width;
float y = (spriteRect.y + local.y) / overrideSprite.texture.height;

虽然但是,我们知道怎么改,但是改不了,这个是Unity的基础依赖库,很多其他的库都依赖这个1.0.0版本的库,我们不能直接修改也没法升级,就只能另辟蹊径了,可以重新创建一个新的类来继承Image来重写IsRaycastLocationValid方法。
我在下面放上我修改重新的类文件,就不直接贴出来了。


http://www.niftyadmin.cn/n/5171948.html

相关文章

SpringBoot中的桥接模式

桥接模式是一种结构型设计模式,它的主要目的是通过将抽象部分与实现部分分离,提高系统的灵活性和可扩展性。在桥接模式中,有四个主要参与者:抽象类、具体抽象类、桥接类和具体类。 抽象类是定义了抽象方法的基类,这些…

僵尸进程问题如何处理

现象: 工作中遇到docker内有很多的僵尸进程,导致CPU过高,直接卡死。 原因: 每个进程都有一个唯一的标识,称为 pid,pid 是一个非负的整数值,使用 ps 命令可以查看其中 PID 是表示进程号。系统中…

用java把服务器某个目录日志实时打印出来

1.引入第三方包 <dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version> </dependency>2.代码如下 import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.JSch; import …

观点|周鸿祎:大模型真正的竞争在于使其与用户场景相结合

【网易科技11月9日报道】目前&#xff0c;人工智能技术尚未达到向手机一样的刚性、高频需求&#xff0c;各国和企业都在加大研发和应用力度&#xff0c;探索不同的技术路线和商业模式。 360集团创始人、董事长周鸿祎在2023世界互联网大会乌镇峰会上表示&#xff0c;目前人工智能…

操作系统之进程上下文切换

进程&#xff08;上下文&#xff09;切换的步骤 检查是否可以进行进程切换&#xff08;如&#xff1a;原语执行时不可&#xff0c;必须等待原语执行完后才能进行切换&#xff09;&#xff0c;具有原子性的系统程序段。保存被切换进程的现场&#xff08;如&#xff1a;程序计数器…

Git系列之分支与标签的使用及应用场景模拟

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Git实战开发》。&#x1f3af;&#x1f3af; &a…

【中间件篇-Redis缓存数据库04】Redis底层原理持久化、分布式锁

Redis底层原理 持久化 Redis虽然是个内存数据库&#xff0c;但是Redis支持RDB和AOF两种持久化机制&#xff0c;将数据写往磁盘&#xff0c;可以有效地避免因进程退出造成的数据丢失问题&#xff0c;当下次重启时利用之前持久化的文件即可实现数据恢复。 RDB RDB持久化是把当…

PHP中传值与引用的区别

在PHP中&#xff0c;变量的传递方式主要分为传值和传引用两种。这两种方式在操作中有一些重要的区别&#xff0c;影响着变量在函数调用或赋值操作中的表现。下面详细解释一下这两种传递方式的区别。 传值&#xff08;By Value&#xff09; 传值是指将变量的值复制一份传递给函…