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