Unity 3D之UI設置父子關系setParent坑


 寫在前面:

在做項目的時候,難免會碰到UI很多的情況,而動態加載UI就是一個很重要的問題。而動態加載UI就需要考慮到設置UI的父子關系。通常我們會使用transform.setparent(transform)來設置父子關系。到這里都還是沒毛病。但是偏偏UI在設置父子關系的時候需要考慮到第二個參數。對於初學者往往會遇到UI加載出來,設置子物體后發現UI不見了,但是明明直接拖到UI層次中又是對的。這個問題就和第二個參數相關。

worldPositionStays。所以這也是一個需要思考的問題。

 

UI設置父物體的原因分析

在加載UI中,這個加載步驟其實是首先將UI實例加載到場景的根路徑中,然后再設置到父物體中。這個過程可以用手工實現,先加UI拖到場景根路徑中,然后在拖到父物體下,此時顯示的效果就是最后的效果。

原因:在從根路徑拖到父物體這個過程中,就發生了坐標的轉化。具體分析和解決方法看下文。

 

setparent()

這里首先對這個函數進行分析。這個函數有兩個重載:

public void  SetParent(Transform parent);
public void  SetParent(Transform parent, bool worldPositionStays);
第一個是我們常用的只有一個參數的函數,第二個是加了一個是否保持世界坐標系的布爾型變量。
API中對於第二個參數的定義如下:
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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM