13.MVP的Presenter逻辑层

113.MVX框架-MVP框架-Presenter逻辑层


13.1 知识点

主面板控制脚本和角色面板控制脚本可以直接复制MVC中的再进行修改

主面板控制脚本Start中,由于界面脚本自身不存在UpdateInfo方法了。所以要注释界面的更新方法。在控制层自己写更新mainView界面的逻辑。再在Start中调用。实际上是断开View和Model的联系。

private void Start()
{
    //获取同样挂载在一个对象上的 view脚本
    mainView = this.GetComponent<MVP_MainView>();
    
    //第一次的 界面更新
    //mainView.UpdateInfo(PlayerModel.Data);
    
    //通过P自己的更新方法 去更新 View
    UpdateInfo(PlayerModel.Data);
    
    //2.界面 事件的监听 来处理对应的业务逻辑
    mainView.btnRole.onClick.AddListener(ClickRoleBtn);
    //告知数据模块 当更新时 通知哪个函数做处理
    PlayerModel.Data.AddEventListener(UpdateInfo);
}

//3.界面的更新
private void UpdateInfo(PlayerModel data)
{
    if (mainView != null)
    {
        //mainView.UpdateInfo(data);
        //以前是把数据M传到V中去更新 现在全部由P来做
        mainView.txtName.text = data.PlayerName;
        mainView.txtLev.text = "LV." + data.Lev.ToString();
        mainView.txtMoney.text = data.Money.ToString();
        mainView.txtGem.text = data.Gem.ToString();
        mainView.txtPower.text = data.Power.ToString();
    }
}

在角色面板控制脚本中同理。也是断开View和Model的联系。

void Start()
{
    roleView = this.GetComponent<MVP_RoleView>();
    //第一次更新面板
    //roleView.UpdateInfo(PlayerModel.Data);
    UpdateInfo(PlayerModel.Data);
    
    roleView.btnClose.onClick.AddListener(ClickCloseBtn);
    roleView.btnLevUp.onClick.AddListener(ClickLevUpBtn);
    
    //告知数据模块 当更新时 通知哪个函数做处理
    PlayerModel.Data.AddEventListener(UpdateInfo);
}
private void UpdateInfo(PlayerModel data)
{
    if (roleView != null)
    {
        //roleView.UpdateInfo(data);
        //直接在P中得到V界面的控件 进行修改 断开V和M的联系
        roleView.txtLev.text = "LV." + data.Lev;
        roleView.txtHp.text = data.HP.ToString();
        roleView.txtAtk.text = data.Atk.ToString();
        roleView.txtDef.text = data.Def.ToString();
        roleView.txtCrit.text = data.Crit.ToString();
        roleView.txtMiss.text = data.Miss.ToString();
        roleView.txtLuck.text = data.Luck.ToString();
    }
}

进行测试

public class MVPMain : MonoBehaviour
{    
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.M))
        {
            //显示主面板
            MainPresenter.ShowMe();
        }
        else if (Input.GetKeyDown(KeyCode.N))
        {
            //隐藏主面板
            MainPresenter.HideMe();
        }
    }
}

13.2 知识点代码

MainPresenter

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MainPresenter : MonoBehaviour
{
    //能够在Presenter中得到界面才行
    private MVP_MainView mainView;


    private static MainPresenter presenter = null;

    public static MainPresenter Presenter
    {
        get
        {
            return presenter;
        }
    }

    //1.界面的显影
    public static void ShowMe()
    {
        if (presenter == null)
        {
            //实例化面板对象
            GameObject res = Resources.Load<GameObject>("BaseFramework/UI/UGUI/MVP/MainPanel");
            GameObject obj = Instantiate(res);
            //设置它的父对象 为Canvas
            obj.transform.SetParent(GameObject.Find("Canvas").transform, false);

            presenter = obj.GetComponent<MainPresenter>();
        }
        presenter.gameObject.SetActive(true);
    }
    public static void HideMe()
    {
        if (presenter != null)
        {
            presenter.gameObject.SetActive(false);
        }
    }

    private void Start()
    {
        //获取同样挂载在一个对象上的 view脚本
        mainView = this.GetComponent<MVP_MainView>();

        //第一次的 界面更新
        //mainView.UpdateInfo(MVP_PlayerModel.Data);

        //通过P自己的更新方法 去更新 View
        UpdateInfo(MVP_PlayerModel.Data);

        //2.界面 事件的监听 来处理对应的业务逻辑
        mainView.btnRole.onClick.AddListener(ClickRoleBtn);
        //告知数据模块 当更新时 通知哪个函数做处理
        MVP_PlayerModel.Data.AddEventListener(UpdateInfo);
    }


    private void ClickRoleBtn()
    {
        Debug.Log("点击按钮显示角色面板");
        //通过Controller去显示 角色面板
        //RoleController.ShowMe();

        RolePresenter.ShowMe();
    }

    //3.界面的更新
    private void UpdateInfo(MVP_PlayerModel data)
    {
        if (mainView != null)
        {
            //mainView.UpdateInfo(data);
            //以前是把数据M传到V中去更新 现在全部由P来做
            mainView.txtName.text = data.PlayerName;
            mainView.txtLev.text = "LV." + data.Lev.ToString();
            mainView.txtMoney.text = data.Money.ToString();
            mainView.txtGem.text = data.Gem.ToString();
            mainView.txtPower.text = data.Power.ToString();
        }
    }

    private void OnDestroy()
    {
        MVP_PlayerModel.Data.RemoveEventListener(UpdateInfo);
    }
}

RolePresenter

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RolePresenter : MonoBehaviour
{
    private MVP_RoleView roleView;

    private static RolePresenter presenter = null;

    public static RolePresenter Presenter
    {
        get
        {
            return presenter;
        }
    }

    public static void ShowMe()
    {
        if (presenter == null)
        {
            //实例化面板对象
            GameObject res = Resources.Load<GameObject>("BaseFramework/UI/UGUI/MVP/RolePanel");
            GameObject obj = Instantiate(res);
            //设置它的父对象 为Canvas
            obj.transform.SetParent(GameObject.Find("Canvas").transform, false);

            presenter = obj.GetComponent<RolePresenter>();
        }
        //如果是隐藏的形式hide 在这要显示
        presenter.gameObject.SetActive(true);

    }

    public static void HideMe()
    {
        if (presenter != null)
        {
            //方式一 直接删
            //Destroy(panel.gameObject);
            //panel = null;
            //方式二 设置可见为隐藏
            presenter.gameObject.SetActive(false);
        }
    }
    
    void Start()
    {
        roleView = this.GetComponent<MVP_RoleView>();
        //第一次更新面板
        //roleView.UpdateInfo(MVP_PlayerModel.Data);
        UpdateInfo(MVP_PlayerModel.Data);

        roleView.btnClose.onClick.AddListener(ClickCloseBtn);
        roleView.btnLevUp.onClick.AddListener(ClickLevUpBtn);

        //告知数据模块 当更新时 通知哪个函数做处理
        MVP_PlayerModel.Data.AddEventListener(UpdateInfo);
    }


    private void ClickCloseBtn()
    {
        HideMe();
    }

    private void ClickLevUpBtn()
    {
        //通过数据模块 进行升级 达到数据改变
        MVP_PlayerModel.Data.LevUp();
    }

    private void UpdateInfo(MVP_PlayerModel data)
    {
        if (roleView != null)
        {
            //roleView.UpdateInfo(data);
            //直接在P中得到V界面的控件 进行修改 断开V和M的联系
            roleView.txtLev.text = "LV." + data.Lev;
            roleView.txtHp.text = data.HP.ToString();
            roleView.txtAtk.text = data.Atk.ToString();
            roleView.txtDef.text = data.Def.ToString();
            roleView.txtCrit.text = data.Crit.ToString();
            roleView.txtMiss.text = data.Miss.ToString();
            roleView.txtLuck.text = data.Luck.ToString();
        }
    }

    private void OnDestroy()
    {
        MVP_PlayerModel.Data.RemoveEventListener(UpdateInfo);
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏