【Unity】坐标转换(屏幕坐标、世界坐标、UI坐标)

目录

[一、3D世界坐标转UI锚点坐标(3D pos -> UI anchorPos)](#一、3D世界坐标转UI锚点坐标(3D pos -> UI anchorPos))

[二、任意UI世界坐标转指定UI世界坐标(UI pos -> UI pos)](#二、任意UI世界坐标转指定UI世界坐标(UI pos -> UI pos))

[三、3D世界坐标转指定UI世界坐标(3D pos -> UI pos)](#三、3D世界坐标转指定UI世界坐标(3D pos -> UI pos))

[四、UI世界坐标转指定Z轴的3D世界坐标(UI pos -> 3D pos)](#四、UI世界坐标转指定Z轴的3D世界坐标(UI pos -> 3D pos))


一、3D世界坐标转UI锚点坐标(3D pos -> UI anchorPos)

cs 复制代码
//3D世界坐标 -> rt空间下的UGUI锚点坐标 anchoredPosition
public static Vector2 World2UIPos(Camera uiCamera, Vector3 worldPos, RectTransform rt)
{
    Camera worldCamera = Camera.main; //worldPos世界坐标物体所在的世界摄像机
    Vector2 screenPoint = worldCamera.WorldToScreenPoint(worldPos);
    Vector2 anchoredPosition;
    RectTransformUtility.ScreenPointToLocalPointInRectangle(rt, screenPoint, uiCamera, out anchoredPosition);
    return anchoredPosition;
}

参数1:uiCamera UI摄像机(渲染Canvas的摄像机)

参数2:worldPos 世界坐标

参数3:rt (RectTransform) 转化到rt节点下的UI锚点坐标

用法:rectTransform.anchoredPosition3D = World2UIPos(uiCamera, 3dTransorm.position, rt);

3dTransorm 物体世界坐标转到rt节点下的UI锚点坐标,rectTransform是位于rt节点下的UI物体。
注意:anchoredPosition3D是一个3D锚点坐标,使用它是确保Z值是0

用途:当需要在3D物体处生成一个UI物体时。

二、任意UI世界坐标转指定UI世界坐标(UI pos -> UI pos)

cs 复制代码
//UGUI世界坐标 -> rt空间下的UGUI世界坐标
public static Vector3 UIWorld2UIWorldPos(Camera uiCamera, Vector3 worldPos, RectTransform rt)
{
    Vector2 screenPoint = RectTransformUtility.WorldToScreenPoint(uiCamera, worldPos);
    Vector3 uiPos;
    RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, screenPoint, uiCamera, out uiPos);
    return uiPos;
}

参数1:uiCamera UI摄像机(渲染Canvas的摄像机)

参数2:worldPos 任意UI物体世界坐标

参数3:rt (RectTransform) 转化到rt节点下的UI世界坐标

用法:uiB.transform.position = UIWorld2UIWorldPos(uiCamera, uiA.transform.position, rt);

将uiA世界坐标转到rt节点下的UI世界坐标并赋予uiB,uiB是位于rt节点下的UI物体。

用途:当UI物体需要移动到另一个UI物体位置时,且它们的父节点不一样时。(若父节点相同就能直接用position)

三、3D世界坐标转指定UI世界坐标(3D pos -> UI pos)

cs 复制代码
//3D世界坐标 -> UGUI世界坐标
public static Vector3 World2UIWorldPos(Camera uiCamera, Vector3 worldPos, RectTransform rt)
{
    Camera worldCamera = Camera.main; //worldPos世界坐标物体所在的世界摄像机
    Vector2 screenPoint = worldCamera.WorldToScreenPoint(worldPos);
    Vector3 uiPos;
    RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, screenPoint, uiCamera, out uiPos);
    return uiPos;
}

参数1:uiCamera UI摄像机(渲染Canvas的摄像机)

参数2:worldPos 任意3D物体世界坐标(非UI物体)

参数3:rt (RectTransform) 转化到rt节点下的UI世界坐标

用法:uiA.transform.position = World2UIWorldPos(uiCamera, 3dTransorm.position, rt);

3dTransorm 物体世界坐标转到rt节点下的UI世界坐标,uiA是位于rt节点下的UI物体。

用途:当需要在3D物体处生成一个UI物体时。

四、UI世界坐标转指定Z轴的3D世界坐标(UI pos -> 3D pos)

cs 复制代码
//UGUI世界坐标 -> 3D世界坐标
public static Vector3 UIPos2WorldPos(Camera uiCamera, Vector3 uiPos, float z)
{
    Vector3 screenPoint = RectTransformUtility.WorldToScreenPoint(uiCamera, uiPos);
    screenPoint.z = z;
    Vector3 worldPos;
    Camera worldCamera = Camera.main;
    worldPos = worldCamera.ScreenToWorldPoint(screenPoint);
    return worldPos;
}

参数1:uiCamera UI摄像机(渲染Canvas的摄像机)

参数2:uiPos任意UI物体世界坐标(非3D物体)

参数3:z 指定转后的世界坐标Z轴

用法:3dGo.transform.position = UIPos2WorldPos(uiCamera, uiA.transform.position, 10);

将uiA世界坐标转到距离摄像机10个单位的世界坐标

用途:3D物体位置与UI物体位置有相对位置关系,UI物体会随着用户不同分辨率而改变位置后,3D物体也要跟随着变化位置时使用,但Z轴依旧保持不变即可。(Z值就是原本3D物体距离摄像机的数值,把3D物体直接放到Camera物体节点下然后看3D物体的Z值是多少就填多少

注意:上面提及的uiCamera (UI摄像机)是Canvas 渲染模式为Screen Space - Camera下时指定的Render Camera摄像机。参数1:uiCamera UI摄像机(渲染Canvas的摄像机)

若没有这个摄像机,填null即可,如果填null有问题,就还是要去设置一个UI摄像机。

相关推荐
做cv的小昊3 小时前
计算机图形学:【Games101】学习笔记08——光线追踪(辐射度量学、渲染方程与全局光照、蒙特卡洛积分与路径追踪)
图像处理·笔记·学习·计算机视觉·游戏引擎·图形渲染·概率论
玖玥拾4 小时前
Cocos学习笔记:序列化、配置文件与数据驱动
游戏引擎·cocos2d
RReality4 小时前
【Unity UGUI】血条 / 进度条(HP Bar)
ui·unity·游戏引擎·图形渲染
mxwin12 小时前
Unity Shader URP:法线如何进行光照计算
unity·游戏引擎·shader
郝学胜-神的一滴12 小时前
中级OpenGL教程 009:用环境光告别模型死黑
前端·c++·unity·godot·图形渲染·opengl·unreal
一锅炖出任易仙14 小时前
创梦汤锅学习日记day30
学习·ai·ue5·游戏引擎
mxwin1 天前
Unity URP 中的法线生成完全指南
unity·游戏引擎
游乐码1 天前
Unity基础(十五)LineRender画线功能
unity·游戏引擎
玖玥拾1 天前
Cocos学习笔记:瓦片地图与坐标转换
游戏引擎·cocos2d
小贺儿开发1 天前
Unity3D 图片循环查看器
unity·工具·图片·列表·循环·ugui·互动