一、setparent函數(shù)
setparent函數(shù)是Unity3D引擎中的一個(gè)非常重要的函數(shù),它用于改變GameObject的父子關(guān)系,從而實(shí)現(xiàn)調(diào)整物體在場(chǎng)景中的位置、旋轉(zhuǎn)和縮放等。
setparent函數(shù)的基本原型如下:
public void SetParent(Transform parent, bool worldPositionStays = true);
其中,parent參數(shù)為目標(biāo)GameObject的父物體,worldPositionStays參數(shù)用于指定是否保持目標(biāo)GameObject在世界坐標(biāo)系中的位置。
二、setparent取消父類
如果不需要將GameObject設(shè)置為任何物體的子節(jié)點(diǎn),可以通過將其父節(jié)點(diǎn)設(shè)置為null來使其成為獨(dú)立節(jié)點(diǎn)。
//將gameObject的父物體設(shè)置為null,使其成為獨(dú)立節(jié)點(diǎn)
gameObject.transform.SetParent(null);
三、setparent(form)
在UI界面開發(fā)中,常常需要將控件移動(dòng)到指定的UI面板中,可以使用setparent(form)函數(shù)實(shí)現(xiàn)該功能。其中,form為目標(biāo)UI面板的transform組件
//將gameObject移動(dòng)到指定的UI面板中
gameObject.transform.SetParent(targetForm);
四、setparent跨進(jìn)程
Unity3D不支持在不同場(chǎng)景之間直接傳遞Object對(duì)象,但是可以通過類似進(jìn)程間通信的方式來實(shí)現(xiàn)。
例如,需要在場(chǎng)景A中創(chuàng)建一個(gè)物體,并將其傳遞到場(chǎng)景B中??梢栽趫?chǎng)景B中創(chuàng)建一個(gè)空物體,在該物體上附加組件,并將其設(shè)置成腳本掛載組件,從而實(shí)現(xiàn)通過該組件的引用來獲取在場(chǎng)景A中創(chuàng)建的物體。
五、setparent(this)
在腳本中使用setparent函數(shù)時(shí),可以通過關(guān)鍵字this來代表當(dāng)前腳本所在的游戲?qū)ο蟆?/p>
//將當(dāng)前對(duì)象移動(dòng)到目標(biāo)物體下
this.transform.SetParent(targetTransform);
六、setparent setowner
在網(wǎng)絡(luò)游戲開發(fā)中,服務(wù)器在接收客戶端發(fā)送的消息時(shí),需要將該消息的所有者設(shè)置為服務(wù)器本身,防止惡意玩家篡改消息內(nèi)容??梢酝ㄟ^setparent setowner函數(shù)實(shí)現(xiàn)該功能。
七、setparentstatic
setparent函數(shù)有一個(gè)靜態(tài)版的版本,即setparentstatic。它可以直接改變GameObject的父子關(guān)系,而不需要同時(shí)改變transform組件。
//直接將gameObject設(shè)置為父物體的子節(jié)點(diǎn)
GameObject.SetParentStatic(child, parent);
八、setparent函數(shù)不成功?
有時(shí)候,調(diào)用setparent函數(shù)無法達(dá)到預(yù)期的效果,這可能是由于以下原因:
1. 目標(biāo)物體和原始父物體在不同的場(chǎng)景中;
2. 目標(biāo)物體的Transform組件的hideFlags屬性值被設(shè)置成了HideAndDontSave;
3. 目標(biāo)物體的Transform組件的parent屬性為null。