【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摄像机。

相关推荐
老朱佩琪!5 小时前
Unity模板方法模式
unity·游戏引擎·模板方法模式
又来0776 小时前
Unity手柄按键映射表
unity·游戏引擎
dzj20216 小时前
Unity的旁门左道用法(科学计算):用shader调用GPU做k线MA5的计算——DuckDB + Compute Shader
unity·金融·gpu·shader·量化·compute shader
世洋Blog6 小时前
Unity使用Luban的一些常用点
unity·游戏策划·luban
nnsix19 小时前
Unity的dllType Native和Managed的区别
unity·游戏引擎
编码旅者20 小时前
《Virt A Mate(VAM)》免安装豪华版v1.22中文汉化整合
游戏引擎·图形渲染·vr·动画
Clank的游戏栈21 小时前
AI游戏开发全自动编程课程体系(Cursor版,支持Unity/Cocos, Laya后续支持)
人工智能·unity·游戏引擎
鹿野素材屋1 天前
技术闲聊:为什么网游会在固定时间点,刷出固定的道具?
前端·网络·unity
发际线危机121381 天前
Unity发布apk部分真机虚线采样变成实线问题
unity·游戏引擎