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

前言

自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方法。
我在下面放上我修改重新的类文件,就不直接贴出来了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/133909.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

提升中小企业效率的不可或缺的企业云盘网盘

相比之大型企业,中小型企业在挑选企业云盘工具更注重灵活性和成本。那么市面上有哪些企业云盘产品更适合中小企业呢? 说起中小企业不能错过的企业云盘网盘,Zoho Workdrive企业云盘绝对榜上有名! Zoho Workdrive企业云盘为用户提…

打印图形

题目描述 由键盘输入一个大写字母 ( 到 中的任意一个 ) ,输出如下图所示由相关大写字母组成的图形。 所输入的字母一定为输出文件的第一个字符( 位于图形的左上角 ) ,其余部分的字母构成规律和分布由样例给出。 输入格式 一行,仅为一个大写…

JavaScript基础入门03

目录 1.条件语句 1.1if 语句 1.1.1基本语法格式 1.1.2练习案例 1.2三元表达式 1.3switch 2.循环语句 2.1while 循环 2.2continue 2.3break 2.4for 循环 3.数组 3.1创建数组 3.2获取数组元素 3.3新增数组元素 3.3.1. 通过修改 length 新增 3.3.2. 通过下标新增 …

3D渲染原理及朴素JavaScript实现【不使用WebGL】

在网页中显示图像和其他平面形状非常容易。 然而,当涉及到显示 3D 形状时,事情就变得不那么容易了,因为 3D 几何比 2D 几何更复杂。 为此,你可以使用专用技术和库,例如 WebGL 和 Three.js。 但是,如果你只…

链表OJ题(2)

目录 1.移除链表元素√ 2.反转链表 3.相交链表 4.链表的中间节点 5.链表中倒数第k个节点 6.合并链表√ 7.分割链表√ 今天链表面试OJ题目 移除链表元素反转链表相交链表链表的中间节点链表中倒数第k个节点合并链表分割链表 🙂起始条件 中间节点 结束条件&am…

111111111111111

全局锁 就是对整个数据库进行加锁,加锁之后整个数据库就处于只读状态,后续的DML写语句,DDL语句,以及对更新事务的提交操作都会被阻塞,典型地使用场景就是做整个数据库的逻辑备份,对所有的表进行锁定&#x…

动态内存管理(让内存管理更加灵活)

文章目录 概述一、动态内存开辟malloc 函数calloc 函数realloc 函数 二、动态内存释放三、动态内存可能会犯的错误 概述 我们平时在内存中开辟空间的方式有: int a 10;//在栈空间上开辟四个字节int arr[10] {0};//在栈空间上开辟10个字节的连续空间用以上方式开辟…

Clickhouse学习笔记(5)—— ClickHouse 副本

Data Replication | ClickHouse Docs 副本的目的主要是保障数据的高可用性,即使一台 ClickHouse 节点宕机,那么也可以从其他服务器获得相同的数据 注意: clickhouse副本机制的实现要基于zookeeperclickhouse的副本机制只适用于MergeTree f…

【每日一题】情侣牵手

文章目录 Tag题目来源题目解读解题思路方法一:并查集 写在最后 Tag 【并查集】【数组】【2023-11-11】 题目来源 765. 情侣牵手 题目解读 返回最少的交换座位的次数,使每对情侣可以坐在一起。 解题思路 方法一:并查集 对于一对情侣&…

跟着openai学编程

装饰者模式 class Component:def operator(self):passclass ConcreteComponent(Component):def operator(self):return "ConcreteComponent operator"class Decorator(Component):def __init__(self, component) -> None:super().__init__()self.component compo…

SDWAN(Software Defined Wide Area Network)概述与优势分析

文章目录 SDWAN简介SDWAN技术优势简化网络部署和维护安全传输灵活网络拓扑极致体验 SD-WAN关联技术STUNIPsec智能选路SaaS路径优化 典型组网多总部分支组网云管理组网 推荐阅读 SDWAN简介 SDWAN(Software Defined Wide Area Network,软件定义广域网&…

Java自学第9课:JSP基础及内置对象

目录: 目录 1 JSP基础知识架构 1 指令标识 1 Page命令 2 Including指令 3 taglib指令 2 脚本标识 1 JSP表达式 2 声明标识 3 代码片段 3 JSP注释 1 HTML注释 2 带有JSP表达式的注释 3 隐藏注释 4 动态注释 4 动作标识 1 包含文件标识 2 请求转发标…

vscode 和 keil协同使用开发stm32程序,超详细教程

vscode 和 keil协同使用开发stm32程序 文章目录 vscode 和 keil协同使用开发stm32程序1. 安装vscode拓展安装chinese插件 2 .安装Mingw3.配置环境变量4. 打开Keil项目 VSCODE 是一款广受好评的代码编辑器, KEIL 是常用的嵌入式开发工具但编程界面简陋。 将两个工具…

【PyQt】(自制类)处理鼠标点击逻辑

写了个自认为还算不错的类,用于简化mousePressEvent、mouseMoveEvent和mouseReleaseEvent中的鼠标信息。 功能有以下几点: 鼠标当前状态,包括鼠标左/中/右键和单击/双击/抬起鼠标防抖(仅超出一定程度时才判断鼠标发生了移动),灵…

TMUX命令的基本操作和使用

tmux:是两个单词的缩写,即“Terminal MultipleXer”,意思是“终端复用器”。 TMUX使用场景:假如你需要跑大模型或者数据集特别大的AI任务时,它往往需要花较长时间才能跑完,在跑的过程中,不能断…

用朴素贝叶斯实现垃圾邮箱分类实验报告

一、实验目的 1.会用Python创建朴素贝叶斯模型 2.使用朴素贝叶斯模型对垃圾邮件分类 3.会把文本内容变成向量 4.会用评价朴素贝叶斯模型的分类效果 二、设备与环境 Jupyter notebook Python3.9 三、实验原理 四、实验内容 1.把给定的数据集message.csv拆分成训练集和测试集&…

LeetCode【207】课程表

题目&#xff1a; 思路&#xff1a; https://www.jianshu.com/p/25868371ddfc/ 代码&#xff1a; public boolean canFinish(int numCourses, int[][] prerequisites) {// 入度int[] indegress new int[numCourses];// 每个点对应的边,出边Map<Integer, List<Intege…

upload 文件自动上传写法,前后端 下载流文件流

<el-uploadv-model:file-list"fileList":action"app.api/student/student/import":headers"{// Content-Type: multipart/form-data;boundary----split-boundary, 此处切记不要加&#xff0c;否则会造成后端报错 Required request part file is…

Python编程:从入门到实践 (项目3—Web应用程序—学习问题汇总)(新手避坑必看)

本人系统环境&#xff1a; WIN10系统 Python 3.9 Django 2.1.5 书本环境&#xff1a; Python 3.x Django 1.8.5 基于Django 开发一个名为“学习笔记”的项目&#xff0c;这是一个在线的日志系统&#xff0c;能够记录所学习的有关特定主题的知识。 建立项目 要编写一个名为“…

第十周学习记录

阅读MARS MARS创新点&#xff1a; (1)实例感知。模拟器使用独立的网络分别对前景实例和背景环境进行建模&#xff0c;以便可以单独控制实例的静态&#xff08;例如大小和外观&#xff09;和动态&#xff08;例如轨迹&#xff09;属性。 (2)模块化。模拟器允许在不同的 NeRF 主干…