unity 2D游戲開(kāi)發(fā)教程2:(常用的3種單例模式深度解析)

教案如下:
課程知識(shí)點(diǎn): ??
1:普通單例模式
一個(gè)Scenes里面類似GUIManager(UI管理類),InputManager(按鍵管理類)只會(huì)有一個(gè),創(chuàng)建后會(huì)被經(jīng)常在別的代碼里面被使用,所以這類對(duì)象經(jīng)常是會(huì)用單例模式來(lái)封裝后,方便我們隨時(shí)拿到對(duì)象來(lái)隨時(shí)使用。
下面是2種使用方式,我們先來(lái)寫下普通單例模式代碼。
?? --用法1:在畫面中不創(chuàng)建單例對(duì)象GameObject,用到的時(shí)候在自動(dòng)創(chuàng)建單例對(duì)象,執(zhí)行方法
?? --用法2:在畫面中提前創(chuàng)建單例對(duì)象GameObject,用到時(shí)候拿到這個(gè)單例對(duì)象執(zhí)行方法
?
2:持久化單例模式(項(xiàng)目最先創(chuàng)建的對(duì)象永久使用)
?? 普通的單例模式有缺點(diǎn)
?? --缺點(diǎn)1(這個(gè)缺點(diǎn)并不重要):從Scene1 跳轉(zhuǎn)到 Scene2的時(shí)候,Scene1里面的單例對(duì)象會(huì)被銷毀,Scenes2里面會(huì)被創(chuàng)建,浪費(fèi)性能。
?? ??解決上面問(wèn)題需要利用Unity的DontDestroyOnLoad(GameObject)方法,讓指定對(duì)象在頁(yè)面切換時(shí)候不要摧毀,我們來(lái)寫下這個(gè)模式的單例類,然后做個(gè)新的場(chǎng)景來(lái)演示一下
?? --缺點(diǎn)2(主要缺點(diǎn)):我們?cè)陂_(kāi)發(fā)項(xiàng)目的時(shí)候會(huì)創(chuàng)建很多Scene,最明顯的例子就是GameManager。 每個(gè)關(guān)卡畫面都是要用到這個(gè)Manager。但是對(duì)于游戲來(lái)說(shuō),GameManager是所有畫面都要統(tǒng)一用一個(gè)的,而不是一個(gè)Scene一個(gè),不然會(huì)出現(xiàn)問(wèn)題(例如Level1開(kāi)發(fā)時(shí)候GameManager里面生命值我用3在測(cè)試開(kāi)發(fā),Level2開(kāi)發(fā)時(shí)候GameManager里面生命值我用2在測(cè)試開(kāi)發(fā),當(dāng)Level1跳轉(zhuǎn)到Level2的時(shí)候如果不寫代碼特殊處理,會(huì)導(dǎo)致生命值莫名奇妙減少了)
??? 我們來(lái)寫一下這個(gè)單例類
??? 解決這個(gè)問(wèn)題的情況的話,就需要用到我們的,持久化單例模式(項(xiàng)目從頭到尾都用保持用這一個(gè)單例對(duì)象)
?
?
3:持久化單例模式(項(xiàng)目最新創(chuàng)建的對(duì)象保留)
?? ?和上面持久化單例模式(項(xiàng)目最先創(chuàng)建的對(duì)象永久使用)對(duì)比,
相同點(diǎn):Scene跳轉(zhuǎn)不會(huì)刪除
不同點(diǎn):但是當(dāng)Scene1 跳轉(zhuǎn)到 Scene2的時(shí)候,Scene2有相同類的單例對(duì)象時(shí)候,會(huì)用Scene2的這個(gè)對(duì)象替換到Scene1帶過(guò)來(lái)的對(duì)象,和上面的類型正好相反
我們來(lái)寫一下這個(gè)單例類,
?? ?使用場(chǎng)景:項(xiàng)目中的每個(gè)畫面會(huì)有 BackgroundMusic 來(lái)播放背景音樂(lè),你每個(gè)場(chǎng)景可以設(shè)置新的音樂(lè)。BackgroundMusic使用這個(gè)模式的單例在配合Start()方法【對(duì)象創(chuàng)建第一次的時(shí)候調(diào)用的特性】就可以實(shí)現(xiàn)切換場(chǎng)景背景音樂(lè)不中斷的效果,等有新的背景音樂(lè)在替換播放新的背景音樂(lè),代碼舉例子