[程式] Unity的Singleton Pattern實作-Instance

作者: feather623 (ㄇ ㄚˊ吉兔腦粉)   2017-09-10 11:55:25
開發過稍微複雜一點的遊戲的人大概都遇過這個狀況:
●●●
寫了一個負責掌控全局的腳本(許多人習慣命名為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,可說是
一個便捷又具有設計美感(?)的做法,在越大型的專案裡功效就越顯著!
作者: coolrobin (泳圈)   2017-09-10 12:41:00
幫推,不過是不是在標題或內文前面加上unity會比較好?會比較便於搜尋
作者: b87088 (ba)   2017-09-10 13:06:00
羽毛推
作者: MBRSL (MBRSL)   2017-09-10 13:43:00
Singleton很容易被濫用造成bug,只建議在小規模的專案使用
作者: cjcat2266 (CJ Cat)   2017-09-10 16:48:00
我覺得如果謹慎、分工正確、又有規矩地使用,應該還好碰過幾個大專案有多個singleton合作,但是大家很謹慎沒看到什麼嚴重的濫用情況,所以我覺得還是看使用者
作者: joseph33 (理查帕迪)   2017-09-10 17:20:00
http://wiki.unity3d.com/index.php/Singleton 可以寫個singleton的base class出來用
作者: b87088 (ba)   2017-09-10 18:46:00
之前gamejam隊友~,看code才知道每個人都自己寫自己的singleton~~
作者: y3k (激流を制するは静水)   2017-09-10 20:40:00
Singleton我只推薦用在API入口 不然很容易有bug
作者: bantime (景)   2017-09-10 23:03:00
我挺好奇會造成什麼bug?有案例嗎?
作者: dreamnook (亞龍)   2017-09-10 23:46:00
好奇是甚麼bug+1(沒遇過
作者: MBRSL (MBRSL)   2017-09-11 01:14:00
最常見是全域變數類的bug,詳細理念請見下一篇文章
作者: y3k (激流を制するは静水)   2017-09-11 01:23:00
等一下 上面的真的都沒遇過喔XD static變數造成的bug就不用提了 我也遇過繼承的問題、Singleton自己去跟其他物件黏答答在一起發生的問題... 雖然沒到罄竹難書的地步但是這個寫法一看到我都得先花個一兩天把它的code翻一遍才安心雖然這不是一個不能用的寫法 但是遇到比較沒經驗或便宜行事的捧油用 就容易把人的腦洞放大... 我只能這樣講
作者: dreamnook (亞龍)   2017-09-11 08:11:00
大概是我們平時在寫的時候都有特別注意過吧@@
作者: y3k (激流を制するは静水)   2017-09-11 10:18:00
我覺得是專案規模不大 或有一個SA之類的專職在處理規劃架構
作者: dreamnook (亞龍)   2017-09-11 10:55:00
也是 近年來都很少碰過20人以上的專案了
作者: y3k (激流を制するは静水)   2017-09-11 11:01:00
20人如果全RD 那不少耶= =
作者: dreamnook (亞龍)   2017-09-11 11:07:00
整個專案20人 不是純RD 20人xD
作者: bantime (景)   2017-09-11 13:26:00
還真的沒遇過..可能我在實作singleton的時候都是保證唯一的狀況下 例如你不會同時出現兩個選角介面吧

Links booklink

Contact Us: admin [ a t ] ucptt.com