元件的概念
元件:一個或多個功能的容器,類似模組,插上去就有這個功能,不查沒有
存在意義:
- 如果太依賴繼承,繼承樹將會特別複雜
- 元件化設計思想有利於維護擴充
unity內任何遊戲物體必須有Transform
元件
unity中大多數情況下,我們寫的c#指令碼就是一個元件
從程式碼角度認識GameObject
任何元件身上都有一個gameObject
,代表它所在的GameObject
(宿主)
主要屬性
name
:遊戲物體的名稱tag
:遊戲物體的標籤layer
:遊戲物體的層分類
Debug.Log(gameObject.name);//列印出GameObject的名字
gameObject.name = "Game Object";//修改GameObject的名字
Debug.Log(gameObject.name);//列印出GameObject的名字
if (gameObject.tag == "Player")
{
Debug.Log("This is a player object");//判斷GameObject的tag是否為Player
}
主要行為
SetActive
:是否顯示AddComponent
:新增元件GetComponents
:獲取元件GetComponents
:獲取多個元件(允許一個元件重複新增,但是一般不會)GetComponentInChildren
:從子物體身上查詢元件GetComponentInParent
:從父物體身上查詢元件<T>
:泛型,後續細說,目前簡單理解為“確定一個型別”
銷燬元件的方式
Destory(gameObject.GetComponent<XXXXController>());
Transform元件基本資訊
GameObject
有個屬性就是transfrom
,代表它所在GameObject
的Transform
元件
主要屬性
position
:座標rotation
:旋轉 (四元數格式)eulerAngles
:旋轉(尤拉角模式)localScale
:縮放localPosition
、localRotation
、localEulerAngels
:是相對父物體的座標和旋轉parent
:父物體的transform
childCount
:子物體的數量root
:自身的根節點(父的父的父到最上層)
主要行為
GetChild
:獲取第X個子物體SetParent
:設定自身為某個遊戲物體的子物體Find
:查詢子物體,引數是路徑,填寫方式類似資料夾"A/B/C"
座標和Vector結構體
unity中2D和3D沒有本質上的區別,unity中的2D場景就是Z軸值為0的3D場景
世界座標系:相對世界的座標
區域性座標系:相對父物體的座標
Translate
維護父子結構
刪除一個GameObject
Destroy
:銷燬物體,但不會立即銷燬,而是在Update
執行後執行銷燬操作DestroyImmediate
:立即銷燬物體,銷燬完物體才會執行下一行程式碼
父子結構相關的屬性與函式
parent
:父物體的transform
childCount
:子物體的數量root
:自身的根節點(父的父的父到最上層)GetChild
:獲取第X個子物體SetParent
:設定自身為某個遊戲物體的子物體
元件的生命週期
如字面意思,生命週期就是生老病死的一個輪迴。類似地,在unity中指的是一個元件從建立到銷燬的所有階段,這些階段肯定要做一些事情,這些事情就是生命週期函式
Tips:官方一般稱為“事件函式”
關鍵生命週期函式
Awake
(針對自身):始終在任何Start
函式之前GameObject
建立後呼叫此函式。(如果遊戲物件在啟動期間處於非活動狀態,則在啟用之後才會呼叫Awake
)OnEanble
(針對自身):在啟用物件後立即呼叫此函式Start
(針對自身):僅當啟用指令碼例項後,才會在第一次幀更新之前呼叫StartUpdate
(針對自身):每幀呼叫一次Update
。這是用於幀更新的主要函式LateUpdate
(針對自身):在LateUpdate
完成後執行一次OnDisable
(針對自身):被禁用或處於非活動狀態時,呼叫此函式OnDestroy
(針對自身):物件存在的最後一幀完成所有幀更新之後,呼叫此函式(可能因為Destroy
函式或在場景關閉時銷燬該物件)
//TODO:需要補充一些
幀的深度瞭解
遊戲、影片的原理就是不停的重新整理畫面,那麼這個重新整理一定存在頻率,這就是幀率(FPS),比如60FPS就是每秒重新整理60次畫面
假設遊戲穩定在60PFS的狀態下,那麼Update就是1/60秒執行一次,也就是每秒執行60次