概念
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写
是一种软件设计规范,用一种业务逻辑、数据、界面显示分离的方法组织代码
好处:降低耦合,方便修改,逻辑更清晰
缺点:脚本变多,体量变大,流程变复杂
开始前需要创建两个panel,并做成预设,放在Resources下的UI文件夹中,方便克隆
先创建三个文件夹,分类管理
创建PlayerModel脚本
public string PlayerName { get; set; }
public int PlayerLevel { get; set; }
public int Gold { get; set; }
public int Diamond { get; set; }
public int Pow { get; set; }
public int Blood { get; set; }
public int Attack { get; set; }
public int Defense { get; set; }
//单例
private static PlayerModel instance;
public static PlayerModel Instance
{
get
{
if (instance == null)
{
instance = new PlayerModel();
instance.Init();
}
return instance;
}
}
//初始化方法
void Init()
{
PlayerName = PlayerPrefs.GetString("PLayerName", "萝卜1");
PlayerLevel = PlayerPrefs.GetInt("PlayerLevel", 1);
Gold = PlayerPrefs.GetInt("Gold", 100);
Diamond = PlayerPrefs.GetInt("Diamond", 200);
Pow = PlayerPrefs.GetInt("Pow", 300);
Blood = PlayerPrefs.GetInt("Blood", 20);
Attack = PlayerPrefs.GetInt("Attack", 30);
Defense = PlayerPrefs.GetInt("Defense", 50);
}
//升级方法
public void LenvelUp()
{
PlayerLevel++;
Blood += 20;
Attack += 30;
Defense += 50;
SaveDate();
}
//存储数据
public void SaveDate()
{
PlayerPrefs.SetString("PlayerName", PlayerName);
PlayerPrefs.SetInt("PlayerLevel", PlayerLevel);
PlayerPrefs.SetInt("Gold", Gold);
PlayerPrefs.SetInt("Diamond", Diamond);
PlayerPrefs.SetInt("Pow", Pow);
PlayerPrefs.SetInt("Attack", Attack);
PlayerPrefs.SetInt("Blood", Blood);
PlayerPrefs.SetInt("Defense", Defense);
UpdateInfo();
}
//定义事件
public event UnityAction<PlayerModel> updateEvent;
//添加事件
public void AddEvent(UnityAction<PlayerModel> method)
{
updateEvent+=method;
}
//注销事件
public void RemoveEvent(UnityAction<PlayerModel> method)
{
updateEvent-= method;
}
//更新事件方法(触发事件)
public void UpdateInfo()
{
if (updateEvent != null)
{
updateEvent(this);
}
}
由于是纯类,所以不挂载对象,再创建MainView脚本
public Text playerName, playerLevel, gold, dianmod, pow;
public Button playerBtn;
void Start()
{
playerBtn.onClick.AddListener(() => {
print("点击成功");
RoleController.Show();
});
}
public void UpdateInfo(PlayerModel pm)
{
playerName.text = pm.PlayerName;
playerLevel.text = pm.PlayerLevel.ToString();
gold.text = pm.Gold.ToString();
dianmod.text=pm.Diamond.ToString();
pow.text = pm.Pow.ToString();
}
将其挂载到MainPanel面板,并分别拖入组件(view类放在view文件夹里)
再创建MainController脚本,挂载到MainPanel上
MainView mainView;
void Start()
{
mainView = GetComponent<MainView>();
mainView.UpdateInfo(PlayerModel.Instance);
PlayerModel.Instance.AddEvent(UpdateInfo);
}
//调用事件触发方法
void UpdateInfo(PlayerModel pm)
{
if (mainView!=null)
{
mainView.UpdateInfo(pm);
}
}
private static MainController controller;
public static MainController Controller
{
get { return controller; }
}
public static void Show()
{
if (controller==null)
{
GameObject go = Resources.Load<GameObject>("UI/MainPanel");
GameObject main=Instantiate(go);
Transform canvas = GameObject.Find("Canvas").transform;
main.transform.SetParent(canvas,false);
//main.transform.parent = canvas;//在此处不能用这个,会错位
controller=main.GetComponent<MainController>();
}
controller.gameObject.SetActive(true);
}
public static void Hide()
{
if (controller!=null)
{
Destroy(controller.gameObject);
controller=null;
}
}
public void OnDestroy()
{
PlayerModel.Instance.RemoveEvent(UpdateInfo);
}
创建RoleView脚本,挂载在RolePanel
public Text playerLenvel, blood, attack, defense;
public Button closeBtn, levelUpBtn;
void Start()
{
closeBtn.onClick.AddListener(() =>
{
RoleController.Hide();
});
levelUpBtn.onClick.AddListener(() =>
{
PlayerModel.Instance.LenvelUp();
print(PlayerPrefs.GetInt("Attack", PlayerModel.Instance.Attack));
print(PlayerPrefs.GetInt("PlayerLevel", PlayerModel.Instance.PlayerLevel));
});
}
//更新角色面板信息
public void UpdateInfo(PlayerModel pm)
{
playerLenvel.text = "Lv" + pm.PlayerLevel;
blood.text = pm.Blood.ToString();
attack.text = pm.Attack.ToString();
defense.text = pm.Defense.ToString();
}
再建RoleController脚本
RoleView roleView;
void Start()
{
roleView = GetComponent<RoleView>();
roleView.UpdateInfo(PlayerModel.Instance);
PlayerModel.Instance.AddEvent(UpdateInfo);
}
void UpdateInfo(PlayerModel pm)
{
if (roleView != null)
{
roleView.UpdateInfo(pm);
}
}
private static RoleController controller;
public static RoleController Controller
{
get { return controller; }
}
public static void Show()
{
if (controller == null)
{
GameObject go = Resources.Load<GameObject>("UI/RolePanel");
GameObject main = Instantiate(go);
Transform canvas = GameObject.Find("Canvas").transform;
main.transform.SetParent(canvas, false);
//main.transform.parent = canvas;//在此处不能用这个,会错位
controller = main.GetComponent<RoleController>();
}
controller.gameObject.SetActive(true);
}
public static void Hide()
{
if (controller != null)
{
Destroy(controller.gameObject);
controller = null;
}
}
public void OnDestroy()
{
PlayerModel.Instance.RemoveEvent(UpdateInfo);
}
因为用了PlayerPrefs(本地存储),所以多次运行会保存上次退出时的值
PlayerPrefs存储位置
windows注册表-HKEY_CURRENT_USER-Software-Unity-UnityEditor-DefaultCompany-创建项目的名字
PlayerPrefs的五种方法
1.SetXXX : 是你要储存的数据类型,这里必须是一组键值对,第一个参数是Key,第二个参数是对应的Value。
2.GetXXX:这里是获取数据的函数,只有一个参数Key,用来获取对应Key的Value.
3.HasKey: 这个可以用来做判断。比如有两组数据一组有XX这个Key,另一组没有XX这个Key,这个时候我们就可以对这两组数据进行差异化操作。
4.DeleteXX:用于删除数据。
5.Save:用于在突发退出程序时,保存数据以备恢复时使用,但是会导致程序间断所以不建议调用