MVC框架与PlayerPrefs(本地存储)

概念

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:用于在突发退出程序时,保存数据以备恢复时使用,但是会导致程序间断所以不建议调用

猜你喜欢

转载自blog.csdn.net/k253316/article/details/124215973