戰略分析室 - 遊戲開發探究

Singleton Pattern實作 – Instance

開發過稍微複雜一點的遊戲的人大概都遇過這個狀況:

●●●

寫了一個負責掌控全局的腳本(許多人習慣命名為GameManager),它知道玩家現在幾等、目前是處於第幾關、遊戲是進行中or暫停中,所有需要使用它資訊的物件都必須在程式碼中宣告並引用之,並且還要開發者自己去拉reference(如圖),如果線沒牽好,遊戲甚至還有可能強制終止。

●●●

reference.jpg

當你在其他腳本裡撰寫了public GameManager GM;,就會看到上圖的畫面。這個步驟本身是正確且可行的,然而,在降低耦合性的程式設計原則下,這並不是工程師所崇尚的作法。

既然自始至終,所有物件提到的GameManager都是指涉同一個對象,無一例外,那有沒有什麼方法可以避免這一再拉reference的步驟呢?

這時,我們可以藉助C#的一個特性,單例(Singleton)



單例,顧名思義,就是在整個系統架構裡面,這個腳本只會有唯一一個代表人,可以免去手動指定的流程。

singleton

如圖中第7行,我們創造了一個公開(public)但靜態(static)的GameManager,並且命名為Instance(這也是習慣上的命名,要取名做TheChosenOne也可以XD)。

再來看到第12行的Awake()函式,我們必須把Instance指向this,也就是GameManager它自己。

經過這兩個步驟,就完成單例的宣告了。

註:之所以將單例的指定放在Awake()裡面,是為了讓這一層關係早在其他腳本呼叫Instance前就搭建起來,避免其他腳本在Start()呼叫了Instance,卻獲得Instance是null的狀況。

debugger

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

curStage

如此一來就不再需要第7行的宣告,也不用親手幫每一個物件掛上GM的reference,可說是一個便捷又具有設計美感(?)的做法,在越大型的專案裡功效就越顯著!

廣告

2 thoughts on “Singleton Pattern實作 – Instance

  1. 寫得不錯XD
    我曾經也跟你一樣想當遊戲程式工程師
    後來被現實打敗…目前正在做跟遊戲毫無關聯的產業
    為了糊口飯吃,加油 不要像我一樣半途而廢QQ

    按讚數

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s