大二VR專業(yè)unity代碼學(xué)習(xí)日常3——單例模式之偽單例


單例模式
單例模式能節(jié)省系統(tǒng)資源也能簡化代碼,顧名思義,單例,就是一個(gè)實(shí)例。
什么時(shí)候需要用單例?當(dāng)需要大量創(chuàng)建類的時(shí)候就可以用單例模式來代替不斷實(shí)例化的類。
偽單例

代碼7、16-19行就是偽單例的例子:用static靜態(tài)化一個(gè)腳本的實(shí)例,讓這個(gè)實(shí)例能被全局訪問,再在Awake里初始化這個(gè)靜態(tài)實(shí)例,讓其被調(diào)用時(shí)確保已完成初始化。
為什么靜態(tài)化后就能全局訪問?全局訪問是靜態(tài)化的特點(diǎn),正常方法需要先創(chuàng)造實(shí)例后才能訪問,而靜態(tài)化后不需要實(shí)例就能訪問,同樣能全局訪問的還有vector結(jié)構(gòu)體中的Distance方法,因?yàn)檫@個(gè)方法也是靜態(tài)方法。普通方法就像模具,要訪問這個(gè)方法先要用模具印出模型才能拿到這個(gè)方法,但靜態(tài)化后方法就變成了工具包,直接背在身上隨時(shí)都能拿出來用。
this是什么?this是指當(dāng)前腳本所掛載的gameobject實(shí)例,比如腳本常掛在camera、canvas這些gameobject上,將這個(gè)實(shí)例賦給類的靜態(tài)化實(shí)例,這個(gè)靜態(tài)化實(shí)例里就有了腳本里的內(nèi)容,再加上靜態(tài)化本身的全局訪問的功能,就能讓其他腳本也能調(diào)用當(dāng)前腳本的變量或者方法。把一個(gè)類靜態(tài)化,就像把貨物從家里放到了港口集裝箱里,人流量很大,現(xiàn)在誰都能拿得到了,而我們把當(dāng)前gameobject實(shí)例放在了這個(gè)集裝箱里,就讓其他腳本都能通過這個(gè)集裝箱來訪問gameobject里的腳本。
instance為什么不在start函數(shù)里初始化?因?yàn)槠渌_本一般都在start函數(shù)里調(diào)用instance,如果寫在start里可能存在調(diào)用時(shí)還未初始化從而出現(xiàn)錯(cuò)誤的情況,為了保證instance被調(diào)用時(shí)已經(jīng)初始化完成,instance就需要寫在awake函數(shù)里,因?yàn)閍wake函數(shù)會(huì)在start函數(shù)之前調(diào)用。就是有人(其他腳本調(diào)用)上門來拜訪,instance需要先做好準(zhǔn)備,如果不做好準(zhǔn)備就會(huì)報(bào)錯(cuò)。