隱藏3D模型及GetComponentsInChildren的使用

Babybus-u3d技術(shù)交流-隱藏3D模型及GetComponentsInChildren的使用

有時(shí)游戲設(shè)計(jì)的需求迷帜,在場(chǎng)景中的3D模型物件未必都是一開(kāi)始就一直是顯示的狀態(tài),有可能會(huì)因?yàn)槟承┦录陌l(fā)生而必須將物件隱藏捷绑,或因?yàn)槟承┦录陌l(fā)生必須使該物件再次顯示出來(lái),通常在大部份的狀況玻粪,我們可能會(huì)先制作一個(gè)Prefabs论泛,在需要該物件時(shí)利用Instantiate()建立一個(gè)實(shí)例物件辩撑,使物件在場(chǎng)景中運(yùn)作,在不需要該物件時(shí)利用Destroy()將此物件銷毀竞漾,可是如果我們的需求是必須持續(xù)使用該物件眯搭,物件本身帶有某些資料值會(huì)持續(xù)使用到,那么就不能隨意將其銷毀业岁,但此時(shí)需有一段時(shí)間不能使該物件出現(xiàn)在畫(huà)面上坦仍,那么我們應(yīng)該怎么做呢?

物件的隱藏與顯示叨襟,這個(gè)定義上很廣泛繁扎,主要就是讓鏡頭里看不到此物件,以下就來(lái)討論幾種方式:

將物件移出鏡頭外

通常游戲場(chǎng)景都會(huì)有地板糊闽、背景等梳玫,我們?nèi)绻麜簳r(shí)需要將物件隱藏掉,可暫時(shí)改變物件在3D空間的座標(biāo)位置右犹,將它藏在地板下提澎、背景后,甚至是鏡頭后方念链,這樣就可以很輕易的隱藏畫(huà)面中的物件盼忌,不過(guò)积糯,有些缺點(diǎn),就是當(dāng)需要再次將物件顯示在畫(huà)面之中時(shí)谦纱,必須將物件放回正確的位置嘉栓,如果游戲場(chǎng)景及鏡頭都是定點(diǎn)固定不動(dòng)的缭付,那么將物件放回原來(lái)位置并不難究履,但如果游戲場(chǎng)景亡笑、鏡頭都是依照游戲進(jìn)行在不斷運(yùn)作改變方向及內(nèi)容的話,此時(shí)在處理物件座標(biāo)定位上可能就要多費(fèi)點(diǎn)功夫了祠乃。

統(tǒng)一儲(chǔ)存相關(guān)資訊

如上面第一段所提到的梦重,在需要時(shí)產(chǎn)生物件,在不需要顯示時(shí)銷毀物件亮瓷,需要延續(xù)使用的相關(guān)數(shù)據(jù)琴拧,統(tǒng)一儲(chǔ)存在某個(gè)記憶位置、檔案嘱支、資料庫(kù)...中蚓胸,如此做法其實(shí)相當(dāng)直接,不需要的東西就丟斗塘,但也有同樣的問(wèn)題赢织,當(dāng)該物件于下次需要顯示時(shí),我們必須要很清楚知道他應(yīng)該出現(xiàn)的位置馍盟,然后在這個(gè)位置產(chǎn)生物件于置,使游戲進(jìn)行不會(huì)錯(cuò)亂掉,但對(duì)于有使用物理碰撞反彈等等的游戲贞岭,那就很難去預(yù)測(cè)到該出現(xiàn)的正確位置八毯,而且如果這些位置數(shù)據(jù)還要自己寫(xiě)程式計(jì)算的話,Unity的物理引擎反倒顯得無(wú)用武之地了瞄桨。

關(guān)閉物件话速,使物件無(wú)法運(yùn)作

當(dāng)游戲進(jìn)行到某事件發(fā)生時(shí),我們不想將物件銷毀芯侥,而只想讓物件在目前位置消失并停止運(yùn)作泊交,等待之后事件發(fā)生時(shí)再顯示出來(lái),此時(shí)我們就可以利用GameObject.active將該物件關(guān)閉柱查,或使用GameObject.SetActiveRecursively()直接將該物件及他的子物件全部關(guān)閉廓俭,使他停止運(yùn)作,因?yàn)槲锛煌V沽税ぃ源藭r(shí)他將不會(huì)顯示在畫(huà)面上研乒,而物件本身帶有的Component也都會(huì)停止運(yùn)作,待之后事件發(fā)生需要顯示該物件時(shí)再將其開(kāi)啟淋硝,不過(guò)此時(shí)很容易發(fā)生一種情形是雹熬,GameObject.Find()要找回此物件并將其開(kāi)啟時(shí)宽菜,卻發(fā)現(xiàn)找不到,因?yàn)镕ind()只會(huì)幫你找出正在活動(dòng)中的物件竿报,所以在將物件關(guān)閉前铅乡,我們必須將此物件放至預(yù)先定義好的變數(shù)成員中,使我們的程式保有他的參照仰楚,在需要開(kāi)啟時(shí)才能利用此參照找回這個(gè)已被關(guān)閉的物件隆判;因?yàn)橐殉钟兴膮⒄杖樱源宋锛m然是在關(guān)閉的狀態(tài)僧界,但我們?nèi)匀荒軐?duì)他控制,使他改變位置或變更其他數(shù)據(jù)臭挽,但也因?yàn)槭顷P(guān)閉的狀態(tài)捂襟,所以我們付予他的任何主動(dòng)功能動(dòng)作將不會(huì)運(yùn)作。

只控制renderer的開(kāi)關(guān)

這是最直接的方式欢峰,利用renderer.enabled來(lái)控制模型渲染是否啟用葬荷,關(guān)閉了就只是看不到該物件,但全部的Component仍然正常運(yùn)作中纽帖,待需要顯示時(shí)再將它開(kāi)啟宠漩,不過(guò)通常一個(gè)模型并不單單只有一個(gè)物件,例如一個(gè)人物可能分為上半身懊直、下半身扒吁、身體、手室囊、腳雕崩、頭等等,甚至是更細(xì)部融撞,所以我們可能就會(huì)想利用類似這樣的方式將子物件的模型渲染都關(guān)閉..

for(var_child:TransforminparentObject)
{

 _child.renderer.enabled=false;

}

但是如果整個(gè)模型構(gòu)造不只一層盼铁,而是多層次的樹(shù)狀結(jié)構(gòu),那么我們可能就需要用巢狀式的forin回圈一層一層的執(zhí)行renderer.enabled=false尝偎,此時(shí)又必須考慮到每個(gè)模型的樹(shù)狀結(jié)構(gòu)都不同饶火,總不能為每個(gè)模型都客制化寫(xiě)一個(gè)巢狀回圈讓他們?nèi)プ鲭[藏,這樣子寫(xiě)程式就太笨了致扯,于是我們可能會(huì)寫(xiě)一個(gè)script專門(mén)做這個(gè)動(dòng)作肤寝,不過(guò)我們并不知道模型的結(jié)構(gòu)會(huì)有幾層,這么做還真是不好處理急前;幸好Unity有個(gè)GameObject.GetComponentsInChildren()幫我們解決了這個(gè)問(wèn)題醒陆,在這部份,我們不再去考慮模型本身是否有子物件或者是有幾層的結(jié)構(gòu)裆针,一句話就能取得全部并控制他們刨摩;官方說(shuō)明頁(yè)面的范例寺晌,我照樣的改到我的程式中并無(wú)法取得我需要的東西,所以在此提供我的寫(xiě)法以供參考...



varmeshObject:Transform;
_components:Component[]=meshObject.GetComponentsInChildren(Renderer);

for(var_comp:Componentin_component)
   {
        _comp.renderer.enabled=false;
  }

如此澡刹,我們很方便的就能為物件隱藏或顯示呻征,但物件在游戲場(chǎng)景中仍正常動(dòng)作中,如果設(shè)計(jì)了一些物理運(yùn)作或碰撞事件罢浇,那么物件碰到某物件或移動(dòng)到某個(gè)區(qū)域就自己隱藏起來(lái)陆赋,隱藏后仍繼續(xù)活動(dòng),可能又碰到了某物件或到了某個(gè)特定區(qū)域又再自己顯示出來(lái)嚷闭,如此下去攒岛,我們可以省掉許多程式運(yùn)算及控制,只要在適當(dāng)?shù)臅r(shí)候告訴物件應(yīng)該隱藏或顯示就行了胞锰。

GetComponentsInChildren()不只是用在物件的renderer的控制上灾锯,還可用在任何Component的控制上,所以我們可以將數(shù)個(gè)相關(guān)的物件都放到一個(gè)空物件中嗅榕,以群組的方式利用GetComponentsInChildren()來(lái)統(tǒng)一管理并控制其中的Component及script中的變數(shù)成員及函式顺饮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凌那,隨后出現(xiàn)的幾起案子兼雄,更是在濱河造成了極大的恐慌,老刑警劉巖帽蝶,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赦肋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嘲碱,警方通過(guò)查閱死者的電腦和手機(jī)金砍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)麦锯,“玉大人恕稠,你說(shuō)我怎么就攤上這事》鲂溃” “怎么了鹅巍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)料祠。 經(jīng)常有香客問(wèn)我骆捧,道長(zhǎng),這世上最難降的妖魔是什么髓绽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任敛苇,我火速辦了婚禮,結(jié)果婚禮上顺呕,老公的妹妹穿的比我還像新娘枫攀。我一直安慰自己括饶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布来涨。 她就那樣靜靜地躺著图焰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蹦掐。 梳的紋絲不亂的頭發(fā)上技羔,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音卧抗,去河邊找鬼藤滥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛颗味,可吹牛的內(nèi)容都是我干的超陆。 我是一名探鬼主播牺弹,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼浦马,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了张漂?” 一聲冷哼從身側(cè)響起晶默,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎航攒,沒(méi)想到半個(gè)月后磺陡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漠畜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年币他,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憔狞。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝴悉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瘾敢,到底是詐尸還是另有隱情拍冠,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布簇抵,位于F島的核電站庆杜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏碟摆。R本人自食惡果不足惜晃财,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望典蜕。 院中可真熱鬧断盛,春花似錦雏逾、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至厢洞,卻和暖如春仇让,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躺翻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工丧叽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人公你。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓踊淳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親陕靠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子迂尝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容