遊戲專案中MVC模式的應用
MVC模式
MVC模式概述
MVC是(Model、View、Controller)三個單詞的首字母簡寫,其應用的目的是為了將程式分層,便於應用程式的分層開發。
- Model (模型)代表一個儲存資料的物件,它也可以帶有少量的邏輯,在資料有變化的時候通知Controller進行更新檢視
- View(檢視)代表模型包含的資料的視覺化表現
- Controller(控制器)控制器控制資料流向模型物件,並在資料變化時更新檢視。它使得檢視於模型分離開。
Unity遊戲專案中的MVC模式
以一個MMORPG揹包系統為例,玩家可以在遊戲主介面按揹包按鈕開啟揹包,揹包中的資料來源於伺服器,揹包有自動整理、顯示物品資訊等等互動功能。我們用英文Pack來代表揹包,應用於相應的Model、View、Controller類的命名。
View
將面板PackView製作成Prefab,面板PackView的GameObject掛載PackView.cs,在PackView.cs中獲取各個面板元件的引用,例如該面板的一些按鈕,並在PackView.cs中定義這些按鈕的回撥函式(例如揹包系統中子面板的撥出)
Model
PackModel的初始化
PackModel類使用單例模式(針對MMORPG遊戲特性,每個玩家客戶端只維護該玩家的揹包資料)。
PackModel職責
在PackModel中定義玩家持有物品的列表的資料儲存結構、對資料操縱的函式以及向PackView傳入資料更新表現等等。
向PackView傳入資料的方式不止一種,例如
- PackModel存放PackView的引用
- PackModel傳送被PackView監聽的訊息型別
Controller
PackController的初始化
對於MMORPG來說,一般在遊戲初始化的時候例項化不同模組的Controller類,揹包系統作為一個模組,其Controller類也是在遊戲初始化的時候被例項化。
PackController的職責
Controller類負責的是控制資料流流向模型物件,其中資料流來自遊戲伺服器。同時,Controller也是由User進行更新的,它也處理玩家的互動事件,例如點選揹包按鈕將揹包面板調出。
故Controller會持有View和Model的引用,同時會註冊網路協議回撥事件將網路資料更新至Model中,並註冊玩家的點選事件回撥事件,需要注意的是,雖然Controller持有View的引用,但是個人覺得不應該由Controller來更新View,因為View所需要的資料只有Model知道,所以覺得應該由Model來驅動View更新其表現會比較好。