Unity实现简单的MVC架构

发布于:2024-07-03 ⋅ 阅读:(27) ⋅ 点赞:(0)

前言

在Unity中,MVC(Model-View-Controller)框架是一种架构模式,用于分离游戏的逻辑、数据和用户界面。MVC模式可以帮助开发者更好地管理代码结构,提高代码的可维护性和可扩展性。

MVC基本概念

  1. Model(模型)
  • 职责:管理应用程序的数据逻辑和业务规则。它独立于视图和控制器,不直接处理用户输入。
  • 示例:游戏中的角色属性(如生命值、得分)、配置文件、数据持久化。
  1. View(视图)
  • 职责:负责用户界面的呈现和显示数据。它从模型获取数据,并显示给用户。
  • 示例:UI面板、按钮、文本框、动画展示。
  1. Controller(控制器)
  • 职责:处理用户输入,并将其转换为模型和视图的操作。它连接模型和视图,并控制它们之间的交互。
  • 示例:响应按钮点击、处理输入事件、调用模型的更新方法。

示例

先搭建个UI

  • PlayerModel.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

public class PlayerModel
{
    private int level;
    public int Level
    {
        get { return level; }
    }

    private int money;
    public int Money
    {
        get { return money; }
    }

    // 单例模式,确保数据唯一性
    private static PlayerModel instance;
    public static PlayerModel Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new PlayerModel();
                // 创建实例初始化
                instance.Init();
            }
            return instance;
        }
    }

    private event UnityAction<PlayerModel> updateEvent;

    public void Init()
    {
        // 初始化数据,一般在这里读取表配置啥的
        level = 1;
        money = 100;
    }

    public void LevelUp()
    {
        level++;
        SaveInfo();
    }

    public void AddMoney(int num)
    {
        money += num;
        SaveInfo();
    }

    public void SaveInfo()
    {
        // 保存数据并更新
        Debug.Log("SaveInfo");
        UpdateInfo();
    }

    public void UpdateInfo()
    {
        // 更新数据的时候给Controller发通知
        updateEvent?.Invoke(this);
    }

    public void AddUpdateEvent(UnityAction<PlayerModel> action)
    {
        updateEvent += action;
    }

    public void RemoveUpdateEvent(UnityAction<PlayerModel> action)
    {
        updateEvent -= action;
    }
}

  • PlayerView.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PlayerView : MonoBehaviour
{
    // 先绑定UI
    public Text levelText;
    public Text moneyText;

    public void UpdateView(PlayerModel playerModel)
    {
        // View 负责显示数据,不负责逻辑
        levelText.text = playerModel.Level.ToString();
        moneyText.text = playerModel.Money.ToString();
    }
}

  • PlayerController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PlayerController : MonoBehaviour
{
    // 绑定View
    public PlayerView playerView;
    // 绑定Button
    public Button moneyBtn;
    public Button levelBtn;

    private void Start()
    {
        // 把View的更新方法绑到Model的通知列表里
        PlayerModel.Instance.AddUpdateEvent(playerView.UpdateView);
        // 绑定Button的点击事件
        levelBtn.onClick.AddListener(PlayerModel.Instance.LevelUp);
        moneyBtn.onClick.AddListener(PlayerModel.Instance.AddMoney);
    }
}

  • 绑定组件


流程图

效果预览


后话

通过这种分离模式,我们将数据处理、用户交互和显示逻辑分离开来,使得代码更易于管理和维护。后期可以根据需要扩展这些基本类,例如增加更多的 UI 元素或更复杂的交互逻辑。

enjoy it ~


网站公告

今日签到

点亮在社区的每一天
去签到