Unity中的腳本都是繼承自MonoBehaviour。
MonoBehaviour 表示一個單一的行為。Unity中用戶對游戲對象的操作被分割成若干個單一行為。每個單一行為都作為一個MonoBehaviour類來封裝。再生成每個MonoBehaviour類的實例,並作為組件嵌入游戲對象。然后按照一定的順序(從下到上)調用每個對象的重載方法來實現游戲對象的全部行為。 繼承自MonoBehaviour的類,不需要自己創建它的實例,也不能自己創建(如 new 類名)。因為所有從MonoBehaviour繼承過來的類,unity都會自動創建實例,並且調用被重載的方法,如我們經常用到的Awake,Start, Update等。而普通類,就可以用new來創建實例了。
一、基礎函數:
1.Start() 在Update方法被調用之前開始調用Start方法,而且Start方法在整個MonoBehaviour生命周期內只被調用一次。Awake和Start不同的地方在於Start方法僅僅在腳本初始化后被調用,這樣允許你延遲加載任何代碼,直到代碼真正被使用時。Awake方法總是在Start方法執行之前被調用,這樣允許你初始化腳本代碼。
2.Awake() 當腳本被加載后立即調用Awake方法,這個方法通常在Start()開始之前聲明某些變量或者游戲的狀態標記符。同樣,Awake也是在MonoBehaviour聲明周期內被調用一次。Awake在所有的對象(個人認為是GameObject)實例化后被調用,因此綁定這個腳本的對象能與其他對象之間相互作用,例如,同過GameObjectFindWithTag方法查找其他對象。
3.Update() 在Start方法執行過后,游戲的每一幀都在調用此方法。
4.FixedUpdate() 每一幀都在調用此方法。當處理Rigdibody時FixedUpdate應該代替Update方法,比如,當一個物體需要增加一個力時,應該將這個力的代碼寫在FixedUpdate()里面。
void FixedUpdate() {
rigidbody.AddForce(Vector3.up);
}
5.LateUpdate() 每一幀都在調用此方法。當每一幀的Update方法全部執行完后,此方法開始被調用。舉個例子來說吧,當一個角色移動而攝像機也要跟着移動時,攝像機的處理就應該在LateUpdate()里面了。
6.OnGUI() OnGUI()在每一幀被調用數次(several times),假如MonoBehaviour的enabled屬性設置為false時,OnGUI()就失去作用了。
7.DontDestroyOnLoad() 進入另一個場景時,保證綁定此腳本的對象的內存不被釋放掉。也就是說綁定此腳本的GameObject在下一個場景中依然存在。
二、事件響應函數:
MonoBehaviour中的事件響應函數都是已On開頭的,比如:鼠標事件,腳本激活、銷毀,碰撞等。
OnApplicationFocus:當玩家獲得或失去焦點時發送給所有游戲物體。可以作為協同程序,在函數中使用yield語句即可
OnApplicationPause:當玩家暫停時發送到所有的游戲物體。可以作為協同程序,在函數中使用yield語句即可。
OnApplicationQuit:在應用退出之前發送給所有的游戲物體。當用戶停止運行模式時在編輯器中調用。當web被關閉時在網絡播放器中被調用。
OnBecameInvisible:當renderer(渲染器)在任何相機上都不可見時調用OnBecameInvisible。
OnBecameVisible:當renderer(渲染器)在任何相機上可見時調用OnBecameVisible。
OnCollisionEnter:當此collider/rigidbody與另一個rigidbody/collider接觸時調用。
OnCollisionExit:當此collider/rigidbody停止觸發另一個rigidbody/collider時。
OnCollisionStay:當此collider/rigidbody觸發另一個rigidbody/collider時,OnCollisionStay將會在每一幀被調用。
OnConnectedToServer:當你成功連接到服務器時,在客戶端調用。
OnDisconnectedFromServer:失去連接或從服務器端斷開時在客戶端調用。
OnFailedToConnectToMasterServer:當連接主服務器出現問題時在客戶端或服務器端調用。
OnControllerColliderHit:在移動的時,當controller碰撞到collider時OnControllerColliderHit被調用。
OnDestroy:腳本銷毀時調用。
OnDisable:對象禁用或者取消激活時調用。
OnEnable:對象變為可用或激活狀態時此函數被調用。
OnDrawGizmosSelected:如果想在物體被選中時繪制gizmos,執行這個函數。
OnGUI:渲染和處理GUI事件時調用。
OnJointBreak:當附在同一對象上的關節被斷開時調用。
OnLevelWasLoaded:一個新關卡被載入時此函數被調用。
OnMouseDown、OnMouseDrag、OnMouseEnter、OnMouseExit、OnMouseOver、OnMouseUp:鼠標事件。
OnMouseUpAsButton:只有當鼠標在同一個GUIElement或Collider按下,在釋放時調用。
OnTriggerEnter:當Collider(碰撞體)進入trigger(觸發器)時調用OnTriggerEnter。
OnTriggerExit:當Collider(碰撞體)停止觸發trigger(觸發器)時調用OnTriggerExit。
OnTriggerStay:當碰撞體接觸觸發器時,OnTriggerStay將在每一幀被調用。
三、默認組件
注意組件對應的變量名是組件名的小寫。
Transform:對象的位置,角度,縮放。變量名:transform
Rigidbody:剛體屬性。
Render:渲染物體模型。
Light:燈光屬性。
Camera:相機屬性。
Collider:碰撞體屬性。
Animation:動畫屬性。
Audio:聲音屬性。
四、組件獲取函數
獲取組件的方法由於比較耗時,所以如果你在update修改transform的話,一般可以先在Start中獲取這個組件的引用,然后在update中使用引用去修改。
GetComponent:獲取組件。
GetComponents:獲取組件列表。
GetComponentInChildren:返回Type類型組件,在GameObject或它的任何子物體使用深度優先搜索,僅返回激活的組件。
GetComponentsInChildren:在GameObject或任何它的子物體,返回全部Type類型組件。
五、獲取場景中的游戲對象
同樣和獲取組件一樣,該方法比較費時,一般在Start中獲取引用。
GameObject cube1 = GameObject.Find("Cube1");
GameObject cube1 = GameObject.FindWithTag("tag_cube1");