Unity3D判断屏幕中某个坐标点的位置是否在指定UI区域内

系列文章目录

unity工具


文章目录

  • 系列文章目录
  • 前言
  • 一、使用rect.Contains()判断
    • 1-1、转换坐标
    • 1-2、代码如下:
    • 1-3、注意事项
    • 1-3、测试效果如下
  • 二、使用坐标计算在不在区域内
    • 2-1、方法如下:
    • 2-2、注意事项
  • 三、使用RectTransformUtility.ScreenPointToLocalPointInRectangle和坐标一起配合计算
    • 3-1、代码如下:
    • 3-2、注意事项
  • 总结


前言

大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
有时候需要判断玩家此时点击的某个点是否在某个指定的UI区域内,如果在区域内则响应点击事件,不在区域内时不进行响应事件。所以记录一下

一、使用rect.Contains()判断

1-1、转换坐标

把屏幕坐标转换成本地坐标
API:RectTransformUtility.ScreenPointToLocalPointInRectangle
然后在使用**Contains()**判断某个坐标点在不在该RectTransform里面了

1-2、代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIClickPosition : MonoBehaviour
{//判断的UI区域public RectTransform rectTrans;//用于坐标点是否在区域内的标记public Text txtFlag;private void Update(){GetClickArea(Input.mousePosition);}///传入某个坐标点进行判断public void GetClickArea(Vector2 point){Vector2 localPoint;//将屏幕坐标转化为相对rectTrans的本地坐标if (RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTrans, point, Camera.main, out localPoint)){//rectTrans.rect是rectTrans的本地坐标,不能rectTrans.rect.Contains(point)直接判断,必须先转为本地坐标localPoint//判断点击的坐标点是否在rectTrans.rect矩形内if (rectTrans.rect.Contains(localPoint)){txtFlag.color = Color.green;txtFlag.text = "鼠标在UI区域内哦";}else{txtFlag.color = Color.red;txtFlag.text = "鼠标不在UI区域内哦";}}}
}

1-3、注意事项

1.需要将Canvas设置成相机模式 ScreenSpace-Camera ,要不然没有反应
2.在这里插入图片描述

1-3、测试效果如下

Unity判断屏幕中某个坐标点的位置是否在指定UI区域内

二、使用坐标计算在不在区域内

2-1、方法如下:

/// <summary>/// 使用坐标计算位置/// </summary>/// <param name="pos"></param>public void GetClickArea_pos(Vector3 pos){float _mapWidth = rectTrans.sizeDelta.x;float _mapHight = rectTrans.sizeDelta.y;//目标区域锚点为居中时使用 Pivot(0.5,0.5)if (pos.x < (rectTrans.position.x + _mapWidth / 2) && pos.x > (rectTrans.position.x - _mapWidth / 2) &&pos.y < (rectTrans.position.y + _mapHight / 2) && pos.y > (rectTrans.position.y - _mapHight / 2)){txtFlag.color = Color.green;txtFlag.text = "鼠标在UI区域内哦";}else{txtFlag.color = Color.red;txtFlag.text = "鼠标不在UI区域内哦";}}

2-2、注意事项

1.根据坐标计算位置不需要设置Canvas的渲染模式,反之设置成第二种模式,到不行了,不能使用了
2.但是目标图片中心点需要设置成居中
如下图
在这里插入图片描述

三、使用RectTransformUtility.ScreenPointToLocalPointInRectangle和坐标一起配合计算

1.把第一种第二种相结合,无需考虑中心点,锚点,

3-1、代码如下:

 /// <summary>/// 第三种方法:使用RectTransformUtility配合坐标计算,无需考虑中心点,锚点/// </summary>/// <param name="pos"></param>public void GetClickArea_(Vector3 pos){Vector2 localPoint;//将选中的点转换为Image区域内的本地点RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTrans, pos, Camera.main, out localPoint);Vector2 pivot = rectTrans.pivot;Vector2 normalizedLocal = new Vector2(pivot.x + localPoint.x / rectTrans.sizeDelta.x, pivot.y + localPoint.y / rectTrans.sizeDelta.y);if ((normalizedLocal.x >= 0 && normalizedLocal.x <= 1) && ((normalizedLocal.y >= 0 && normalizedLocal.y <= 1))){txtFlag.color = Color.green;txtFlag.text = "鼠标在UI区域内哦";}else{txtFlag.color = Color.red;txtFlag.text = "鼠标不在UI区域内哦";}}

3-2、注意事项

1.第三种也是需要把相机模式改成和第一种里面使用的模式一样(ScreenSpace-Camera)

总结

不定时更新Unity开发技巧,觉得有用记得一键三连哦。

以上就是今天要讲的内容,有需要会继续补充

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PTA函数题】6-2 约瑟夫环之循环链表

n个人围成一圈&#xff08;编号依次为&#xff1a;0,1,2...n-1&#xff09;,从第一个人开始报数&#xff0c;1&#xff0c;2&#xff0c;……数到m者出列&#xff0c;再从下一个开始重新报数&#xff0c;数到m者再出列……。 下面的程序中&#xff0c;用不带附加表头的循环单链…

在 MacOS 上虚拟化 x86Linux 的最佳方法(通过 Rosetta)

categories: [VM] tags: MacOS VM 写在前面 买了 ARM 的 mac, 就注定了要折腾一下虚拟机了… 之前写过一篇文章是通过 utm 虚拟化archlinux, 其实本质上还是调用了 qemu-system-x86_64, 所以速度并不快, 后来想着能不能借用 Rosetta 的优势即原生转译, 来虚拟化 Intel 的 Linu…

正点原子-STM32定时器学习笔记(1)未完待续

1. 通用定时器简介&#xff08;F1为例&#xff09; F1系列通用定时器有4个&#xff0c;TIM2/TIM3/TIM4/TIM5 主要特性&#xff1a; 16位递增、递减、中心对齐计数器&#xff08;计数值&#xff1a;0~65535&#xff09;&#xff1b; 16位预分频器&#xff08;分频系数&#xff…

Mybatis中的sql-xml延迟加载机制

Mybatis中的sql-xml延迟加载机制 hi&#xff0c;我是阿昌&#xff0c;今天记录一下关于Mybatis中的sql-xml延迟加载机制 一、前言 首先mybatis技术本身就不多介绍&#xff0c;说延迟加载机制之前&#xff0c;那要先知道2个概念&#xff1a; 主查询对象关联对象 假设咱们现…

架构整洁之道-软件架构-展示器和谦卑对象、不完全边界、层次与边界、Main组件、服务

6 软件架构 6.9 展示器和谦卑对象 在《架构整洁之道-软件架构-策略与层次、业务逻辑、尖叫的软件架构、整洁架构》有我们提到了展示器&#xff08;presenter&#xff09;&#xff0c;展示器实际上是采用谦卑对象&#xff08;humble object&#xff09;模式的一种形式&#xff…

Spring Boot整合MyBatis Plus实现基本CRUD与高级功能

文章目录 1. 引言2. 项目搭建与依赖配置2.1 添加MyBatis Plus依赖2.2 配置数据源与MyBatis Plus 3. 实现基本CRUD功能3.1 创建实体类3.2 创建Mapper接口3.3 实现Service层3.4 控制器实现 4. 高级功能实现4.1 自动填充功能4.2 乐观锁功能4.3 逻辑删除功能 5. 拓展&#xff1a;My…

数据结构高级算法

目录 最小生成树 Kruskal(克鲁斯卡尔)(以边为核心) 9) 不相交集合(并查集合) 基础 Union By Size 图-相关题目 4.2 Greedy Algorithm 1) 贪心例子 Dijkstra Prim Kruskal 最优解(零钱兑换)- 穷举法 Leetcode 322 最优解(零钱兑换)- 贪心法 Leetcode 322 3)…

在Linux下搭建自己的私有maven库并部署和发布自定义jar依赖和自定义maven插件(三)开发和发布自己开发的maven插件

系列文章目录 在Linux下搭建自己的私有maven库并部署和发布自定义jar依赖和自定义maven插件(二)发布自己开发的jar包 文章目录 系列文章目录在Linux下搭建自己的私有maven库并部署和发布自定义jar依赖和自定义maven插件(二)发布自己开发的jar包 前言一、插件需求二、maven自定…

neo4j查询id为null

今天在neo4j里执行一条查询语句时&#xff0c;发现id属性查询不出来显示为null 后来了解到&#xff0c;Neo4j 默认情况下并不提供一个名为 id 的属性。通常情况下&#xff0c;Neo4j 中的节点都有一个内部的唯一标识符&#xff0c;但是这个标识符并不以 id 的形式暴露给用户。 …

LLMs之miqu-1-70b:miqu-1-70b的简介、安装和使用方法、案例应用之详细攻略

LLMs之miqu-1-70b&#xff1a;miqu-1-70b的简介、安装和使用方法、案例应用之详细攻略 目录 miqu-1-70b的简介 miqu-1-70b的安装和使用方法 1、安装 2、使用方法 miqu-1-70b的案例应用 miqu-1-70b的简介 2024年1月28日&#xff0c;发布了miqu 70b&#xff0c;潜在系列中的…

Google MobileDiffusion: 移动端设备上的快速文字到图片生成技术

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

多线程生命周期与通信(二)通信

线程自启动时&#xff0c;就拥有了自己的栈空间。然后会一直运行直到结束。多线程的目的是多条线程执行不同的逻辑业务从而能够提升业务整体的响应速度&#xff0c;如果线程仅仅是孤零零的执行&#xff0c;不同的逻辑业务就不能最终汇聚成一个完整的业务那么多线程也就失去了意…