StrangeIoc是一款基於MVCS的一種框架,是對MVC思想的擴展,是專門針對Unity3D開發的一款框架,很是好用。服務器
MVCS框架是一種模塊的分離,一種寫代碼的規則,目的是便於代碼的管理修改,更有利於編碼思惟。將UI和邏輯分開,StrangeIoc框架就很好地實現了UI和邏輯的分離以及各個模塊的分離。mvc
一、M 即Model層:是本地數據類型的容器,好比從服務器、表、xml等得到的數據賦值給model,之後再取用數據時直接讀取model對象便可。通常爲單例的對象。框架
二、V 即View層:是視圖,通常指UI,在StrangeIoc中View通常以組件的形式掛在物體身上的,負責查找UI上須要交互的對象。而且在view中提供更新UI的方法。View層又分爲負責純UI的View層和負責交互的Mediator層。函數
三、C 即Command層:是一個個命令,這些命令在Context中會和事件綁定,綁定後只要觸發事件就會執行對應的Command,Command是框架的核心 負責和service層、model層 以及 Mediator(中間層)的交互。性能
四、S 即Service層:是服務層 ,和服務端進行交互的層,在Service層中定義了一些向服務端請求數據,更新數據,保存數據等方法,這些方法由Command層調用。測試
一、首先自定義一個ContextView類的派生類(如MyContextView),和一個MVCSContext類的派生類(如MyContext),建立一個MyContext對象賦值給MyContextView的繼承屬性context,MyContext類負責進行一系列的Bind,綁定以後當綁定的類進行建立時,被綁定的類會按照指定的規則自動建立(是否爲單例,指定名稱等);編碼
二、啓動context(建立MyContext對象時可選擇是否自動啓動),此時會觸發ContextEvent.START事件。能夠在MyContext中綁定ContextEvent.START事件到一個命令,用來執行一些初始化操做(如對一些單例進行初始化),Once()指的是觸發一次後就解綁: commandBinder.Bind(ContextEvent.START).To<StartCommand>().Once(); 三、依賴注入:對Mediator、Command等層中的類中的屬性打[Inject]注入標記,好讓StrangeIoc自動爲該屬性進行賦值。
四、當View類的派生類被建立時(如MyView1,它們通常事先掛載在UI物體上),和MyView1綁定的Mediator派生類(如MyView1Mediator)也會被建立(自動掛載到該UI物體上),而且自動執行OnRegister方法。在MyView1Mediator類中的OnRegister方法內,能夠調用MyView1類中的方法來進行UI更新,也能夠經過dispatcher觸發指定的事件,事件觸發後會自動調用與該事件綁定的Command派生類中的Execute()方法。spa
五、Command派生類又能夠和Service的派生類、Model的派生類進行交互。
一、Bind,StrangeIoc提供了綁定的功能(鏈式調用的形式),在MVCSContext派生類中作綁定,能夠綁定類和類,接口和類,類和方法,事件和命令等等,均可以進行綁定,而且能夠指定綁定後的規則(是否爲單例,是否執行一次後銷燬,指定name等)。code
如:commandBinder.Bind(ContextEvent.START).To
二、經過Bind把事件綁定給command後,就能夠經過dispatcher觸發綁定事件來啓動一個command,command啓動時會自動執行Execute()方法。也能夠經過dispatcher.AddListener()方法來給指定事件註冊監聽回調函數 三、自定義的Command派生類能夠繼承自EventCommand類,它繼承自Command類,EventCommand內定義了一個全局的dispatcher
四、Inject,Inject就是注入,StrangeIoc是依賴注入的框架,他的功能就是咱們想得到某種類型的對象時不須要本身去建立,只要加上[Inject]標識就能夠根據你bind時的規則得到對象。
五、Mediator,中間層,負責和UI、Command之間交互。他的功能就是隔離了UI和邏輯。UI只能和Mediator交互。
六、dispatcher是事件觸發器,是StrangeIOC實現的消息發送機制,觸發事件後會自動調用和該事件類型綁定的Command(或者調用在事件上註冊的回調函數)。分爲全局dispatcher和局部dispatcher,它們的區別:
a.能夠在任何地方定義一個變量來引用全局的dispatcher,因此經過全局dispatcher註冊的事件回調,天然就能夠在任何地方觸發了。 b.局部的dispatchar只是一個單獨的IEventDispatcher的實例,要註冊、觸發事件就必須先拿到該dispatchar的引用。 c.不論是全局的,仍是局部的dispatchar,它都只能觸發在它自身上已經註冊的事件。
7.View中的UI層繼承自View類,mediator層繼承自Mediator類,而View和Mediator都繼承自MonoBehaviour類,因此UI層和mediator層的類一樣繼承了Awake和Start方法,在重寫view層的Start方法時,須要注意,必定要先執行他父類的方法base.Start();若是不先執行,就沒辦法自動建立改View中對應的meidator,自動建立是在框架中執行的。
1.通常不推薦在UI層進行依賴注入,官方推薦的在mediator層進行注入,UI去和mediator層交互。在View中注入的數據在Awake方法中是調用不到的 會報空引用,由於,數據的注入執行順序在Awake以後,在Start以前。從而能夠看出,mediator層的OnRegister方法是晚於Awake執行,早於Start方法的。
2.用dispatcher.AddListener()註冊一個事件後,就要有對應的dispatcher.RemoveListener()來刪除這個事件監聽(通常在遊戲銷燬的OnRemove()方法內,或回調函數內定義)。 3.Command類中有一個Retain()方法,能夠在執行該命令期間,保持該Command的實例不被銷燬,這個頗有用,能夠確保回調函數的執行,通常在Execute()中使用。對應的有 Release()方法,釋放該Command實例,銷燬它,通常使用在回調函數中。 4.測試時,若是發現事件沒有觸發,那就檢查你註冊該事件的dispatcher和你用來觸發事件的dispatcher是否對應(局部or全局?)。
應儘可能避免使用StrangeIoc的依賴注入:這點很重要,由於經過StrangeIoc依賴注入時,涉及到序列化和反序列化,這會下降性能,因此對於那些須要單例的類最好在類中本身實現,把單例的初始化放在StartCommand中,如:AudioManager.Instance.Init();,這樣就省去了綁定生成單例和依賴注入的過程,稍微提升了性能。