Unity3D深入淺出 -組件與節點之間的調用關系


一、transform組件用途

1.維護場景樹

2.對3D物體的平移,縮放,旋轉

 

二、場景樹定義

在Hierarchy視圖中顯示的:

一個game_scene場景,下面有Main Camera節點,Directional Light節點,game_root節點,game_root節點下又有Cube子節點,Sphere子節點,組成game_scene場景樹。

 

 

三、組件和節點

1.每個節點都有一個transform組件

 

2.每一個繼承自MonoBehaviour的組件都有一個數據成員指向這個節點的transform組件。

使用this.transform;獲得。//可以通過任何一個組件來獲得每一個節點的transfrom組件。

同理,由於每一個繼承自MonoBehaviour的組件都有一個數據成員gameObject指向組件實例所掛載的場景的節點對象,transfrom它也是一個組件,所以它也有一個gameObject指向它掛的節點。

使用this.transform.gameObject獲得。//Debug.Log(this.transform.gameObject.name);

 

3.每一個繼承自MonoBehaviour的組件都有一個數據成員gameObject指向組件實例所掛載的場景的節點對象,使用this.gameObject獲得。

Debug.Log(this.gameObject.name);//節點名字
Debug.Log(this.gameObject.layer);//節點所在層名字

Debug.Log(this.gameObject.tag);//節點的標記或標簽值
Debug.Log(this.gameObject.activeSelf); // 自己這個屬性是否可見,自己節點名字旁邊的勾是否打了,結果是true或false
Debug.Log(this.gameObject.activeInHierarchy); // 自己在這個體系里面是否可見,也就是如果它的父節點設置為不顯示,自己還是可見的,那么它的activeInHierarchy就是不可見,結果是true或false

this.gameObject.SetActive(true);//設置節點為可見

 

 4.總結

一個節點上掛載的所有組件實例,包括transform組件實例都有一個數據成員(transform)指向transform組件,所有組件實例,包括transform組件實例都有一個數據成員(gameObject)指向該節點。

所以經常用this.tranform,this.gameObject獲得。

 

5.場景樹的構成過程

每一個節點都有一個transform組件,一個父transform組件下面有好多子transform組件,而每一個transform組件都指向一個節點,在transform組件構成transform時,另一方面也間接構成了節點樹。

 

 

 

五、使用transform組件訪問孩子節點

所以可以用transform組件,來訪問或者獲得節點下面的所有孩子節點
方法1
比如找到game_root節點下的Cube節點,在game_root節點的game_scene組件的start方法里面寫
Transform trans = this.transform.Find("Cube");//找到孩子transform組件里節點名叫Cube的transform組件
GameObject cube= trans.gameObject;//通過Cube的transform組件再得到它的gameObject節點
Debug.Log(cube.name);//輸出Cube節點名字

方法2
Transform trans = this.transform.FindChild("Sphere");
GameObject sphere= trans.gameObject;
Debug.Log(sphere.name);


方法1和2的區別是
find可以多層嵌套查詢,可以查孫子節點,孫子的孫子節點,FindChild只能查自己的子節點。
多層節點查詢要寫路徑
Transform trans = this.transform.Find("Sphere/test");
GameObject test = trans.gameObject;
Debug.Log(test.name);


方法3
this.transform.GetChild(0).gameObject.name;//0代表第一個子節點的transform組件,1代表第二個,以此類推,性能比find好一些,但是我們通常用find

 

 //查找一個父節點到底有多少個子節點,或者叫子transform組件
Debug.Log(this.transform.childCount);

 

 

六、使用transform組件訪問父親節點

子節點找父節點也是先找到子節點的transform組件,再得到父親的transform組件,最后得到父親的gameObject節點
Transform trans = this.transform.Find("Sphere/test");
Debug.Log(trans.parent.gameObject.name);
所以每一個transform組件實例還有一個數據成員(parent)指向父節點的transform組件。

Main Camera,Directional Light,game_root這些節點都是沒有父節點的,他們的transform組件也沒有父親的transform組件


 

七、使用GameObject查找節點

// 基於GameObject的查找,來找GameObject,全局查找,GameObject.Find靜態函數
Debug.Log(GameObject.Find("game_root/Sphere/test").name);

 

 

八、使用Tag查找節點
// 基於Tag的全局查找,如果有多個節點的Tag是一樣的,那么先找到的,先返回,查找的順序好像不是是按順序從上到下的,深的子節點反而先找到
Debug.Log(GameObject.FindWithTag("game_root").name);
Debug.Log(GameObject.FindWithTag("test").name);//多層嵌套的沒關系,只要用自己的Tag查找就行了

// 如果有多個節點,都是同樣的tag,會發生什么樣的事情呢?
GameObject[] game_sets = GameObject.FindGameObjectsWithTag("test");//返回的是一個放着GameObject類型元素的數組
for (int i = 0; i < 2; i++) {
Debug.Log(game_sets[i].name);//先子后父
}

 

九、絕對坐標和相對坐標(世界坐標和局部坐標)

1.我的家在地球上東經10,北緯10(世界坐標)
2.我在我家往北100米(相對坐標)
1+2=我的世界坐標


獲得節點的坐標位置
Debug.Log(this.transform.position);//(0,2,10)//Unity編輯器里面的postion是相對坐標,可是代碼里面的postion是絕對坐標,也就是說這里的position是絕對坐標

相對坐標是
Debug.Log(trans.localPosition); // (0, 2, 0)

 

 

十、forward,right,up
把物體想象成一個人,本來這個人的x,y,z坐標軸的指向是和世界的x,y,z坐標軸的指向是重合的,x代表right,y代表up,z代表forward
如果把物體旋轉一個角度,這時候就像人轉一個角度,人的左右上都改變了,所以這時候forward,right,up的方向都變了

Debug.Log(trans.forward);//結果是一個向量,也就是一個三維坐標
Debug.Log(trans.right);
Debug.Log(trans.up);

 

 

十一、距離上一次刷新的時間

// Update is called once per frame
void Update () {
float dt = Time.deltaTime; // 距離上一次刷新的時間
}

void FixedUpdate() {
float dt = Time.fixedDeltaTime; // 物理引擎固定更新的時間間隔
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM