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