一 概述
想要使UI控件在屏幕中達到正確的顯示效果,比如自適應屏幕尺寸、固定邊距等等,首先要理清楚幾個基本概念和設置:錨點(anchor)、中心點(pivot)、位置(position)、UI縮放模式、父物件的transform設置
二???Anchor、Pivot與Position
2.1??Anchor (結論anchor以父物件為坐標參考系)
- anchor可以理解為是該控件所在的平面坐標系原點,在屏幕縮放或者形變的過程中,控件本身自始至終都是參照其anchor的位置進行相對移動。就像是船與船錨的關系。
- anchor可以設置一個坐標(x, y),這個坐標的參考系是該控件所屬的父層級,比如,如果直接在Canvas層級底下擺放控件,那么整個屏幕就是其父層級。不論這個父層級的比例高矮、像素多大,它的坐標范圍都會被鉗制在0-1之間,如果希望子物件的錨點位于父物件的正中間,那么子物件的錨點坐標需要設置為(0.5, 0.5)。
2.2 Pivot(結論pivot 以自身為坐標參考系)
- pivot雖然被翻譯為中心點,但容易造成誤解,因為pivot并不一定在物體中心,甚至可以超出物件的范圍。可以理解為軸點(繞該點旋轉),或者是吸附點(用該點去吸附目標位置)
- pivot也具有一個坐標 (x, y),這個坐標的參考系是控件本身(子層級),原點位于控件的最左下角,(1, 1)點位于最右上角
2.3 Position(結論 position是pivot與anchor的相對距離)
這里和anchoredPosition的位置計算方法類似
- position提供的信息是pivot與anchor的相對距離,例如坐標 (50,125)就代表:該控件的pivot位于自身anchor的x軸正方向50像素,y軸正方向125像素處。不論屏幕的比例、像素如何變化,pivot與anchor將始終保持(50, 125)的向量值
- 通過圖示可以清楚的看到,anchor以父物件為坐標參考系,pivot 以自身為坐標參考系,position代表二者的距離
三?顯示窗口與屬性面板
通過圖2可以看到:
- 不論錨點、中心點位于何處,控件的顯示位置依然在最中央
- anchor只能手動拖動到父物件的邊界,它的活動范圍取決于父物件的大小(如果直接設置坐標,可以超出這個范圍)
- pivot的位置不受限制,所以前面提到,“中心點”的翻譯并不貼切
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖二
但是令人尷尬的事情發生了,當屏幕的比例發生變化時,控件并沒有跟隨屏幕自適應(圖3)。不過可以注意到:
- 錨點依然位于父層級的左下角,錨點與父物件的相對位置沒有發生改變
- pivot與錨點的相對位置沒有發生改變
- 控件與pivot的相對位置沒有發生改變
通過梳理他們三者的關系,可以嘗試這樣一種思路:1.設置錨點坐標(0.5, 0.5),使其處于父物件的中心,不論屏幕如何變化,錨點都在中心位置。2.設置pivot坐標為(0.5, 0.5),使其處于子物件中心。3.設置PosX=0, PosY=0,使錨點到pivot的向量值歸零,吸附到一起。問題解決
點開Transform中的面板(圖4),這里可以快速設置錨點的位置,另外兩個必須要注意的按鍵是 shift 和 alt,可以有效提高我們的效率:shift+點擊 可以同時設置錨點與pivot;alt+點擊 可以同時設置錨點與position;兩個鍵同時按下則可以快速設置三個屬性
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖四
shift+alt+點擊,所有屬性會快速定位到對應的位置(圖5)。如果我們的目標位置在某一個空白處,則可以手動拖拽anchor,然后將PosX,PosY設置為(0, 0),消除pivot與anchor的相對距離,控件便會自動吸附到錨點處。由于pivot默認在控件的中心位置(0.5, 0.5),所以不需要額外設置。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖五
四 注意點 check points
4.1 UI縮放模式
找到 Canvas-UI Scale Mode,下拉菜單中有三種選項,分別是:constant pixel size/ scale with screen size/ constant phsical size。也就是保持像素/跟隨縮放/保持物理距離,該縮放模式與transform設置可以形成多種排列組合結果,所以就不舉例了。如果效果不正確,記得檢查該處設置即可
4.2 父物件的transform設置
通常不會將所有的UI控件都放在Canvas層級下,而是會有類似 Canvas-grandpa-father-son 的層級管理,所以應當注意之中的 grandpa、father的尺寸(寬度width*高度height),如果最底下的son控件需要根據整個屏幕自適應,那么須確保grandpa與father已填充了屏幕尺寸。(如圖4所示,可以通過alt+點擊最右下角,填充整個屏幕)
五 思考
5.1 題目描述
現在需要在屏幕右下角放置一個button,有兩種設計模式,一種是永遠保持與屏幕邊框20像素;另一種是永遠在屏幕右下角1/10距離處,應該如何實現?
5.2 分析方案
對于第一種模式,我們需要將pivot移動到控件的右下角(1, 0),將anchor移動到屏幕的右下角(1,0),然后將position(相對距離)設置為 PosX=-20, PosY=20, 使pivot位于錨點x軸負方向20像素,y軸正方向20像素處見下圖
對于第二種模式,pivot設置為(1,0),錨點設置為(0.9,0.1),PosX=0, PosY=0,將pivot吸附到錨點如下圖
六?localPosition與anchoredPosition(3D)的區別 見下面鏈接
unity知識點 專項一 localPosition與anchoredPosition(3D)的區別-CSDN博客