unity 使用MVC模式
阿新 • • 發佈:2017-11-09
事件 debug.log 格式 fabs 展示 tro 結構 cat ext
這兩天看了下老大的項目,他基本都是用MVC模式,寫的很好,在此把我理解的記錄下來
Model:實體對象(對應數據庫記錄的類)
View:視圖
presenter(controller):業務處理
view中有present對象,present中有model和view對象
view中UI的交互會調用present相應處理的方法(該方法處理完後會調用view顯示處理後的視圖(將改變後的model對象傳遞過去),view顯示就會改變顯示的內容)
結構是下面這樣子的:
IPresenter:
namespace NginAR { public interface IPresenter<T> whereT : class { void Init(); } }
IView:
namespace NginAR { public interface IView<T> where T : class { /** * 設置Presenter * @param presenter */ void setPresenter(T presenter); } }
IGlassView:
namespace NginAR { public interface IGlassView : IView<IGlassPresenter> {// 設置當前步驟內容,用於顯示 void setStepContent(string content); // 設置當前步驟 void setCurrentStep(int currentStep); } public interface IGlassPresenter : IPresenter<IGlassView> { // 當前步 bool StepCurrent(); // 下一步 bool StepNext(); // 上一步 boolStepLast(); void onStepChange(int currentTaskId, int currentStepId); } }
Step:
namespace NginAR { public class Step { public int id { get; set; } public string content { get; set; } public string type { get; set; } } }
FileUtil:
namespace NginAR { // 讀取文件工具 public class FileUtil { // 加載腳本文件,用於保存步驟內容 public static void LoadModel(TextAsset asset,List<Step> steps) { string[] lines = asset.text.Split("\n"[0]); for (int i = 0; i < lines.Length; i++) { string[] cols = lines[i].Split(" "[0]); Step step = new Step(); step.id = int.Parse(cols[0]); step.content = cols[1]; step.type = cols[2]; steps.Add(step); } LogUtil.i("大小"+ steps.Count); } } }
LogUtil:
public class LogUtil { private static bool LOGI = true; private static bool LOGW = true; private static bool LOGE = true; public static void i(string mess) { if (LOGI) { Debug.Log(mess); } } public static void w(string mess) { if (LOGW) { Debug.LogWarning(mess); } } public static void e(string mess) { if (LOGE) { Debug.LogError(mess); } } }
MainView(繼承IGlassView):
UI事件調用present中對應的處理方法:
// 新建邏輯管理對象 mvp-p prenseter = new MainPresenter(asset, this); // 為刷新當前步驟按鈕設置監聽回調 btn_text.onClick.AddListener(delegate () { prenseter.StepCurrent(); }); // 為上一步按鈕設置監聽回調 btn_last.onClick.AddListener(delegate () { prenseter.StepLast(); }); // 為下一步按鈕設置監聽回調 btn_next.onClick.AddListener(delegate () { prenseter.StepNext(); });
IGlassPresenter(繼承IGlassPresenter):
present中UI對應處理方法改變model,處理完調用view中方法顯示處理後的視圖展示:
public bool StepLast() { currentStep--; if (currentStep < 0) { currentStep = 0; return false; } onStepChange(0, currentStep); return true; } // 下一步邏輯 public bool StepNext() { if (steps.Count <= 0) { return false; } currentStep++; if (currentStep >= steps.Count) { currentStep = steps.Count-1; return false; } onStepChange(0,currentStep); return true; } // 步驟改變調用 public void onStepChange(int currentTaskId, int currentStepId) { this.currentStep = currentStepId; LogUtil.i("currentStepId"+currentStepId); currentStepContent =steps[currentStep].content; view.setStepContent(currentStepContent); view.setCurrentStep(currentStep); }
同時present中還有加載文件的方法:
文件格式是這樣子的:1 1.風險可能導致的後果:倒塌、高處墜落、公路中斷運行、跨越架封網脫落等 image1
上面的FileUtil能解析出來並賦值給step(model)對象
view中顯示方法(參數為model中的信息):
除了顯示model信息之外還會加載其他的UI或者模型
public void setStepContent(string content) { Debug.Log("content:"+content); // 按鈕文本設置為步驟內容 text.text = content; }
public void setCurrentStep(int currentStep) { currentStep = currentStep + 1; if (Application.loadedLevelName.Equals("KYJ")) { if (currentModel != null) Destroy(currentModel); Play("kyj_"+ currentStep); LoadPrefab("Prefabs/Kyj_Step/kyj_" + currentStep, objectTarget.transform); if (currentStep == 11) endStep.SetActive(true); else endStep.SetActive(false); } }
unity 使用MVC模式