1. 程式人生 > >記一個坑了我三天的知識點----用拖拽的方式給指令碼中Public變數賦值

記一個坑了我三天的知識點----用拖拽的方式給指令碼中Public變數賦值

做實驗室專案的時候,想要修改人物的顏色。於是我定義了一個Public Gameobject變數,想著用拖拽的方式給變數賦值,然後在腳本里修改顏色。拖拽的時候,我也沒管拖的是Prefab預製體還是Prefab例項化出來的普通的Gameobject。覺著都一樣,後來出現了很多的問題才發現原來這兩個是不一樣的,百度上也沒找到相關的部落格,所以我來總結一下。
1.Prefab上掛載的指令碼的Public變數只能由Prefab來賦值
如果你想用場景中普通Gameobject給Prefab上的變數賦值,會發現賦不了

2.普通Gameobject上掛載的指令碼的Public變數既可以拖拽Prefab來賦值,也可以拖拽普通Gameobject來賦值


但是,如果你拖拽Prefab來賦值,你在指令碼中所做的修改將只會對Prefab產生影響,而不會對場景中Prefab例項化出來的物體有影響
這麼說可能有點難以理解,下面來看一個例子:
Capsule和Cylinder是普通物體,而Cube和Sphere是和預製體相關聯的物體

有一個指令碼ChangePosition,我掛載在攝像機上
有兩個Public變數,通過拖拽的方式來賦值
程式碼如下:

public GameObject ob1;
    public GameObject ob2;
    void Start ()
    {
        ob1.transform.position = new Vector3(0
, 100, 0); ob2.transform.position = new Vector3(0, 100, 0); }

然後我拖拽Cube的預製體和Cylinder普通物體到兩個Public槽裡。這時,兩個物體的初始位置都為(0,0,0)。
執行前
執行後結果:
這裡寫圖片描述
可以看到,Cylinder的position改變了
這裡寫圖片描述
但場景中Cube的position卻沒有變化,這與我們的預期不符,根據上面的結論,應該是Cube預製體的position被更改了
這裡寫圖片描述
果然如此!

順便一提,寫部落格的時候用MarkDown比CSDN的自帶網頁編輯器要舒服太多了~強烈推薦