Unity中世界坐标转UGUI坐标

经常会遇到将ui元素的位置对应到某个世界坐标位置的需求,网上看了些解决办法,感觉太过复杂,也试过直接用Camera的WorldToScreenPoint方法和RectTransformUtility.ScreenPointToLocalPointInRectangle方法,结果都不对,后来仔细想想,UGUI元素都是放在Canvas中显示的,而Canvas的尺寸是根据CanvasScler中的设置来适配实际的屏幕分辨率的,并不一定会等于Screen的分辨率,刚好想到,Unity中ViewPort的尺寸大小是0-1,如果用ViewPort的坐标值来乘以Canvas的尺寸值不是就刚好得到世界坐标在UGUI坐标系中的位置了吗?

转换过程为

世界坐标-》ViewPort坐标-〉UGUI坐标

代码如下

public static Vector2 WorldToUGUIPosition(RectTransform canvasRectTransform,Camera camera,Vector3 worldPosition){

//世界坐标-》ViewPort坐标   

Vector2 viewPos = camera.WorldToViewportPoint(worldPosition);

//ViewPort坐标-〉UGUI坐标

  return new Vector2(canvasRectTransform.rect.width * viewPos.x, canvasRectTransform.rect.height * viewPos.y);

}

使用方法如下:

uiObject.localPosition = WorldToUGUIPosition(canvasRect, mainCamera, worldPosition);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前段时间整理的一篇关于unity ui开发的文章,被推荐上了csdn首页,对于刚刚写文字的我来说,是莫大的鼓励,让...
    小飞不会飞_阅读 5,308评论 0 4
  • 一、Unity3D中有哪些坐标系? 坐标系这个概念最早是由法国数学家笛卡尔提出的,并由此创造了用代数方法来研究几何...
    OneMore2018阅读 4,612评论 0 7
  • f#投影空间和屏幕空间先不说UI,如果是一个普通渲染流程,一个Cube普通地被渲染。 如果屏幕在现实中变小了,这个...
    DonaldW阅读 26,760评论 3 31
  • Canvas的渲染 渲染基本层次 基本渲染层次是根据可视化对象在继承窗口中的显示顺序来渲染的,在此有两种方式可以调...
    壹米玖坤阅读 2,560评论 0 5
  • UGUI的目录结构 UGUI包括很多UI工具,但所有的UI工具都会在Canvas(画布)下进行渲染显示。所以当新建...
    紫龙大侠阅读 1,351评论 0 1