1. 程式人生 > >unity 使用MVC模式

unity 使用MVC模式

事件 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> where
T : 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(); // 上一步 bool
StepLast(); 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模式