Unity中的一個(gè)方法DontDestroyOnLoad可以讓某些游戲?qū)ο笤谇袚Q場(chǎng)景的時(shí)候不是施放,聽(tīng)起來(lái)是一個(gè)非常好的方法,但是其實(shí)如果沒(méi)用好那么可能就是有問(wèn)題了。 舉個(gè)例子: 地址:http://www./archives/2938 在場(chǎng)景1中某一個(gè)腳本的Start方法中,DontDestroyOnLoad(A) 接著切換到場(chǎng)景2中,理所當(dāng)然A對(duì)象被保留了下來(lái) 如果在從2場(chǎng)景再次回到1場(chǎng)景,那么又執(zhí)行了一遍DontDestroyOnLoad(A)然而之前你的A對(duì)象卻沒(méi)有被施放,這樣就會(huì)無(wú)線循環(huán)下去了。 當(dāng)然我們可以去做邏輯判斷是否DontDestroyOnLoad,判斷A是否等于Null做一些判斷。但是我覺(jué)得這其實(shí)是下策。DontDestroyOnLoad方法其實(shí)更多的是去保存一個(gè)全局的游戲腳本,比如一些第三方的SDK你需要用這個(gè)腳本來(lái)做中間件的支持。 我目前的做法是,我做了一個(gè)初始化場(chǎng)景。在初始化場(chǎng)景里面我只做兩件事,第一在初始化場(chǎng)景里面的某個(gè)游戲?qū)ο蟮娜帜_本中,Start方法里我把這個(gè)場(chǎng)景里面的所有游戲?qū)ο笕吭O(shè)置成DontDestroyOnLoad,也就是切換場(chǎng)景時(shí)不銷毀,比如NGUI的Root梳妝結(jié)構(gòu)。 第二,接著我在進(jìn)入我的第一個(gè)游戲場(chǎng)景,也就是說(shuō)我的邏輯永遠(yuǎn)不會(huì)在回返我的初始化場(chǎng)景。所以我也不會(huì)出現(xiàn)來(lái)回切場(chǎng)景DontDestroyOnLoad沒(méi)有刪除的問(wèn)題。 還有一個(gè)巧妙的辦法就是利用static 初始化方法,如下代碼所示,當(dāng)代碼在調(diào)用Global類的時(shí)候 首先程序會(huì)進(jìn)入static Global方法中,這個(gè)方法永遠(yuǎn)只會(huì)走一遍,所以我在這里創(chuàng)建一個(gè)GameObjcet,然后把Global這條腳本綁定上去,我在DontDestroyOnLoad這個(gè)對(duì)象。 這樣這條腳本就類似一個(gè)靜態(tài)腳本了,而且這個(gè)游戲?qū)ο笠灿肋h(yuǎn)不會(huì)因?yàn)榍袚Q場(chǎng)景而被銷毀。而且用起來(lái)非常方便。在需要調(diào)用它的地方直接調(diào)用就行了。 |
|
來(lái)自: kiki的號(hào) > 《Mono》