MonoBehaviour概述 MonoBehaviour 表示一個單一的行為。Unity中用戶對游戲?qū)ο蟮牟僮鞅环指畛扇舾蓚€單一行為。每個單一行為都作為一個MonoBehaviour類來封裝。再生成每個MonoBehaviour類的實例,并作為組件嵌入游戲?qū)ο?。然后按照一定的順序(從下到上)調(diào)用每個對象的重載方法來實現(xiàn)游戲?qū)ο蟮娜啃袨椤?/font> 創(chuàng)建 在菜單Assets->create中選擇javascript活C# script創(chuàng)建一個腳本類。Unity規(guī)定:這些類都必須繼承自MonoBehaviour。javascript 的腳本類自動繼承MonoBehaviour,c#腳本類必須顯式繼承這個類。 特別之處 異步函數(shù) 在一個方法執(zhí)行時調(diào)用另一個方法。而被調(diào)用的方法或者其中的某些語句不是立刻執(zhí)行,而是過一段時間后才執(zhí)行。 MonoBehaviour提供了兩種異步方法 調(diào)用(Invoke) 協(xié)程(Coroutine) 調(diào)用(Invoke) function Invoke (methodName: string, time : float) : void functionInvokeRepeating (methodName : String,time : float, repeatRate : float) : void function CancelInvoke () : void function IsInvoking (methodName: string) : bool 協(xié)程(Coroutine) function StartCoroutine (routine: IEnumerator) : Coroutine function StartCoroutine (methodName: string, value : object = null) : function StopCoroutine (methodName: string) : void function StopAllCoroutines () : void 協(xié)程介紹 協(xié)同程序與線程差不多,也就是一條執(zhí)行序列,擁有自己獨立的棧,局部變量和指令指針,同時又與其它協(xié)同程序共享全局變量和其它大部分東西。線程與協(xié)同程序的主要區(qū)別在于,一個具有多線程的程序可以同時運行幾個線程,而協(xié)同程序卻需要彼此協(xié)作地運行。就是說,一個具有多個協(xié)同程序的程序在任何時刻只能運行一 個協(xié)同程序,并且正在運行的協(xié)同程序只會在其顯示地掛起時,它的執(zhí)行才會暫停。 Unity中協(xié)程 一個協(xié)同程序在執(zhí)行過程中,可以在任意位置使用yield語句。yield的返回值控制何時恢復協(xié)同程序向下執(zhí)行。協(xié)同程序在對象自有幀執(zhí)行過程中堪稱優(yōu)秀。協(xié)同程序在性能上沒有更多的開銷。StartCoroutine函數(shù)是立刻返回的,但是yield可以延遲結(jié)果。直到協(xié)同程序執(zhí)行完畢。 function StartCoroutine (routine: IEnumerator) : Coroutine 參數(shù)表:IEnumerator IEnumerator是枚舉數(shù)接口。函數(shù)需要一個實現(xiàn)了這個接口的YieldInstruction對象??梢詣?chuàng)建一個WaitForSeconds對象,在它的構(gòu)造函數(shù)中傳入掛起時間。 返回值:Coroutine 只用來表示一個協(xié)同程序?qū)嵗囊谩]有任何暴露的變量和函數(shù)。一個coroutine是一個函數(shù),它能在中斷完成前掛起執(zhí)行。 function StartCoroutine (methodName: string, value : object = null) : 直接傳入一函數(shù)名,開銷大些。 比較 Invoke方法:執(zhí)行沒有被掛起,相當于設置完被調(diào)用函數(shù)的執(zhí)行時間后即時向下執(zhí)行。應用到?jīng)]隔一段時間執(zhí)行某個函數(shù)很方便。 Coroutine方法:新開一條執(zhí)行序列(跟新建線程差不多)并掛起,等待中斷指令結(jié)束。開銷不大。當需要掛起當前執(zhí)行時使用。比如Player死了一條命后消失,再過1.5秒后重新出現(xiàn),就可以用將協(xié)同程序掛起。 gameObject.renderer.enabled= false; yieldWaitForSeconds(1.5f); gameObject.renderer.enabled= true; |
|