今天的文章比较短,但却非常麻烦。
情况是这样的,如果是普通的游戏画面,那么不同的分辨率,并不影响摄像机看到的画面,玩家只需要移动视角就可以改变自己看到的东西。
一些竞技性的游戏,例如英雄联盟,cs会限制玩家的视距,很多cs玩家都会调整到4:3比例,但仅此而已。
但是UI呢?作为显示在游戏画面之上的内容,它的关键是玩家不能移动自己的视角来改变自己该看什么。
所以必须设定UI的位置,来让不同分辨率的画面都能显示完全UI内容。
而这就折磨人了。
游戏的UI比起网页的UI更折磨,因为网页至少有滚动条存在,如果分辨率太小,看不全的内容,可以拖动滚动条,滑动手指看,但游戏的UI不行。(而这就有另一个坑,同一个鼠标点击,UI的接收系统和游戏世界的接收系统是两个存在,UI的射线并不知道同时有没有另一个游戏对象的射线存在)
所以,游戏的多分辨率适配是格外地狱的存在。
一个最基本的处理办法,设置一个基本的分辨率,而其他分辨率的屏幕显示,都从基本分辨率拉伸
不,不,拉伸绝对不行!

和cs一样,拉伸画面会让所有画面内容变形,原来一个瘦长小伙在另一个分辨率里会变中年胖大叔。
另一个方法是,设定锚点,如果画面很宽,内容就往两边张开,如果画面更窄,内容就往里挤一挤。
这就带来另一个问题了,为了做到这点,unity被迫新创造了一个坐标体系,anchored position,这个坐标体系是什么呢?

没错,搜不到,没有单独介绍这个坐标的,unity里把它统一到UI课程里,需要在四十多分钟的课程里找那五分钟的粗浅讲解。
导致它还不如p站引擎的amazon position坐标系更广为人知。
噢,我知道你要说锚点,没错,这个词也搜不到。
仔细讲还很复杂,总的来说,anchored Position忽略了父UI的所有变化,它只根据父UI的左上左下右上右下四个角决定自己的位置。而localPosition要考虑的就多了。
具体的计算公式复杂到让我脑袋爆炸,比算法还复杂,怪不得没多少人学UI,就这垃圾系统谁愿意学。
最后我只能自己穷举每种情况解决,一点也不直观。
现在是我的总结:
父UI的anchor决定了它会不会随分辨率不同改变长宽(如果在代码里手动改父节点长宽也有同样效果) 这种情况,子UI的LocalPosition会改变,而anchoredPosition不变
父UI的pivot决定了子UI的localPosition零点在哪里。会改变LocalPosition
子UI的anchor会改变anchoredPosition,如果子UI的anchor和父UI的Pivot一致,那么子UI的AnchoredPosition和localPosition一致。
移动子UI当然会同时改变anchoredPosition和localPosition
改变子UI的Pivot也会同时改变anchoredPosition和localPosition

这根本一点逻辑都不遵循嘛!
总之,其实……我也没总结出什么
但是,为了让分辨率适配,尽量设置anchor,具体怎么用,反复测试,反复手调,不要试图总结规律。
让UI移动,也尽量改变它的anchorPosition,因为它不会随着分辨率不同而改变。不要改变localPosition,因为它会随着父UI的不同而有无法预料的变化。(子UI当然不能知道父UI发生了什么)


游戏分辨率变化主要需要解决的还是UI的适配,画面拉伸的情况应该还是不至于发生的(至少在unity里)
这个关键词是Rect Transform
自带的UI系统还是能应对大多数问题的
额外附赠一个小Tip:(alt和 shift这俩键,包括一起按下,在你和Anchor那个蓝色十字图标互动时有大用的,可以试试)