結(jié)構(gòu)圖
青色:輸入
玩家灾部,AI或其他輸入康铭。
綠色:控制器
controller 對(duì)輸入做出反應(yīng)并通知dataManager,controller 由controllerManager 進(jìn)行管理?
橙色:數(shù)據(jù)
DataManager 接收服務(wù)器和controller的消息并更新data赌髓,data發(fā)生變化時(shí)通知監(jiān)聽者从藤。
藍(lán)色:視圖
view監(jiān)聽數(shù)據(jù)變化,并刷新锁蠕。view 由ViewManager進(jìn)行管理夷野。
紫色:服務(wù)器
接受來自dataManager 的數(shù)據(jù),并且通知DataManager 數(shù)據(jù)發(fā)生變化(沒錯(cuò)荣倾,這個(gè)是雙向操作)悯搔。控制RootManager
粉色:總控制器
關(guān)鍵時(shí)刻的開關(guān),直接接收服務(wù)器消息舌仍,控制所有Manager妒貌。
注意:一個(gè)游戲可能有多個(gè)模塊。每個(gè)模塊都應(yīng)該有自己的Manager 而不是整個(gè)游戲就4個(gè)Manager
流程圖
綠色的輸入的消息铸豁,紅色的是控制灌曙,藍(lán)色的是監(jiān)聽(view主動(dòng)監(jiān)聽data所以箭頭由view指向data)
注意剪頭方向(viewManager 是監(jiān)聽的ViewData的數(shù)據(jù)控制view的,而不是由controller通知viewManager 添加或關(guān)閉一個(gè)view)
原理講完了节芥,舉個(gè)例子
比如玩家點(diǎn)擊了背包按鈕在刺,并且使用了一個(gè)道具
1:Controller收到了玩家點(diǎn)擊了背包按鈕的消息
2:controller接到消息后直接告訴DataManager ?push 背包View
3:DataManager接收數(shù)據(jù)后找到管理View的那個(gè)Data,通知他Push 背包View(是數(shù)據(jù)不是view)
4:Data接收到消息后先看看數(shù)據(jù)里有這個(gè)View么头镊,沒有就push一個(gè)蚣驼,有就把這個(gè)數(shù)據(jù)弄到最上層(view在屏幕的層級(jí)是根據(jù)data的順序排列的)。然后通知ViewManager View數(shù)據(jù)變了
5:ViewManager接收數(shù)據(jù)后根據(jù)數(shù)據(jù)的變化后添加或改變View層級(jí)相艇。
6:view被創(chuàng)建出來后會(huì)自己監(jiān)聽數(shù)據(jù)刷新自己
第二個(gè)例子
1:玩家點(diǎn)擊了道具
2:controller通知DataManager玩家道具減一,并標(biāo)記為發(fā)給服務(wù)器颖杏。
3:DataManager接收到消息后直接發(fā)給服務(wù)器(你可以寫多個(gè)功能模塊而不是把所有消息都放在一個(gè)DataManager里)
4:服務(wù)器收到消息后把結(jié)果返回給DataManager(這里默認(rèn)成功了),并且標(biāo)記為服務(wù)器更新
5:DadaManager接收到消息發(fā)現(xiàn)是服務(wù)器更新玩家數(shù)據(jù)后,直接找到對(duì)應(yīng)的Data并且通知他更新數(shù)據(jù)
6:Data接收到消息后會(huì)把自己的數(shù)據(jù)變了的消息告訴View
7:View更新
第三個(gè)例子
1:玩家在尋路的窗口輸入了坐標(biāo)厂捞。
2:controller通知DataManager尋路坐標(biāo)發(fā)生變化输玷。
3:DataManager 通知data更新。
4:data更新后靡馁,監(jiān)聽他的所有的view都會(huì)更新欲鹏。
5:玩家點(diǎn)擊開始尋路。
6:controller通知DataManager尋路(狀態(tài))發(fā)生變化臭墨。
7:DataManager 通知data更新赔嚎。
8:尋路AI監(jiān)聽到尋路的狀態(tài)為true時(shí)自動(dòng)開始尋路
注意:(是AI監(jiān)聽尋路狀態(tài)數(shù)據(jù)而不是controller控制尋路AI開始尋路)
基于這套理論的unity 開源框架(我在維護(hù),有線上產(chǎn)品)
倉庫地址 git@gitee.com:qipaworld/QPUnityFramework.git
Demo倉庫 git@gitee.com:qipaworld/QPUnityFrameWorkTest.git
歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://www.reibang.com/p/2cb690c9c016