[Unity]How to Instantiate A Image And SetParent

Posted by John on 2016-05-06
Words 481 and Reading Time 1 Minutes
Viewed Times

標題是這樣打啦,因為我不知道中文要怎麼翻比較恰當,主題大概是: 我要如何用Script使得在遊戲中可以產生一個Image,並設定他的Parent。

這是我昨天Google到半夜3點的結論,總結一下:

  1. 要產生一個UI物件時,要先將該物件作為Prefeb(預置物)
  2. Image在某個版本(確切幾版後不清楚)後需要再Canvas下才會顯示出來。
  3. 所以在製作時,必須要先產生該圖片,並設定他的父親(OOP繼承的概念),但是這裡有個問題:
    • Unity的Prefeb是無法SetParent的(原因大概是因為這樣就會改變預製物原先的狀態)

好,接下來一點一點來解決

  1. 首先,先把要生成的Image做成Prefab,然後我在Hierarchy先放了一個Canvas作為等下Image的父親

圖片1.png

接下來,就是Instantiate Image,這裡要注意的是,Image是Unity的UI物件,所以不是用GameObject。

程式碼最前面要先加上

using UnityEngine.UI;

Image NewArraw = (Image)Instantiate(arraw,GameObject.Find("Player").transform.position,

GameObject.Find("Player").transform.rotation) as Image;

//產生一個arraw的Image在Player的位置

  1. 再來設定他的父親,這裡會用到兩個API:SetParent、Find。
NewArraw.transform.SetParent(GameObject.Find("ArrawCanvas").transform, false);

這樣就成功摟!!

  1. 最後來講一下我學到的經驗: 之所以會卡那麼久主要是因為我在Instantiate的時候我一開始用了兩種方法
GameObject.Find();

Resources.Load();

這兩種都可以回傳一個GameObject的參考,所以可以當成Instantiate的參數使用。 兩者的差別是在於GameObject.Find()必須要在目前Hierarchy下有的物件才找的到,Resources.Load()需要創一個Resources的資料夾,並把Prefeb放進去。

由於我不想要讓物件一開始就存在遊戲中,我使用了後者的方法,但是這種方法就會造成無法SetParent,理由同我上述所說的,完畢。


>