寫在前面:
在做項目的時候,難免會碰到UI很多的情況,而動態加載UI就是一個很重要的問題。而動態加載UI就需要考慮到設置UI的父子關系。通常我們會使用transform.setparent(transform)來設置父子關系。到這里都還是沒毛病。但是偏偏UI在設置父子關系的時候需要考慮到第二個參數。對於初學者往往會遇到UI加載出來,設置子物體后發現UI不見了,但是明明直接拖到UI層次中又是對的。這個問題就和第二個參數相關。
worldPositionStays。所以這也是一個需要思考的問題。
UI設置父物體的原因分析
在加載UI中,這個加載步驟其實是首先將UI實例加載到場景的根路徑中,然后再設置到父物體中。這個過程可以用手工實現,先加UI拖到場景根路徑中,然后在拖到父物體下,此時顯示的效果就是最后的效果。
原因:在從根路徑拖到父物體這個過程中,就發生了坐標的轉化。具體分析和解決方法看下文。
setparent()
這里首先對這個函數進行分析。這個函數有兩個重載:
worldPositionStays | If true, the parent-relative position, scale and rotation are modified such that the object keeps the same world space position, rotation and scale as before. |
官方解釋大意是:如果為真,那么就保持之前的位置、旋轉量、縮放值。而為否,的時候則保持局部坐標的位置、旋轉、縮放。
直接可能不太能理解這個參數的意思,所以就往后看。
由此引發的問題
通常我們在設置父子關系的時候,我們希望設置完后,子物體要保持原來的樣子。如果變了樣,那么就會對游戲的交互產生較為嚴重的影響。3D物體相對還好,UI在設置父物體如果沒有設置好會出現很嚴重的變形。
worldPositionStays
下面對這個參數帶來的影響做了對比試驗:
測試場景:
球體作為父物體,方塊作為子物體,分別的參數:
選擇方塊作為子物體能夠看出變化。
首先參數為true。
效果保持不變。球體和方塊的局部坐標值分別為:
可以看到在效果上保證了方塊不隨球體的變化而變化,但是其局部坐標值發生了變化,以球體為中心,但在效果上仍然是之前的相對位置。
其次參數為false
從效果上,可以看出方塊的旋轉和縮放值已經發生了變化,不在保存原來的世界坐標系中的位置。球體和方塊的局部坐標值分別為:
從參數上可以看出,方塊在局部數值上保證了和之前全局坐標系中的數值相同。
可以看出產生的影響還是較大的。
對於UI
對於UI來說,我們是希望保留這種位置關系還是不保留呢?答案很明顯,我們在做UI預設時是在UI的父物體下完成,保存到預設中的值也是UI局部坐標系中的值。
首先加載到場景根路徑時,此時UI將之前局部坐標系的值換成全局坐標系。
要保證和之前UI一樣,我們需要將這種位置關系帶到UI父物體中。
於是應該設置為false。
測試效果://UI來源蠻牛教程
設為true:
設為false:
THISSKY出品,原文鏈接:http://www.cnblogs.com/zhuhongjongy/p/7226386.html