码迷,mamicode.com
首页 > 编程语言 > 详细

unity 使用MVC模式

时间:2017-11-09 11:34:04      阅读:562      评论:0      收藏:0      [点我收藏+]

标签:ref   .text   equals   步骤   war   ext   file   log   erro   

这两天看了下老大的项目,他基本都是用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模式

标签:ref   .text   equals   步骤   war   ext   file   log   erro   

原文地址:http://www.cnblogs.com/dsh20134584/p/7807916.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!