GameDesign 板


LINE

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







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP