隱藏3D模型及GetComponentsInChildren的使用

隱藏3D模型及GetComponentsInChildren的使用

有時游戲設計的需求,在場景中的3D模型物件未必都是一開始就一直是顯示的狀態,有可能會因為某些事件的發生而必須將物件隱藏,或因為某些事件的發生必須使該物件再次顯示出來,通常在大部份的狀況,我們可能會先制作一個Prefabs,在需要該物件時利用Instantiate()建立一個實例物件,使物件在場景中運作,在不需要該物件時利用Destroy()將此物件銷毀,可是如果我們的需求是必須持續使用該物件,物件本身帶有某些資料值會持續使用到,那么就不能隨意將其銷毀,但此時需有一段時間不能使該物件出現在畫面上,那么我們應該怎么做呢?

物件的隱藏與顯示,這個定義上很廣泛,主要就是讓鏡頭里看不到此物件,以下就來討論幾種方式

將物件移出鏡頭外

通常游戲場景都會有地板、背景等,我們如果暫時需要將物件隱藏掉,可暫時改變物件在3D空間的座標位置,將它藏在地板下、背景后,甚至是鏡頭后方,這樣就可以很輕易的隱藏畫面中的物件,不過,有些缺點,就是當需要再次將物件顯示在畫面之中時,必須將物件放回正確的位置,如果游戲場景及鏡頭都是定點固定不動的,那么將物件放回原來位置并不難,但如果游戲場景、鏡頭都是依照游戲進行在不斷運作改變方向及內容的話,此時在處理物件座標定位上可能就要多費點功夫了。

統一儲存相關資訊

如上面第一段所提到的,在需要時產生物件,在不需要顯示時銷毀物件,需要延續使用的相關數據,統一儲存在某個記憶位置、檔案、資料庫...中,如此做法其實相當直接,不需要的東西就丟,但也有同樣的問題,當該物件于下次需要顯示時,我們必須要很清楚知道他應該出現的位置,然后在這個位置產生物件,使游戲進行不會錯亂掉,但對于有使用物理碰撞反彈等等的游戲,那就很難去預測到該出現的正確位置,而且如果這些位置數據還要自己寫程式計算的話,Unity的物理引擎反倒顯得無用武之地了。

關閉物件,使物件無法運作

當游戲進行到某事件發生時,我們不想將物件銷毀,而只想讓物件在目前位置消失并停止運作,等待之后事件發生時再顯示出來,此時我們就可以利用GameObject.active將該物件關閉,或使用GameObject.SetActiveRecursively()直接將該物件及他的子物件全部關閉,使他停止運作,因為物件被停止了,所以此時他將不會顯示在畫面上,而物件本身帶有的Component也都會停止運作,待之后事件發生需要顯示該物件時再將其開啟,不過此時很容易發生一種情形是,GameObject.Find()要找回此物件并將其開啟時,卻發現找不到,因為Find()只會幫你找出正在活動中的物件,所以在將物件關閉前,我們必須將此物件放至預先定義好的變數成員中,使我們的程式保有他的參照,在需要開啟時才能利用此參照找回這個已被關閉的物件;因為已持有他的參照,所以此物件雖然是在關閉的狀態,但我們仍然能對他控制,使他改變位置或變更其他數據,但也因為是關閉的狀態,所以我們付予他的任何主動功能動作將不會運作。

只控制renderer的開關

這是最直接的方式,利用renderer.enabled來控制模型渲染是否啟用,關閉了就只是看不到該物件,但全部的Component仍然正常運作中,待需要顯示時再將它開啟,不過通常一個模型并不單單只有一個物件,例如一個人物可能分為上半身、下半身、身體、手、腳、頭等等,甚至是更細部,所以我們可能就會想利用類似這樣的方式將子物件的模型渲染都關閉..

for(var_child:TransforminparentObject){

_child.renderer.enabled=false;

}

但是如果整個模型構造不只一層,而是多層次的樹狀結構,那么我們可能就需要用巢狀式的forin回圈一層一層的執行renderer.enabled=false,此時又必須考慮到每個模型的樹狀結構都不同,總不能為每個模型都客制化寫一個巢狀回圈讓他們去做隱藏,這樣子寫程式就太笨了,于是我們可能會寫一個script專門做這個動作,不過我們并不知道模型的結構會有幾層,這么做還真是不好處理;幸好Unity有個GameObject.GetComponentsInChildren()幫我們解決了這個問題,在這部份,我們不再去考慮模型本身是否有子物件或者是有幾層的結構,一句話就能取得全部并控制他們;官方說明頁面的范例,我照樣的改到我的程式中并無法取得我需要的東西,所以在此提供我的寫法以供參考...

varmeshObject:Transform;

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

for(var_comp:Componentin_component){

_comp.renderer.enabled=false;

}

如此,我們很方便的就能為物件隱藏或顯示,但物件在游戲場景中仍正常動作中,如果設計了一些物理運作或碰撞事件,那么物件碰到某物件或移動到某個區域就自己隱藏起來,隱藏后仍繼續活動,可能又碰到了某物件或到了某個特定區域又再自己顯示出來,如此下去,我們可以省掉許多程式運算及控制,只要在適當的時候告訴物件應該隱藏或顯示就行了。

GetComponentsInChildren()不只是用在物件的renderer的控制上,還可用在任何Component的控制上,所以我們可以將數個相關的物件都放到一個空物件中,以群組的方式利用GetComponentsInChildren()來統一管理并控制其中的Component及script中的變數成員及函式。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容