Unity制作右键菜单(自适应分辨率)

一、需求

        右键触发打开菜单,左键在内部可选择选项,左键单击菜单范围外关闭。难点在于屏幕坐标系,鼠标位置,UI位置之间的关系。

二、理论

        前置知识:

        unity中,用RectTransform对象的position.x和position.y表示UI在屏幕中(相对于左下角的正值)的位置。而两者所代表的点,就是UI中的Pivot的点。

        Pivot中,0也是最左或者最下,都是同一个参考。Pivot( 0,1)则表示,UI坐标点选取为最左边,最上边,也就是左上角,用0-1的比例表示。细心可以发现Pivot就是一个空心圆。这个点就表示UI的位置点。

pivot(0,1)位置

         从1920换到3840的分辨率后,虽然UI可以做比例大小适应,但是rect中的width和height属性是不会变的,就是制作UI时输入的数值。所以如果要改分辨率做适配,这两个值不能直接用,要根据屏幕比例去计算真正的宽高。

调整后的宽高为:(小学的等比计算)

float adaptScaleWidth = Screen.width * (menuRect.rect.width / 1920f);

float adaptScaleHeight = Screen.height * (menuRect.rect.height / 1080f);

         鼠标在屏幕中的位置:左下角为零点,右上增加,分辨率更改,鼠标在屏幕中的位置值也不同。直接用api获取:

Input.mousePosition.x
Input.mousePosition.y

三、关键代码

1.右键打开事件

public class CustomBtn : MonoBehaviour,IPointerDownHandler
{
    
    void Start()
    {
        
    }
    
    public void OnPointerDown(PointerEventData eventData)
    {
        //你要触发的代码
        if (eventData.button==PointerEventData.InputButton.Right)
        {
            RightClickMenuPanel.Instance.menuRect.position = Input.mousePosition;
            RightClickMenuPanel.Instance.ShowRightClickMenu(true);
        }
    }

        继承 IPointerDownHandler,实现OnPointerDown,用PointerEventData判定按键。先设定右键菜单的pivot位置,再打开setactive(true)。

二、判定

    private void Update()
    {
        //左键关闭情况
        if (Input.GetMouseButtonDown(0))
        {
            float adaptScaleWidth = Screen.width * (menuRect.rect.width / 1920f);
            float adaptScaleHeight = Screen.height * (menuRect.rect.height / 1080f);
            //超出菜单范围关闭
            if (Input.mousePosition.x<menuRect.position.x ||
                Input.mousePosition.x>menuRect.position.x+ adaptScaleWidth ||
                Input.mousePosition.y<menuRect.position.y- adaptScaleHeight ||
                Input.mousePosition.y>menuRect.position.y
                )
            {
                ShowRightClickMenu(false);
            }
            
        }
        
    }
    public void ShowRightClickMenu(bool flag)
    {
        menuRect.gameObject.SetActive(flag);
    }

        在其他地方挂脚本,换算,判定鼠标位置,在范围外设置关闭。 

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

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

相关文章

eNSP学习——理解交换机Hybird接口的应用

目录 原理概述 实验内容 实验目的 实验步骤 实验拓扑 实验编址 实验步骤 基本配置&#xff08;此处仅以PC1为例&#xff09; 实现组内通信、组间间隔 实现网络管理员对所有网络的访问 原理概述 Hybrid接口既可以连接普通终端的接入链路又可以连接交换机间的干道…

【详细解释深度学习图像分类检测评价指标】准确率Accuracy、精确率Precision、召回率Recall、mAP等(一文搞懂,建议收藏)

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要是记录工作中、学习中关于AI(Deep Learning)相关知识并分享。 &#x1f60a;&#x1f60a;&#x1f…

新建虚拟机并安装配置linux

记得看目录哦&#xff01; 1. 打开VMware2. 新建虚拟机3. 配置虚拟机内存4. 配置处理器5. 配置网络6. 开始安装CentOS系统系统安装包此处自取 7. 启动虚拟机进行安装如果出现这种情况这样转成图形化界面继续安装 1. 打开VMware 点击文件—点击新建虚拟机 2. 新建虚拟机 3. 配置…

实用工具合集(持续更新...)

一、搜索引擎 1.1、小白盘 网站&#xff1a;https://www.xiaobaipan.com 度盘资源搜索的网站&#xff0c;能够搜索电影、电视剧、小说、音乐等资源&#xff08;注意&#xff1a;评论区很多小伙伴说小白盘有毒&#xff0c;我用谷歌浏览器搜索过几次并无大碍&#xff0c;请慎用…

MWORKS.Sysplorer在机电静压伺服机构方案设计阶段的应用

​ 机电静压伺服机构&#xff08;EHA&#xff09;结合了机电伺服机构&#xff08;EMA&#xff09;和液压伺服机构&#xff08;EH&#xff09;的优点&#xff0c;作为一种高效率、高可靠性的执行机构&#xff0c;近年来受到多个领域的广泛重视&#xff0c;尤以航空领域最为重视&…

重构改善既有代码的设计-学习(四):简化条件逻辑

1、分解条件表达式&#xff08;Decompose Conditional&#xff09; 可以将大块代码分解为多个独立的函数&#xff0c;根据每个小块代码的用途&#xff0c;为分解而得的新函数命名。对于条件逻辑&#xff0c;将每个分支条件分解成新函数还可以带来更多好处&#xff1a;可以突出条…

电巢直播 | 研祥集团“研选智造节”上演直播狂欢!

2024年1月9日&#xff0c;“研选智造节”已于电巢直播强势登场&#xff01;研祥作为“工控机”的龙头企业&#xff0c;一直致力于助力工业智能智造的转型升级。为推动智能智造更进一步&#xff0c;研祥集团在直播当晚亮相了一系列全新业态产品&#xff0c;并宣布“研祥智造天团…

【Java】SpringMVC路径写法

1、多级路径 ✅类路径和方法路径都可以写成多级 ✅其中&#xff0c;类路径写在方法路径前面 ✅与Servlet不同&#xff0c;SpringMVC中写不写“/”都可以 RequestMapping("/hello/t1") RestController public class HelloSpring {RequestMapping( value "world…

5.ROC-AUC机器学习模型性能的常用的评估指标

最近回顾机器学习基础知识部分的时候&#xff0c;看到了用于评估机器学习模型性能的ROC曲线。再次记录一下&#xff0c;想起之前学习的时候的茫然&#xff0c;希望这次可以更加清晰的了解这一指标。上课的时候听老师提起过&#xff0c;当时没有认真去看&#xff0c;所以这次可以…

【c++】高精度算法(洛谷刷题2024)乒乓球详解

系列文章目录 第一题 乒乓球 视频&#xff1a;http://【洛谷题单 - 算法 - 高精度】https://www.bilibili.com/video/BV1Ym4y1s7BD?vd_source66a11ab493493f42b08b31246a932bbb 目录 系列文章目录 第一题 乒乓球 前言 一、题目以及引领思考 二、题解与代码 1.输入输出案例 …

权威的健康养生与医学基础知识科普学习信息汇总

目录 1 关于健康与食物营养的权威网址1.1 世界卫生组织&#xff08;World Health Organization: WHO&#xff09;1.2 美国国家卫生研究院 (National Institutes of Health: NIH)1.3 澳大利亚政府健康门户 (Healthdirect)1.4 国际食品信息委员会 (International Food Informatio…

[蓝桥学习] 前缀和与差分

前缀和原理 特点 求区间和 如果要实现一边修改一边查询&#xff0c;需要使用树状树组和线段树。 例题 题目很简单&#xff0c;但是代码实现惊艳到我了&#xff0c;是L就加1&#xff0c;是Q就减1&#xff0c;如果区间 [i,j] 是平衡子串的话&#xff0c;那它会在前缀prefix i …

计算机网络——网络层(1)

计算机网络——网络层(1&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 网络层&#xff1a;数据平面网络层概述核心功能协议总结 路由器工作原理路由器的工作步骤总结 网际协议IPv4主要特点不足IPv6主要特点现状 通用转发和SDN通用转发SDN&#xff08;软件…

ORM-08-EclipseLink 入门介绍

拓展阅读 The jdbc pool for java.(java 手写 jdbc 数据库连接池实现) The simple mybatis.&#xff08;手写简易版 mybatis&#xff09; 1. EclipseLink概述 本章介绍了EclipseLink及其关键特性&#xff1a;包括在EclipseLink中的组件、元数据、应用程序架构、映射和API。 本…

蓝桥OJ3694肖恩的投球游戏plus

二维差分 #include<bits/stdc.h> using namespace std;const int N 1e3 5; int a[N][N],d[N][N];int main() {int n, m, q;cin >> n >> m >> q;for (int i 1 ; i < n; i){for (int j 1; j < m; j){cin >> a[i][j];d[i][j] a[i][j] a…

大模型工作笔记

当前主要从三个方面入手解决幻觉问题&#xff1a; 检测数据中虚假信息&#xff0c;提升数据质量&#xff1b;扩大模型规模并增大预训练数据量&#xff0c;模型能力的提升能实现幻觉水平的降低&#xff1b;结合搜索增强以及知识库等方法&#xff0c;提升生成信息的准确性。 使…

C语言和C++中不定参数解析

你所看到的惊艳&#xff0c;都曾被平庸历练 文章目录 简介C语言不定参数不定参宏函数 C不定参数方法一&#xff1a;递归展开方式二&#xff1a;折叠表达式方法三&#xff1a;逗号表达式 总结 简介 相信学过c/c的佬们都知道&#xff0c;如果一个函数将自己的参数确定好后&#…

想成为offer收割机?收好这份面试实战攻略!

很多小伙伴之所以会屡屡求职失败&#xff0c;是因为他根本就不知道在面试当中面试官到底要的东西是什么。 所以面试时&#xff0c;大家要不断提醒自己&#xff1a;我是来找工作的&#xff0c;必须考虑清楚说什么样的话&#xff0c;做什么样的事&#xff0c;才对找工作有帮助。…

leetcode1237. 找出给定方程的正整数解

1237. 找出给定方程的正整数解https://leetcode.cn/problems/find-positive-integer-solution-for-a-given-equation/ 难度中等 101 给你一个函数 f(x, y) 和一个目标结果 z&#xff0c;函数公式未知&#xff0c;请你计算方程 f(x,y) z 所有可能的正整数 数对 x 和 y。满…

Kali如何启动SSH服务并实现无公网ip环境远程连接

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 简单几步通过[cpolar 内网穿透](cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站)软件实现ssh 远程连接kali! …