1. 程式人生 > >【Unity3D】在Unity3d中如何使用MVC框架

【Unity3D】在Unity3d中如何使用MVC框架

一、前言

MVC是一種比較常見的設計框架,是一種將程式碼的功能進行劃分的一種設計框架,主要原理就是將軟體使用者介面和業務邏輯分離,以使程式碼可擴充套件性、可複用性、可維護性、靈活性加強。
MVC在桌面應用程式,以及網頁架構上面用的比較多,那麼怎麼應用到Unity3d中呢,下面就帶大家去了解這個設計框架,以及如何在Unity中應用。

二、MVC介紹

簡介

MVC全名是Model View Controller,是模型(Model)-檢視(View)-控制器(Controller)的縮寫,一種軟體設計典範,用一種業務邏輯、資料、介面顯示分離的方法組織程式碼,將業務邏輯聚集到一個部件裡面,在改進和個性化定製介面及使用者互動的同時,不需要重新編寫業務邏輯。MVC被獨特的發展起來用於對映傳統的輸入、處理和輸出功能在一個邏輯的圖形化使用者介面的結構中。

Model(模型) 是應用程式中用於處理應用程式資料邏輯的部分。
  通常模型物件負責在資料庫中存取資料。
View(檢視) 是應用程式中處理資料顯示的部分。
  通常檢視是依據模型資料建立的。
Controller(控制器) 是應用程式中處理使用者互動的部分。
  通常控制器負責從檢視讀取資料,控制使用者輸入,並向模型傳送資料。
  
MVC開始是存在於桌面程式中的,M是指業務模型,V是指使用者介面,C則是控制器,使用MVC的目的是將M和V的實現程式碼分離,從而使同一個程式可以使用不同的表現形式。比如一批統計資料可以分別用柱狀圖、餅圖來表示。C存在的目的則是確保M和V的同步,一旦M改變,V應該同步更新。

模型-檢視-控制器(MVC)是Xerox PARC在二十世紀八十年代為程式語言Smalltalk-80發明的一種軟體設計模式,已被廣泛使用。後來被推薦為Oracle旗下Sun公司Java EE平臺的設計模式,並且受到越來越多的使用ColdFusion和PHP的開發者的歡迎。模型-檢視-控制器模式是一個有用的工具箱,它有很多好處,但也有一些缺點。

MVC的業務流程

在這裡插入圖片描述

MVC是設計模式嗎

MVC是一種設計模式,但是卻不在Gof總結過的23種設計模式中,所以確切說MVC不是一個設計模式,而是多種設計模式的組合,而不僅僅只是一個設計模式。
組成MVC的三個模式分別是組合模式、策咯模式、觀察者模式,MVC在軟體開發中發揮的威力,最終離不開這三個模式的默契配合。 那些崇尚設計模式無用論的程式設計師,請了解只要你們使用MVC,就離不開設計模式。
組合模式只在檢視層活動, 檢視層的實現用的就是組合模式,當然,這裡指的實現是底層的實現,是由程式設計框架廠商做的事情,用不著普通程式設計師插手。

組合模式的類層次結構是樹狀的, 而我們做Web時檢視層是html頁面,html的結構不正是樹狀的嗎,這其實就是一個組合模式的應用,只是瀏覽器廠商已經把介面相關的工作幫我們做掉了,但它確確實實是我們應用MVC的其中一部分,只是我們感覺不到罷了,這也是我們覺得View是實現起來最簡單最沒有歧義的一層的原因。

除網頁以外的其他使用者介面程式,如WPF、Android、ASP.NET等等都是使用樹狀結構來組織介面控制元件物件的,因為組合模式就是從介面設計的通用解決方案總提煉出來的。所以與其說MVC選擇了組合模式,還不如說組合模式是必定會存在MVC中的,因為只要涉及到使用者介面,組合模式就必定存。事實上即使不理解組合模式,也不影響程式設計師正確的使用MVC,組合模式本就存在於程式設計師接觸不到的位置。

然而,觀察者模式和策略模式就顯得比較重要,是實實在在MVC中接觸的到的部分。

觀察者模式有兩部分組成,被觀察的物件和觀察者,觀察者也被稱為監聽者。對應到MVC中,Model是被觀察的物件,View是觀察者,Model層一旦發生變化,View層即被通知更新。View層和Model層互相之間是持有引用的。 我們在開發Web MVC程式時,因為檢視層的html和Model層的業務邏輯之間隔了一個http,所以不能顯示的進行關聯,但是他們觀察者和收聽者的關係卻沒有改變。當View通過http提交資料給伺服器,伺服器上的Model接受到資料執行某些操作,再通過http響應將結果回送給View,View(瀏覽器)接受到資料更新介面,這不正是一個接受到通知並執行更新的行為嗎,是觀察者模式的另一種表現形式。

但是,脫離Web,當通過程式碼去純粹的表示一個MVC結構的時候,View和Model間無疑是觀察者和被觀察的關係,是以觀察者模式為理論基礎的。即使在Web中因為http壁壘的原因導致真正的實現有點走樣,但是原理核心和思路哲學卻是不變的。

最後是策略模式。策略模式是View和Controller之間的關係,Controller是View的一個策略,Controller對於View是可替換的, View和Controller的關係是一對多,在實際的開發場景中,也經常會碰到一個View被多個Controller引用,這即使策咯模式的一種體現,只是不那麼直觀而已。

總結一下,關於MVC各層之間關係所對應的設計模式

View層,單獨實現了組合模式

Model層和View層,實現了觀察者模式

View層和Controller層,實現了策咯模式

MVC就是將這三個設計模式在一起用了,將這三個設計模式弄明白,MVC將毫無神祕感可言。如果不瞭解這三個設計模式去學習MVC,那不管怎麼學總歸是一知半解,用的時候也難免不會出想問題。

三、參考文章

深入理解MVC https://blog.csdn.net/zuiyingong6567/article/details/80150834
MVC簡介 https://www.cnblogs.com/diyunfei/p/6752618.html
【Unity】MVC框架 https://blog.csdn.net/qq_39574690/article/details/80757261
Unity中MVC簡單應用 https://www.jianshu.com/p/acc689be52f9
【Unity3D】手遊開發實踐《騰訊桌球》客戶端開發經驗總結 https://blog.csdn.net/q764424567/article/details/81020381
MVC框架 https://baike.baidu.com/item/MVC框架/9241230?fr=aladdin&fromid=85990&fromtitle=MVC

四、Unity中使用MVC

在這裡插入圖片描述
本篇文章主要是講一下我是如何在Unity中使用MVC模式,MVC模式肯定不能照搬進Unity中,所以很多東西都做了修改,以適合我的專案使用,如果有不對的地方,希望大家能指正出來。

使用原理

在這裡插入圖片描述
程式碼文件結構就是這樣的
目前我瞭解的MVC應用到Unity中只有兩種模式,一種就是先按照業務功能劃分,再按照MVC劃分
在這裡插入圖片描述
蛋糕心語遊戲就是這種模式,使得模組更聚焦(高內聚)
第二種就是先按照MVC劃分,然後再分出來業務功能
在這裡插入圖片描述
第二種方式用多了發現隨著專案的運營模組增多,沒有第一種那麼好維護。

MVC的關鍵就在於業務劃分,程式碼分離,其實跟三層架構比較相似,把業務層、邏輯層、資料層分開來,互相通過一個介面進行呼叫,但是並不知道介面是怎麼實現的。

所以現在的問題就在於如何去劃分呢。

實現:
Model(模型層):
在這一層主要就是存放使用者的資料,UI的資料,靜態欄位,資料儲存,以及模型貼圖資源的儲存
比如說:

  • 存放靜態欄位
    在這裡插入圖片描述
  • 存放資料
    在這裡插入圖片描述
  • 存放模型材質欄位
    在這裡插入圖片描述
  • 資料庫增刪改查操作
    在這裡插入圖片描述

View(檢視層)
在這一層主要是放一些UI引數,獲取UI資料,獲取按鈕事件等
在這裡插入圖片描述
在這裡插入圖片描述
點選事件
在這裡插入圖片描述

Controller(控制層)
這一層就是去實現業務邏輯功能,獲取Model的資料,通知View層更新資料,承上啟下的功能
在這裡插入圖片描述

五、例項

就帶大家實現在Untiy中使用MVC模式,實現更換圖片的功能
步驟一:設計介面
在這裡插入圖片描述
在這裡插入圖片描述
步驟二:MVC搭建
Model_Main.cs
在這裡插入圖片描述
View_Main.cs
在這裡插入圖片描述
Controller_Main.cs
在這裡插入圖片描述
在這裡插入圖片描述

關於那個滑鼠點選事件那個方法,在我另一篇文章中有講到,不懂的可以去那篇帖子仔細看一下。
https://blog.csdn.net/q764424567/article/details/82424308
效果:
在這裡插入圖片描述
原始碼已經上傳到CSDN,按需下載
https://download.csdn.net/download/q764424567/10768387

六、總結

PS:程式設計師最重要的就是總結,不然學的再多到關鍵時刻用不上還是白搭,總結梳理,然後寫下來,當快忘了的時候可以回來看看,會有不一樣的體悟哦。
在Unity中應用MVC模式已經講解完了,MVC模式其實就是多種設計模式的結合體,也是三層架構的改良產品,基本原理就是把業務邏輯、功能實現、資料給分開來,利於增加功能,和維護。
俗話說的好,一千個人就有一千個哈姆雷特,每個人研究MVC之後,運用到Unity中的方法都不盡相同,方法也是很多樣,我主要就是提供一個想法和思路,更多優化運用還要大家多開動腦筋咯。
最後,再回顧一下
Model(資料層):存放靜態欄位、資料儲存、模型資源儲存
View(檢視層):就是使用者可以看到的層,指的是可以看到的UI,模型,載入和呼叫事件
Controller(管理層):實現業務邏輯功能、載入模型資源、功能實現等