該篇文章將會說明 GameObject 與 Prefab 之間的關聯性相關,會以 "GameObject 與 Prefab 的區別與建立" 該篇文章的範例來講解,有需要的可前往下載。
 
當你使用 GameObject 去建立一份 Prefab 之後,它們之間就會有一定的關聯性。
 
以下是我將場景上的 Cube 拖曳至 Assets 裡面建立成 Prefab 後的畫面:

image01.jpg

可以看到場景上的 Cube 名稱變成藍色的了,這表示該 GameObject 有一份 Prafab 在 Assets 裡面,並且兩者之間有一定的關聯在。
 
 
現在我將 Assets 中的 Cube Prefab 移除後的畫面,場景上的 Cube 變成紅色的了,這表示該 GameObject 原本有 Prefab,但是 Prefab 被移除了,它失去了關聯性:

image02.jpg

但若是想取消關聯性的話,可參考這篇文章 "取消 GameObject 與 Prefab 之間的關聯"。

 
 
一個正常擁有 Prefab 的 GameObject 的 Inspector 會是這樣的,它會擁有 Select、Revert、Apply 這三個按鈕:

image04.jpg

 
Select = 顯示該物件的 Prefab,點選之後 Preject 視窗會直接顯示該 Prefab 的位置。
Revert = 將該物件內的設定等等,恢復成關聯 Prefab 內的設定。
Apply = 將目前物件內的設定,覆蓋掉原本關聯 Prefab 內的設定。
 
但是在使用 Revert 與 Apply 這兩個按鈕時,必須注意到 Transform 這支腳本!
當我點擊 Revert 按鈕時,Transform 內的值是不會被還原的。(Scale 除外)
換成點擊 Apply 按鈕時,Transform 內的值是會覆寫到關聯 Prefab 的。
 
 
例如,我選擇 Project 內的 Cube,並且修改它 Transform 內的值:

image05.jpg

 
但是場景內的 Cube 物件,它 Transform 的值並沒有同步被修改,就算狂點 Revert 也一樣。(Scale 除外)

image06.jpg

 
 
現在換成我直接修改場景中 Cube 物件 Transform 的值,並且按下 Apply 的話:

image07.jpg

 
會發現 Assets 裡面 Cube Prefab 的 Transform 不一樣了!它被修改了。

image08.jpg

 
 
現在我們看到場景上的 Cube,為什麼 Position 與 Rotation 無法還原為 Prefab 的值呢?
其實這是因為 Position 與 Rotation 被設為依使用者設定為主了,如果仔細看變數名稱的話,會發現名稱變成粗體的了!而 Scale 卻是一般字體。

image09.jpg

 
我們點選場景上的 Cube,看 BoxCollider 這個腳本,它目前 Center 這變數名稱為一般字體。

image10.jpg

這表示它的值會與 Prefab 內的值同步,Prefab 被更動的話,場景上的 Cube 也會同步被更動。
但是場景上 Cube 內的值被更動了,Prefab 並不會被同步,除非你按下 Apply 按鈕,場景上 Cube 內的值才會同步到 Prefab 裡。
 
現在我們針對 X 隨便設定一個值。
image11.jpg
大家會發現 Center 變成粗體字,而 X 也變成粗體字了,這表示 Center 內的 X 被設為依照使用者設定為主了。
但是 Y 與 Z 卻還是一般字體,所以當 Prefab 內的值被更動時,Y 與 Z 是會跟著同步的!但是 X 不會!
 
現在我們選擇 Prefab,將 Center 的值做調整,來驗證一下上面敘述是否正確。

image12.jpg

 
的確!場景上的 Cube 除了 X 不變以外,Y 與 Z 都被同步成跟 Prefab 設定的一樣了!

image13.jpg

 
 
這算是一個小小的提示功能,提示你說那些變數會與 Prefab 同步,那些不會。
所以基本上可以知道的是,除了 Transform 內的 Position、Rotation 不會被同步之外,其它所有腳本內的變數,只要是預設值 (一般字體),它都會與 Prefab 的值同步。
但只要變數的值被更動過後,會就變成依使用者設定為主 (粗體字體),不會與 Prefab 的值同步。
 
 
以上為腳本內的數值關聯說明,下面為腳本:
 
選者場景中的 Cube,不管你怎麼添加、移除腳本,其實都不影響 Prefab,除非你按下了 Apple 按鈕。
現在我移除掉場景中 Cube 的所有腳本,再添加一個 Create 腳本。

image14.jpg

 
Prefab 都沒變化。

image15.jpg

 
 
但只要我按下 Apple 按鈕,Prefab 內的設定就會跟場景上的 Cube 一樣。

image16.jpg

 
Prefab 設定被覆蓋了。

image17.jpg

 
 
但我如果是在 Prefab 中添加、移除腳本的話,場景上的 Cube 是會直接被同步成跟 Prefab 一樣的!所以這邊使用上要特別小心!
例如我直接在 Prefab 中移除 Create 腳本,並且把新增其它腳本。

image18.jpg

 
場景上的 Cube 直接被同步了。

image19.jpg

 
 
總結:
選擇場景中的 GameObject 按下 Revert 按鈕的話,除了 Transform 內的 Position、Rotation 之外的所有腳本、變數等等,都會被還原為 Prefab 所設定的值。
場景中的 GameObject 不管新增或移除腳本,或者修改了腳本內的數值,都不會影響 Prefab,但是按下 Apple 按鈕之後,這些修改過後的數值就會覆蓋掉原本的 Prefab。
若直接針對 Prefab 做修改,當修改了腳本內的數值時,場景上的 GameObject 除了 "粗體字" 不會被更動外,其它 "一般字體" 的所有變數都會同步被修改。
若直接將 Prefab 內的腳本做新增或移除的話,場景中的 GameObject 內的腳本,也會一併被新增或移除,不管是否為 "粗體字"。
 
arrow
arrow
    文章標籤
    Unity GameObject Prefab
    全站熱搜

    岳 發表在 痞客邦 留言(0) 人氣()