1、transform組件用途數組
1.維護場景樹編輯器
2.對3D物體的平移,縮放,旋轉函數
2、場景樹定義post
在Hierarchy視圖中顯示的:性能
一個game_scene場景,下面有Main Camera節點,Directional Light節點,game_root節點,game_root節點下又有Cube子節點,Sphere子節點,組成game_scene場景樹。this
3、組件和節點spa
1.每一個節點都有一個transform組件orm
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時,另外一方面也間接構成了節點樹。
5、使用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");//Find若是是本身的子節點或者孫子節點,能夠不加前面的路徑,只要一個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);
6、使用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組件
7、使用GameObject查找節點
// 基於GameObject的查找,來找GameObject,全局查找,GameObject.Find靜態函數
Debug.Log(GameObject.Find("game_root/Sphere/test").name);
8、使用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);//先子後父
}
9、絕對座標和相對座標(世界座標和局部座標)
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)
10、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);
11、距離上一次刷新的時間
// Update is called once per frame
void Update () {
float dt = Time.deltaTime; // 距離上一次刷新的時間
}
void FixedUpdate() { float dt = Time.fixedDeltaTime; // 物理引擎固定更新的時間間隔}