unity中 利用UIStretch適配螢幕

NO IMAGE

好吧,在做完Demo之後,才發現UIStretch這個元件,這個元件說穿了就是用來控制widget的縮放的。

回想我之前做的Demo,為了讓彈出的NGUI對話方塊變成模式對話方塊(即它關閉之前,其他UI不能響應),我在UI中嵌入了一層覆蓋全屏的透明Sprite,用於捕捉點選事件,這個全屏的我當時是在Sprite上掛了個指令碼,在Start的時候,獲取Screen的Width和Height,來設定Sprite的長寬畫素(而且這樣做還是錯誤的,詳見上面那個NGUI螢幕適應的部落格),其實用UIStretch的話就完全不用了。

先來看Stretch元件的幾個引數和官方解釋:

Camera uiCamera =
null

Camera used to determine the anchor bounds. Set automatically if none was specified. More…

GameObject container =
null

Object used to determine the container’s bounds. Overwrites the camera-based anchoring if the value was specified. More…

Style style =
Style.None

Stretching style. More…

bool runOnlyOnce =
true

Whether the operation will occur only once and the script will then be disabled. Screen size changes will still cause the script’s logic to execute. More…

Vector2 relativeSize =
Vector2.one

Relative-to-target size. More…

Vector2 initialSize =
Vector2.one

The size that the item/image should start out initially. Used for FillKeepingRatio, and FitInternalKeepingRatio. Contributed by Dylan Ryan. More…

Vector2 borderPadding =
Vector2.zero

Padding applied after the size of the stretched object gets calculated. This value is in pixels. More…

其中那個Style有這幾種型別:

None   
Horizontal   
Vertical   
Both   
BasedOnHeight   
FillKeepingRatio   
FitInternalKeepingRatio

其中None表示不縮放,Horizontal和Vertical不瞭解。

前置宣告:

mh表示最終我們設計分辨的高。

mw表示最終我們設計解析度的寬。

sh表示我們螢幕解析度的高。

sw表示我們螢幕解析度的寬。

當 mh < sh時,螢幕留黑邊。

當mh > sh時,影象有部分超出螢幕外,被截斷了。

Both表示長寬分別按照relativeSize設定的X和Y進行縮放。

其中這裡的x和y是以螢幕尺寸為單位的,比如x為1,y為1,就表示元素的寬和高變為螢幕的寬高,如下:

mh = sh * y;

mw = sw * x;

BaseOnHeight表示先滿足高度的上面的縮放,然後寬的縮放也按高來計算。

mh = sh * y;

mw = sh * x;

FillKeepingRatio

改天再寫。

Horizontal為橫向拉伸。

Vertical為縱向拉伸。

Both為雙向拉伸,但xy方向上的拉伸比例不同。

BasedOnHeight為雙向拉伸,但xy方向上的拉伸比例相同,且比例基於height。

FillKeepingRatio為雙向拉伸,但xy方向上的拉伸比例相同,比例基於較大者。

FitInternalKeepingRatio為雙向拉伸,但xy方向上的比例相同,比例基於較小者。

注意 UIAnchor有個Container標誌,如果這個不設定,那麼什麼Left啊,bottom啊就是相對的整個螢幕而言,如果設定了物件,那就是相對於那個物件來說的。