Unity UI的transform,recttransform,position的相互转换

这篇具有很好参考价值的文章主要介绍了Unity UI的transform,recttransform,position的相互转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习中遇到一些坑,记录一下,因为RectTransform坐标转换第一次遇到真的头疼

1,首先要理解RectTransform是Transform的子类,而所有的UI组件,在代码中获取的transform.position实际上都是rectTransform.anchoredPosition,也就是说,新建一个空物体,加入Image、Text等组件后,这个物体只有在Canvas下,才能显示出来,它的Transform组件自动被替换为RectTransform。

2, rectTransform.anchoredPosition是该UI物体的Pivot对应它的锚点的坐标,如果锚点为一个点,就比较好理解,如果锚点是父物体Panel或者canvas的四个角,那还牵涉到unity内部的一些计算,具体这里不深入研究。

3, 那么如果我们需要一个一个UI的世界坐标,来进行一些操作,应该怎么做?

假设:(1) 目标ui在canvas下,canvas的模式为camera,camera为专门的UIcamera。此时UI和canvas画布是可以在scene中看到的,作为游戏物体的一部分出现。

(2)我们还有一个maincamera来拍摄渲染整个游戏场景

(3) 我们需要一个linerenderer来从ui指向场景中某个物体。

那么场景中的物体坐标很容易得到,我们需要的就是UI的坐标。

第一步:将UI的position转换为屏幕坐标

unity提供了一个方法RectTransformUtility.WorldToScreenPoint(Camera camera,Vector3 point),我们将UI的transform.position也就是实际上的rectTransform.anchoredPosition传进point中,将UIcamera传进camera中,就可以得到这个ui的屏幕坐标。

RectTransformUtility.WorldToScreenPoint(UIcamera,transform.position)

第二步,将屏幕坐标转换为世界坐标

这时我们所选用的摄像机就由UIcamera换成Camera.main,因为canvas在任何位置都不影响UIcamera渲染它,而我们游戏世界是由maincamera来渲染的,所以此时摄像机应该使用mainCamera。

unity同样提供了一个方法Camera.ScreenToWorldPoint(Vector3 point)来处理这个问题,需要注意的是,之前RectTransformUtility.WorldToScreenPoint方法的返回值是一个Vector2,而这个方法的入参是vector3,需要处理一下Z轴,否则返回值永远是一个(0,0,0)的三维向量。

 //主相机到2D界面的距离
            float distance = Mathf.Abs(GameObject.Find("BackGroundCanvas").GetComponent<Canvas>().planeDistance) ;
            // return GameObject.Find("UICamera").GetComponent<Camera>().ScreenToWorldPoint(new Vector3(mousPos.x, mousPos.y, distance));
            return camera.ScreenToWorldPoint(new Vector3(mousPos.x, mousPos.y, distance));

此处我的项目是一个2D项目,暂时的Z轴使用背景层canvas的planedistance,方法外部再进行-1,以保证生成的linerenderer在背景层上显示。

第二个坑: UI预制体创建时如果没有指定父物体为canvas,就会导致位置、大小出现问题

因为canvas的camera模式在渲染时是进行了缩放的:如果没有缩放,那么比如canvas的planedistance设定为100,那么在摄像机中看到的canvas就会非常小了。如果没有指定父物体为canvas或其子物体,就会导致创建出来的UI物体巨大,位置也因为LocalPosition等变换问题出现奇怪的偏移

总结:折腾了一天才处理明白,我的处理方法应该也不是最好的,因为感觉堆2D项目中Z轴、DEPTH的理解还不够清晰。文章来源地址https://www.toymoban.com/news/detail-808248.html

到了这里,关于Unity UI的transform,recttransform,position的相互转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity坐标系、相互转换和相对自身的方位及角度。

    一、Unity的4种坐标系 1, World Space(世界坐标): 我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的。transform.position可以获得该位置坐标。 2, Screen Space(屏幕坐标): 以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),Z的位置是以相机

    2024年02月10日
    浏览(28)
  • Unity RectTransform 组件

    RectTransform 继承自 Transform 相对于Transform,RectTransform增加了两个用于 UI适配 的属性,分别是: Anchor(锚点) 和 Piont(轴心点) Transform,RectTransform,Rect 类 说明 Transform 记录并表示,一个3D物体在 三维空间 中的 位置 、 旋转 和 缩放 三种属性 RectTransform 记录并表示,一个2D UI元素 在

    2024年02月02日
    浏览(35)
  • 【100个 Unity实用技能】☀️ | Unity中C#获取当前时间戳,时间戳和时间格式相互转换、时间戳转换为多久之前

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年02月16日
    浏览(35)
  • Unity中获取时间戳、日期、时间、毫秒、秒以相互转换、自定义格式时间

    这里附带一个时间戳和时间转换的网址 时间戳就是从1970年1月1日0时0分0秒起到现在的总毫秒数,为什么时1970/1/1/00:00:00,因为第一台计算机发明时间是这个时间,所以时间戳诞生了。 比如说你要做一些时间相关的功能,那么基本都会用到时间戳。而且时间戳是精确的,比如说

    2024年02月05日
    浏览(35)
  • 【100个 Unity实用技能】 | Lua中获取当前时间戳,时间戳和时间格式相互转换、时间戳转换为多久之前

    老规矩,先介绍一下 Unity 的科普小知识: Unity 是 实时3D互动内容创作和运营平台 。 包括 游戏开发 、 美术 、 建筑 、 汽车设计 、 影视 在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和

    2023年04月09日
    浏览(31)
  • 百度二面是什么级别的,Unity进阶技巧 - RectTransform详解,android开发需要哪些基础

    三、Pivot和Anchor的结合 在了解了Pivot和Anchor分别是什么后,我们就来看看Unity是如何使用这个两个东西来控制UI的布局 第1种情况:两个锚点重合时我们先来看看两个锚点重合时的情况,这种情况是我们最常用也是最容易理解的方式 我们将Anchor锚点放在黑框的正中间,然后将

    2024年04月12日
    浏览(39)
  • Unity坐标系的转换—世界坐标转为UI坐标

    直接调用WorldToAnchorPos,传入对应的参数返回UGUI坐标

    2024年04月13日
    浏览(34)
  • 【Unity3d】【相机】透视相机UI转换(3DUI+保持屏幕比例)

    0. 基础知识点 正交相机 : 正交相机的的orthographicSize ,是 二分之一的屏幕高度,即 orthographicSize = H/2。 透视相机 : 相机的aspect为相机的视口的宽高比: aspect = W/H 即: W = H * aspect 透视相机的屏幕高度H 随着相机的中心距离和fov变化。公式为: H = distance * tan(fov*0.5) * 2 相机视

    2024年02月04日
    浏览(79)
  • ROS系列——使用python的transforms3d、numpy库实现四元数、旋转矩阵、欧拉角、轴角等的相互转换

    pip3 install transforms3d 四元数模块在transforms3d.quaternions里,直接导入即可使用 2.1.1四元数转旋转矩阵 2.1.2 旋转矩阵转四元数 2.2.1 四元数转轴角 2.2.2 轴角转四元数 四元数模块在transforms3d.euler里,直接导入即可使用 3.1.1 固定轴欧拉角转四元数 3.1.2 四元数转固定轴欧拉角 3.2.1 固定

    2024年02月07日
    浏览(81)
  • vue项目结合unity webgl,并相互通信

    vue与unity交互完成,最开始使用vue-unity-webgl插件,用着感觉有很多问题,然后换成了iframe,简单记录一下 本文主要解决以下问题: 1.vue项目中如何引入使用unity webgl 2.vue如何与unity互信通信 主要步骤: 1.将unity打包后的文件夹引入至项目,我把它放在static目录下 2.在vue文件通过

    2024年02月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包