Unity 各个坐标系之间的转换

2023-10-31

Unity 各个坐标系之间的转换

using UnityEngine;

public class PositionConvert
{

    /// <summary>
    /// 世界坐标转换为屏幕坐标
    /// </summary>
    /// <param name="worldPoint">屏幕坐标</param>
    /// <returns></returns>
    public static Vector2 WorldPointToScreenPoint(Vector3 worldPoint)
    {
        // Camera.main 世界摄像机
        Vector2 screenPoint = Camera.main.WorldToScreenPoint(worldPoint);
        return screenPoint;
    }

    /// <summary>
    /// 屏幕坐标转换为世界坐标
    /// </summary>
    /// <param name="screenPoint">屏幕坐标</param>
    /// <param name="planeZ">距离摄像机 Z 平面的距离</param>
    /// <returns></returns>
    public static Vector3 ScreenPointToWorldPoint(Vector2 screenPoint, float planeZ)
    {
        // Camera.main 世界摄像机
        Vector3 position = new Vector3(screenPoint.x, screenPoint.y, planeZ);
        Vector3 worldPoint = Camera.main.ScreenToWorldPoint(position);
        return worldPoint;
    }

    
    // RectTransformUtility.WorldToScreenPoint
    // RectTransformUtility.ScreenPointToWorldPointInRectangle
    // RectTransformUtility.ScreenPointToLocalPointInRectangle
    // 上面三个坐标转换的方法使用 Camera 的地方
    // 当 Canvas renderMode 为 RenderMode.ScreenSpaceCamera、RenderMode.WorldSpace 时 传递参数 canvas.worldCamera
    // 当 Canvas renderMode 为 RenderMode.ScreenSpaceOverlay 时 传递参数 null
    
    // UI 坐标转换为屏幕坐标
    public static Vector2 UIPointToScreenPoint(Vector3 worldPoint,Canvas uiCanvas)
    {
        // RectTransform:target
        // worldPoint = target.position;
        Camera uiCamera = uiCanvas.worldCamera;

        Vector2 screenPoint = RectTransformUtility.WorldToScreenPoint(uiCamera, worldPoint);
        return screenPoint;
    }

    // 屏幕坐标转换为 UGUI 坐标
    public static Vector3 ScreenPointToUIPoint(RectTransform rt, Vector2 screenPoint, Canvas uiCanvas)
    {
        Vector3 globalMousePos;
        //UI屏幕坐标转换为世界坐标
        Camera uiCamera = uiCanvas.worldCamera;

        // 当 Canvas renderMode 为 RenderMode.ScreenSpaceCamera、RenderMode.WorldSpace 时 uiCamera 不能为空
        // 当 Canvas renderMode 为 RenderMode.ScreenSpaceOverlay 时 uiCamera 可以为空
        RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, screenPoint, uiCamera, out globalMousePos);
        // 转换后的 globalMousePos 使用下面方法赋值
        // target 为需要使用的 UI RectTransform
        // rt 可以是 target.GetComponent<RectTransform>(), 也可以是 target.parent.GetComponent<RectTransform>()
        // target.transform.position = globalMousePos;
        return globalMousePos;
    }

    // 屏幕坐标转换为 UGUI RectTransform 的 anchoredPosition
    public static Vector2 ScreenPointToUILocalPoint(RectTransform parentRT, Vector2 screenPoint,Canvas uiCanvas)
    {
        Vector2 localPos;
        Camera uiCamera = uiCanvas.worldCamera;

        RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRT, screenPoint, uiCamera, out localPos);
        // 转换后的 localPos 使用下面方法赋值
        // target 为需要使用的 UI RectTransform
        // parentRT 是 target.parent.GetComponent<RectTransform>()
        // 最后赋值 target.anchoredPosition = localPos;
        return localPos;
    }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity 各个坐标系之间的转换 的相关文章

随机推荐

  • idea--pom.xml依赖版本号报错

    目录 1 解决方法 1 1设置idea配置 1 2重构索引 1 3把pom中的依赖剪切重新导入然后刷新maven依赖 1 4根据坐标去本地maven方库查找 1 5清空 maven仓库 lastUpdated 的文件 1 6最后如果还不好的
  • SpringBoot使用WebSocket与vue进行交互

    SpringBoot使用WebSocket与vue进行交互 SpringBoot配置WebSocket pom文件中添加
  • ElasticSearch常用DSL语句学习

    es操作版本6 5 创建索引 1 创建索引 等价于mysql创建一个库 PUT student test 2 创建表和映射mapping POST student test table mapping 指定需要创建的字段和类型 proper
  • java匿名对象

    Person person new Person 骚杰 66 男 Person 类名 person 对象名 new Person 像内存的堆区申请空间 创建一个Person类对象使用的内存空间 匿名对象 没有名字的对象 没有对象名的对象 格
  • T检验的前提条件

    T检验是一种用于比较两组数据均值是否存在显著差异的统计方法 但在进行T检验之前 有一些前提条件需要满足 以确保结果的准确性和可靠性 这些前提条件包括 正态性 T检验要求数据在每个组内都服从正态分布 正态性可以使用统计方法 如正态分布检验 或
  • 物理机安装linux方法

    企业中的应用一般都跑在 物理服务器 虚拟机 云主机 容器 现 在 刚 学 习 linux 的 新 手 一 般 都 是 在 windows 系 统 中 安 装 vmware workstation 然后再安装vmware虚拟机使用与学习 但遇
  • 【计算机网络01】网络互连模型

    文章目录 1 OSI参考模型 7层 2 TCP IP参考模型 4层 3 学习研究 5层 1 OSI参考模型 7层 为了更好地促进互联网络的研究和发展 国际标准化组织 ISO 在 1985 年制定了网络互连模型 OSI 参考模型 Open S
  • 【RabbitMQ高级消息可靠性、高可用、延时、消息堆积问题】

    服务异步通信 高级篇 消息队列在使用过程中 面临着很多实际问题需要思考 1 消息可靠性 消息从发送 到消费者接收 会经理多个过程 其中的每一步都可能导致消息丢失 常见的丢失原因包括 发送时丢失 生产者发送的消息未送达exchange 消息到
  • 国内外优秀的源码网站

    不管你是初学一门计算机语言或技术 还是想学习别人的经验和创意 做为一个开发人员 都会经常需要到搜索一些代码 下面是7个地方可以帮助你快速寻找到你需要的代码 1 GitHub Code Search http github com searc
  • Python全栈开发【基础-06】垃圾回收机制

    专栏介绍 本专栏为Python全栈开发系列文章 技术包括Python基础 函数 文件 面向对象 网络编程 并发编程 MySQL数据库 HTML JavaScript CSS JQuery bootstrap WSGI Django Flas
  • 解决ScrollView嵌套RecyclerView无法滑动的问题

    通过View事件的拦截方法解决ScrollView嵌套RecyclerView无法滑动的问题 前提 这里先介绍两个View的方法 onInterceptTouchEvent方法 只有ViewGroup才有 返回true 代表对事件进行拦截
  • JavaWeb 使用nginx负载均衡

    Nginx是什么 Nginx是一个轻量级 高性能 稳定性高 并发性好的HTTP和反向代理服务器 核心功能 负载均衡 负载均衡 多在高并发情况下需要使用 其原理就是将数据流量分摊到多个服务器执行 减轻每台服务器的压力 多台服务器 集群 共同完
  • java基础:反射机制

    java反射机制 反射简介 java代码在程序中经历的阶段 如何获取Class对象 如何获取成员变量 如何获取构造方法 如何获取成员方法 如何获类名 反射简介 1 反射是框架设计的灵魂 2 将类的各个组成部分封装为其他对象 这就是反射机制
  • 异地远程访问本地SQL Server数据库【无公网IP内网穿透】

    文章目录 1 前言 2 SeaFile云盘设置 2 1 Owncould的安装环境设置 2 2 SeaFile下载安装 2 3 SeaFile的配置 3 cpolar内网穿透 3 1 Cpolar下载安装 3 2 Cpolar的注册 3 3
  • pandas使用cut分割区间继而用groupby对数据分组

    ages np array 1 5 10 40 36 12 2 2 67 45 90 3 6 8 23 45 12 15 17 22 4 33 28 56 58 62 77 89 100 18 20 25 30 32 年龄数据 quarti
  • sublime text3 主题推荐配色自定义方案

    先使用Ctrl shift p 打开Package Control Install Package 安装Seti UI主题插件 在 首选项 gt 浏览插件目录 进入sublime的插件目录 进入Seti UI目录 使用sublime修改Se
  • selenium中,div弹出提示框,如何定位?

    弹出框是用div模拟出来的 用switch to window和switch to frame是切换不过去的 那么如何去定位到弹框呢 可以这样处理 一般弹出窗口是在最顶层的视图上的 同时mianframe在顶层视图下面 所以这里我通brow
  • GOM登录器配置免费版生成图文教程

    GOM登录器配置生成图文教程 GOM引擎我发布的算比较多了 喜欢的朋友我都分享这款引擎的版本 原因就是这款引擎的版本漂亮 功能系统多 活动和玩法也都非常的丰富 还有很多的功能是其他引擎无法做到的 所以我最近研究的也就比较多了 有很多朋友会问
  • 通过一个链接打开本地app,或者去下载app

    以前支付宝发短信给你手机 然后你点开这个链接的时候会发现它自动的打开了支付宝软件 这个是如何做到的呢 我认为实现的原理就是 这个链接通过浏览器打开 然后自动执行js方法 如果本地有支付宝软件 就去打开这个方法 当然支付宝app也要做对应的处
  • Unity 各个坐标系之间的转换

    Unity 各个坐标系之间的转换 using UnityEngine public class PositionConvert