unity - MVC架构简单实现

using UnityEngine;
using System;
//模型层
public class PlayerModel
{
//数据内容
private string name;
private int level;
private int exp;
private int gold;
//属性
public string Name { get => name; }
public int Level { get => level; }
public int Exp { get => exp; }
public int Gold { get => gold; }
//更新操作
public void AddLeve()
{
level += 1;
SavaData();
}
public void AddExp()
{
exp += 10;
if (exp >= 100)
{
exp -= 100;
level += 1;
}
SavaData();
}
public void AddGold()
{
gold += 100;
SavaData();
}
//初始化
public void Init()
{
//读取本地数据
name = PlayerPrefs.GetString("Name", "awa");
level = PlayerPrefs.GetInt("Level", 1);
exp = PlayerPrefs.GetInt("Exp", 1);
gold = PlayerPrefs.GetInt("Gold", 1);
}
//保存
public void SavaData()
{
//保存数据到本地
PlayerPrefs.SetString("Name", name);
PlayerPrefs.SetInt("Level", level);
PlayerPrefs.SetInt("Exp", exp);
PlayerPrefs.SetInt("Gold", gold);
CallUpdateEvent();
}
//建立注册机制 用于通知所有View层去更新数据
private event Action<PlayerModel> updateEvent;
//注册事件 一旦注册就更新
public void AddUpdateEvent(Action<PlayerModel> action)
{
updateEvent += action;
CallUpdateEvent();
}
//通知View层更新UI
public void CallUpdateEvent()
{
updateEvent?.Invoke(this);
}
//单例模式 1.方便外面获得Model层 2.同时保证每个Model层唯一
private static PlayerModel model;
public static PlayerModel Instance
{
get
{
if (model == null)
{
model = new PlayerModel();
model.Init();
}
return model;
}
}
}
------------------------------------------------------------
using UnityEngine;
using UnityEngine.UI;
//视图层
public class PlayerView : MonoBehaviour
{
//需要的UI对象
public Text Name;
public Text Level;
public Text Exp;
public Text Gold;
//负责更新UI (一旦Model层有变化便会通知Controller层去调用View层方法更新UI)
public void UpdateView(PlayerModel model)
{
Name.text = " 名字:" + model.Name;
Level.text = " 等级:" + model.Level;
Exp.text = " 经验:" + model.Exp;
Gold.text = " 货币:" + model.Gold;
}
}
------------------------------------------------------------
using UnityEngine;
using UnityEngine.UI;
//控制层
public class PlayerController : MonoBehaviour
{
public PlayerView m_View;
public Button AddLevel;
public Button AddExp;
public Button AddGold;
private void Start()
{
PlayerModel.Instance.AddUpdateEvent(m_View.UpdateView);
AddLevel.onClick.AddListener(PlayerModel.Instance.AddLeve);
AddExp.onClick.AddListener(PlayerModel.Instance.AddExp);
AddGold.onClick.AddListener(PlayerModel.Instance.AddGold);
}
}