[程式] Unity的Singleton Pattern實作-Instance
開發過稍微複雜一點的遊戲的人大概都遇過這個狀況:
●●●
寫了一個負責掌控全局的腳本(許多人習慣命名為GameManager),它知道玩家現在幾等、
目前是處於第幾關、遊戲是進行中or暫停中,所有需要使用它資訊的物件都必須在程式碼
中宣告並引用之,並且還要開發者自己去拉reference(如圖),如果線沒牽好,遊戲甚至
還有可能強制終止。
●●●
https://i.imgur.com/gqwJv0u.jpg

當你在其他腳本裡撰寫了public GameManager GM;,就會看到上圖的畫面。這個步驟本身
是正確且可行的,然而,在降低耦合性的程式設計原則下,這並不是工程師所崇尚的作法
。
既然自始至終,所有物件提到的GameManager都是指涉同一個對象,無一例外,那有沒有
什麼方法可以避免這一再拉reference的步驟呢?
這時,我們可以藉助C#的一個特性,單例(Singleton)。
單例,顧名思義,就是在整個系統架構裡面,這個腳本只會有唯一一個代表人,可以免去
手動指定的流程。
https://i.imgur.com/vPmOtZK.jpg

如圖中第7行,我們創造了一個公開(public)但靜態(static)的GameManager,並且命名為
Instance(這也是習慣上的命名,要取名做TheChosenOne也可以XD)。
再來看到第12行的Awake()函式,我們必須把Instance指向this,也就是GameManager它自
己。
經過這兩個步驟,就完成單例的宣告了。
註:之所以將單例的指定放在Awake()裡面,是為了讓這一層關係早在其他腳本呼叫Insta
nce前就搭建起來,避免其他腳本在Start()呼叫了Instance,卻獲得Instance是null的狀
況。
https://i.imgur.com/Nnzp0NR.jpg

我們再開另外一個腳本來檢查結果,當我按下鍵盤的S鍵時,就會在Console中顯示當前的
關卡,而關卡資訊是來自GameManager.Instance.curStage。
https://i.imgur.com/e0ad8eL.jpg

如此一來就不再需要第7行的宣告,也不用親手幫每一個物件掛上GM的reference,可說是
一個便捷又具有設計美感(?)的做法,在越大型的專案裡功效就越顯著!
--
我是羽毛,目標是成為遊戲工程師,請多多指教!
羽毛的電玩新手村
https://tinyfeather1997.wordpress.com
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.249.56.86
※ 編輯: feather623 (111.249.56.86), 09/10/2017 11:58:30
推
09/10 12:41, , 1F
09/10 12:41, 1F
→
09/10 12:43, , 2F
09/10 12:43, 2F
好的,謝謝你的建議~
推
09/10 13:06, , 3F
09/10 13:06, 3F
HiHi 請問你是XD
※ 編輯: feather623 (111.249.56.86), 09/10/2017 13:17:03
→
09/10 13:43, , 4F
09/10 13:43, 4F
推
09/10 16:48, , 5F
09/10 16:48, 5F
→
09/10 16:48, , 6F
09/10 16:48, 6F
→
09/10 16:49, , 7F
09/10 16:49, 7F
推
09/10 17:20, , 8F
09/10 17:20, 8F
→
09/10 17:20, , 9F
09/10 17:20, 9F
→
09/10 18:46, , 10F
09/10 18:46, 10F
→
09/10 18:46, , 11F
09/10 18:46, 11F
→
09/10 20:40, , 12F
09/10 20:40, 12F
→
09/10 23:03, , 13F
09/10 23:03, 13F
→
09/10 23:46, , 14F
09/10 23:46, 14F
推
09/11 01:14, , 15F
09/11 01:14, 15F
→
09/11 01:23, , 16F
09/11 01:23, 16F
→
09/11 01:23, , 17F
09/11 01:23, 17F
→
09/11 01:24, , 18F
09/11 01:24, 18F
→
09/11 01:24, , 19F
09/11 01:24, 19F
→
09/11 01:26, , 20F
09/11 01:26, 20F
→
09/11 01:27, , 21F
09/11 01:27, 21F
→
09/11 08:11, , 22F
09/11 08:11, 22F
→
09/11 10:18, , 23F
09/11 10:18, 23F
→
09/11 10:55, , 24F
09/11 10:55, 24F
→
09/11 11:01, , 25F
09/11 11:01, 25F
→
09/11 11:07, , 26F
09/11 11:07, 26F
→
09/11 13:26, , 27F
09/11 13:26, 27F
→
09/11 13:27, , 28F
09/11 13:27, 28F
推
09/11 18:15, , 29F
09/11 18:15, 29F
討論串 (同標題文章)
GameDesign 近期熱門文章
PTT遊戲區 即時熱門文章
70
100