Unity编辑器拓展——Editor模式下屏幕坐标转换为世界坐标

这篇具有很好参考价值的文章主要介绍了Unity编辑器拓展——Editor模式下屏幕坐标转换为世界坐标。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

发会牢骚,最近一直在做Unity的编辑器拓展,其中难的地方不少,但不至于到看不懂的地步,可一做到关于坐标转换的内容时把我弄不会了。

这个不查不知道,一查吓一跳,Unity的坐标系非常多,有世界坐标,屏幕坐标,局部坐标,视窗坐标等等,而且每一个都是不一样的坐标系,所以关于Unity的坐标变换都挺麻烦的,但其实也不是难题,有很多现成的答案,前提是不在Editor模式下操作。

淦就淦在我就是要做编辑器拓展,所以就遇到了几乎一片空白的领域。不是没有相关的文章,关于编辑器拓展下的坐标系转换是有文章的,但在我的情况下全都不对,我就纳闷了,甚至想要直接写函数去实现,不过在磨了一天一夜后在机缘巧合下给我看出了问题。


目录

描述问题

问题所在

解决办法


描述问题

我做的是2D游戏,在编辑模式下的一个拓展窗口内需要为一个数据选定场景坐标,我首先想到的是通过鼠标位置转换成世界坐标来实现。有各种各样的问题,不过大都可以在百度上找到答案,只是关键的坐标转换却出了问题,我死活都拿不到想要的数据。

问题所在

Unity编辑器拓展——Editor模式下屏幕坐标转换为世界坐标

(随便找的图)

P1:我需要转换的P2物体内的坐标位置,即鼠标点击的位置

P2:某物体的位置点

P3:场景窗口的左上角的位置

P4:场景窗口的左下角的位置

获取P1坐标的代码如下

    private void OnSceneView(SceneView sceneView)
    {
        //鼠标左键点击判断
        if (Event.current.type == EventType.MouseDown && Event.current.button == 0)
        {
                Vector2 newPosition;

                //P2指P1所需要转换的位置的父物体
                Transform P2 = GameObject.Find("P2").transform;     
                
                //坐标转换
                RectTransformUtility.ScreenPointToLocalPointInRectangle(P2.GetComponent<RectTransform>(), GetMousePos(), sceneView.camera, out newPosition);
                
                Debug.Log(newPosition);
            }
        }
    }

Input类没法在编辑模式下用,所以用场景事件类,而RectTransformUtility.ScreenPointToLocalPointInRectangle这个方法就不多介绍了,简单来说就将屏幕坐标转换为某个物体内的坐标,挺人性的,就是没摸透时用有点折磨。RectTransformUtility类还有其他转换方法,百度上挺多答案的。

一开始我用Event.current.mousePosition来获取鼠标位置,我想将P1从屏幕坐标转换为世界坐标,用的是Camera自带的转换函数,是错的。因为P1的坐标不是正确的数据,不是准确的屏幕坐标。

常用的坐标系有这几个

Unity编辑器拓展——Editor模式下屏幕坐标转换为世界坐标

而P1的坐标是GUI坐标系的,不能直接拿来转换。Event.current.mousePosition获取的鼠标坐标是GUI坐标,需要先将其转换为Screen的坐标系,转换为屏幕坐标才能用。

也就是P3是GUI坐标系的原点,而P4是屏幕坐标系的原点,P1在P3的坐标系下,P2在世界坐标系下,总之在这乱成一锅粥的坐标系下进行转换。

解决办法

    public static Vector3 GetMousePos()
    {
        SceneView sceneView = SceneView.currentDrawingSceneView;

        //当前屏幕坐标,左上角(0,0)右下角(camera.pixelWidth,camera.pixelHeight)
        Vector2 mousePos = Event.current.mousePosition;

        //retina 屏幕需要拉伸值
        float mult = 1;

#if UNITY_5_4_OR_NEWER
        mult = EditorGUIUtility.pixelsPerPoint;

#endif
        //转换成摄像机可接受的屏幕坐标,左下角是(0,0,0);右上角是
        (camera.pixelWidth,camera.pixelHeight,0)
        mousePos.y = sceneView.camera.pixelHeight - mousePos.y * mult;
        mousePos.x *= mult;

        //近平面往里一些,才能看到摄像机里的位置
        Vector3 fakePoint = mousePos;
        fakePoint.z = 10;
        return fakePoint;
    }

这个函数返回的就是准确的屏幕坐标,将GUI坐标系的坐标转换为Screen坐标系下的,我是直接拿网上的代码改了一下,因为是2D项目,所以应该和Z轴没关系,当然也不能设置在相机背面,这点就不说了。

上面的代码出处:Unity获取Scene窗口下的鼠标位置的世界坐标_BRK小布的博客-CSDN博客_unity 获取窗口位置

源码直接转成世界坐标,我想用Camera的转换函数也行,看情况吧,源码没法转换成某个物体内的坐标系。

总结

淦他娘的Unity,坐标转换弄死人了,不过弄懂了这块内容基本上以后遇到类似问题就大致有数了。

首先弄清楚获取的坐标到底是在哪个坐标系下的,然后再转换到对应的坐标系就行了。对了,有部分原因是因为用的Camera弄错了,我的项目里有两个Camera,但都是错的,这其实也应该是一个坑,而且还没搞懂,弄了好久,测这测那的,最后是换成了sceneView.camera才拿到了正确的数据,难道还有隐藏的摄像机,不太清楚,如果是用的OnSceneView(SceneView sceneView)事件函数,直接用sceneView.camera这个摄像机就行了,大概(⊙_⊙)。

最后,能帮到你就大概达到了写这个文章的目的,祝各位好运。文章来源地址https://www.toymoban.com/news/detail-438526.html

到了这里,关于Unity编辑器拓展——Editor模式下屏幕坐标转换为世界坐标的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Unity编辑器】拓展Hierarchy视图

    【Unity编辑器】拓展Hierarchy视图

    目录 1、拓展菜单 2、拓展布局 3、重写菜单 在Hierarchy视图中点击Create按钮,弹出的菜单My Create-Cube就是自定义拓展菜单 菜单中已经包含了系统默认的一些菜单项,我们拓展的原理就是重写MenuItem的自定义路径。Create按钮下的菜单项都在GameOject路径下面,所以只要开头是GameOb

    2024年02月02日
    浏览(9)
  • 【Unity编辑器】拓展Inspector视图

    【Unity编辑器】拓展Inspector视图

    目录 1、拓展源生组件 2、拓展继承组件 3、组件不可编辑 4、Context菜单 摄像机就是典型的源生组件。它的局限性就是拓展组件只能加在源生组件的最上面或者最下面,不能插在中间,不过这样也就够了 CustomEditor()表示自定义哪个组件,OnInspectorGUI()可以对它进行重新绘制,b

    2024年02月07日
    浏览(17)
  • Sprite Editor图片编辑器的使用_unity基础开发教程

    Sprite Editor图片编辑器的使用_unity基础开发教程

    SpriteEditor是Unity引擎中的一个工具,用于创建和编辑2D图片。它提供了一系列功能,可以对图片进行剪裁、切割、翻转、旋转、调整大小等操作,以及设置图片的碰撞检测形状和渲染模式。 SpriteEditor可以帮助开发者将多张图片合并成动画精灵,并为每一帧设置播放时间和循环

    2024年02月01日
    浏览(9)
  • Unity UGUI一键绑定UI控件工具(编辑器拓展)

    Unity UGUI一键绑定UI控件工具(编辑器拓展)

    全为一键生成 实现自动生成代码绑定UI控件 并生成字典保存UI控件 减少自己拖拽 和手动书写过程 适用动态加载面板 建议搭配UI框架使用 根据当前选中的gameobject 查找其下方是否有对应类型的控件 有就保存到字典中 然后通过向上递归拼凑地址,然后生成到粘贴板 直接粘贴到目

    2024年04月23日
    浏览(16)
  • 微信小程序使用editor富文本编辑器 以及回显 全屏弹窗的模式

    微信小程序使用editor富文本编辑器 以及回显 全屏弹窗的模式

      以上是富文本的值返回接收的地方 下面是富文本的html 记录一下使用方法 也可以参考一下怎么使用

    2024年02月12日
    浏览(11)
  • Editor.md-编辑器

    Editor.md-编辑器

    你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你

    2024年03月12日
    浏览(13)
  • uniapp中使用编辑器editor

    uniapp中使用编辑器editor

    开发小程序时,想要在手机上添加编辑内容,使用u–textarea时,换行操作不显示,为此使用了uniapp自带的组件editor来实现: 具体可参考官网:https://uniapp.dcloud.net.cn/component/editor.html

    2024年02月07日
    浏览(10)
  • 代码编辑器之monaco editor

    代码编辑器之monaco editor

    (一)简介 底层vscode开发的一款编辑器,各方面的样式功能基本与vscode一致。 (二)官方文档 Monaco Editor (microsoft.github.io) (三)安装 安装时两者版本要对应,对应表在后面 (四)属性 以下是较为常见的属性 (五) 方法 挑选出使用频次较高的 monaco.editor.setTheme(‘主题色名字

    2024年02月21日
    浏览(12)
  • 微信小程序editor富文本编辑器

    微信小程序editor富文本编辑器

             在开发小程序的时候,需要用到发布文章这个功能,于是就需要使用富文本编辑器。而微信小程序则正好有editor这个组件,不过editor组件的功能,还需要我们自己去调用富文本编辑器的api去自定义。富文本在wxml中可使用rich-text nodes=\\\"{{ value }}\\\"/rich-text标签展示。想

    2024年02月09日
    浏览(14)
  • Unity功能——编辑器模式下隐藏/显示游戏对象的快捷方法

    声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改。 unity20XX.X.X VS20XX 在编辑器模式下,想快捷的显示/隐藏一个游戏对象. 实现原理: 对组件进行扩展方法.对MonoBehaviour ,Transform,GameObject 组件进行扩展方法 快捷键为

    2024年02月08日
    浏览(13)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包