U3D中,屏幕坐标和世界坐标单位一样,二者之间是直接的一一对应关系,不受屏幕分辨率影响。默认情况下屏幕空间画布的左下角坐标是世界原点(0,0,0),这种情形下,世界空间的点(1920,1080,任何值)就对应屏幕上的点(1920,1080,0)。

sprite的大小是由实际图片的像素确定的,如512X512的图片放到sprite上,sprite的大小是5.12X5.12。即:默认情况下3D空间中1=100像素,这个是可以在每张图片导入设置中设定的。

由此,可见,屏幕分辨率代表的是游戏窗口能看到的世界空间的范围。比如1024X768是说游戏窗口可以看到世界空间的1024个单位长,768个单位宽的范围。

而比例分辨率是则有所不同,如4:3模式下,取系统桌面分辨率的高作为游戏屏幕的宽,长=宽X4/3。

因此,UI的世界坐标和3D空间中任何物体的3D坐标性质是一样的。取UI的position减去它所在画布左下角的position就得到了UI的屏幕绝对坐标。对于屏幕空间UI,它的世界坐标position就是屏幕空间相对于屏幕左下角(0,0,0)的坐标了。

分辨率改变时,UI坐标一般都会改变。除了一种情况:某UI所在层级中所有父结点坐标都是相对父结点左下角的,该UI也必须时相对其父结点左下角的。原理是分辨率改变时只是在增大缩小画布尺寸,而画布左下角永远固定在原点(屏幕空间U)。

截图中下:

上面说的情况都是在画布为 screen space overlay,canvas scaler为const pixel size 情况下。这是最简单的一种情形。

假设现在设置游戏分辨率为1920X1080,正交相机cam设置为orthgraphicsize = 4.5,则相机视口高为9,宽为16,备用。

canvas的三种模式:

1,screen space overlay: 这时UI坐标的范围是(0,0) ~ (1920,1080),因为这时画布左下角在原点

2,screen space camera,UI相机设置为上面的cam,假设画布左下角在原点,这时UI坐标范围是(0, 0) ~ (16, 9),也就是说它和屏幕坐标不再是一一对应,而是缩放了。

3,world space,世界空间,这时UI就相当于一个3D物体了,必须使用Camera.WorldToScreenPoint才能转换到屏幕坐标。

canvasScaler三种模式:

1,constant pixel size: 固定像素大小,这时不无论如何改变游戏窗口大小(在UNITY编辑器中拉游戏窗口边框)Screen.width, Screen.height都是1920,1080

若是这时指定屏幕宽高比,如4:3,系统设备分辨率为1920X1080,则 Screen.width,Screen.heght是游戏窗口所框定的系统设备像素(窗口大小)

这时UI的位置和大小都是以此像素为单位的,

文档上说【Using the Constant Pixel Size mode, positions and sizes of UI elements are specified in pixels on the screen.】  

2,scale with screen size : 这种方式自定一种画布分辨率,UI会被先绘制到这个画布上,然后画布被缩放适配到游戏窗口上,此方式与比1要灵活一些,本质上一样。

如果画布宽高比与屏幕宽高比例不一致,这时如何使两者适配则由screen match mode来确定,常用的match width or height这种方式,总是取画布的宽或高较大的一方,然后根据屏幕宽高比算出另一方

比如:画布设定x 1920, y 1080, 屏幕分辨率取4:3模式,则实际上screen.width = 1920, screen.height = 1920 * 3/4

最新文章

  1. [转载]va_start和va_end使用详解
  2. 【CodeVS 2822】爱在心中
  3. RNN 入门教程 Part 2 – 使用 numpy 和 theano 分别实现RNN模型
  4. ExtJs特点、优缺点及注意事项
  5. eXosip2代码分析
  6. WPF如何实现类似iPhone界面切换的效果(转载)
  7. [工具开发] Perl 爬虫脚本--从美国国家漏洞数据库抓取实时信息
  8. js获取图片高度
  9. 关于cvAdsDiffS的那些事
  10. Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间
  11. IDEA maven项目创建速度慢
  12. Example012点击修改属性
  13. jquery checkbox 全选反选代码只能执行一遍,第二次就失败
  14. HTTP常见错误返回状态代码
  15. JUnit测试提示Java.lang.Exception: No runnable methods
  16. C# Claims-based(基于声明)的认证
  17. 【CF687D】Dividing Kingdom II 线段树+并查集
  18. JZOJ.5289【NOIP2017模拟8.17】偷笑
  19. linux命令(42):wc命令
  20. MVC - 12.HtmlHelper

热门文章

  1. hdu 3699 10 福州 现场 J - A hard Aoshu Problem 暴力 难度:0
  2. java之正则表达式的使用1
  3. 条件查询、SQL、JPQL、HQL比较
  4. Jenkins无法读取覆盖率报告的解决方法
  5. IOS NSBundle的使用,注意mainBundle和Custom Bundle的区别
  6. 回测框架pybacktest简介(二)
  7. 6-16 Topological Sort(25 分)
  8. NOIP模拟赛(洛谷11月月赛)
  9. sql server 多行合并一行
  10. NET简单的一个画图程序