unity中简易的MVC框架

模型层
业务流程/状态的处理以及业务规则的制定。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果

public delegate void OnvalueChange<T>(T val);

public class Model
{
    static Model mod;
    public static Model GetMod()
    {
        if (mod == null)
        {
            mod = new Model();
        }
        return mod;
    }

    float f;
    public OnvalueChange<float> OnvalueChange_f;
    public float F 
    { 
        get { return f; } 
        set { f = value; OnvalueChange_f?.Invoke(f); } 
    }

    int i;
    public OnvalueChange<int> OnvalueChange_i;
    public int I
    {
        get { return i; }
        set { i = value; OnvalueChange_i?.Invoke(i); }
    }

    bool b;
    public OnvalueChange<bool> OnvalueChange_b;
    public bool B
    {
        get { return b; }
        set { b = value; OnvalueChange_b?.Invoke(b); }
    }

}

视图层(View)
代表用户交互界面,一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。
数据模型主要指实体对象的数据 保存(持续化)。比如将一张订单保存到数据库,从数据库获取订单。我们可以将这个模型单独列出,所有有关数据库的操作只限制在该模型中。

using UnityEngine;
using UnityEngine.UI;

public class View : MonoBehaviour
{
    public Text Tips;
    public Button btnIntAdd, btnIntSub;
    public Button btnFloatAdd, btnFloatSub;
    public Button btnIsB;
    void Start()
    {
        Model.GetMod().OnvalueChange_f += Set_f;
        Model.GetMod().OnvalueChange_i += Set_i;
        Model.GetMod().OnvalueChange_b += Set_b;
        btnIntAdd.onClick.AddListener(Control.Instance.OnIntAddButtonClick);
        btnIntSub.onClick.AddListener(Control.Instance.OnIntSubButtonClick);
        btnFloatAdd.onClick.AddListener(Control.Instance.OnFloatAddButtonClick);
        btnFloatSub.onClick.AddListener(Control.Instance.OnFloatSubButtonClick);
        btnIsB.onClick.AddListener(Control.Instance.OnChangeBoolButtonClick);
    }

    private void Set_b(bool val)
    {
        Tips.text=$"b\t当前值为\t{val}";
    }

    private void Set_i(int val)
    {
        Tips.text = $"i\t当前值为\t{val}";
    }

    private void Set_f(float val)
    {
        Tips.text = $"f\t当前值为\t{val}";
    }
}

控制层

  • 控制(Controller)可以理解为从用户接收请求,将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理。
  • 例如,用户点击一个连接,控制层接受请求后,
    并不处理业务信息,它只把用户的信息传递给模型,告诉模型做什么,选择符合要求的视图返回给用户。因此,一个模型可能对应多个视图,一个视图可能对应多个模型。
  • 模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映到这些变化。
  • 因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。
using UnityEngine;

public class Control : MonoBehaviour
{
    public static Control Instance;
    private void Awake()
    {
        Instance = this;
    }

    public void OnIntAddButtonClick()
    {
        Model.GetMod().I += 1;
    }
    public void OnIntSubButtonClick()
    {
        Model.GetMod().I -= 1;
    }
    public void OnFloatAddButtonClick()
    {
        Model.GetMod().F += 1.25f;
    }
    public void OnFloatSubButtonClick()
    {
        Model.GetMod().F -= 1.25f;
    }
    public void OnChangeBoolButtonClick()
    {
        Model.GetMod().B =!Model.GetMod().B;
    }
}

模型、视图、控制器三者之间的关系和各自的主要功能

  • 最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外壳。
  • 最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息。
  • 中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。
  • 这三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口(Interface),供上面一层调用。这样一来,软件就可以实现模块化,修改外观或者变更数据都不用修改其他层,大大方便了维护和升级。
    请添加图片描述
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity 实现 MVC 架构通常需要以下几步: 1. 创建 Model 类:Model 类用于存储数据和数据操作方法,例如: ``` public class PlayerModel { private int _health; public int Health { get { return _health; } set { _health = value; if (_health <= 0) { // 触发死亡事件 OnDeath(); } } } public event Action OnDeath; public void TakeDamage(int amount) { Health -= amount; } } ``` 2. 创建 View 类:View 类用于显示数据,例如: ``` public class PlayerView : MonoBehaviour { public TextMeshProUGUI healthText; public void UpdateHealth(int health) { healthText.text = "Health: " + health; } } ``` 3. 创建 Controller 类:Controller 类用于控制 Model 和 View,例如: ``` public class PlayerController { private PlayerModel _model; private PlayerView _view; public PlayerController(PlayerModel model, PlayerView view) { _model = model; _view = view; // 监听 Model 的数据变化并更新 View _model.OnHealthChanged += _view.UpdateHealth; // 监听 View 的用户操作并控制 Model _view.OnTakeDamage += _model.TakeDamage; } } ``` 4. 在场景创建 View 对象,并在 Controller 传入 Model 和 View: ``` public class GameController : MonoBehaviour { public PlayerView playerViewPrefab; private void Start() { // 创建 Model 对象 var playerModel = new PlayerModel(); // 创建 View 对象并绑定到场景的 GameObject 上 var playerView = Instantiate(playerViewPrefab); playerView.transform.SetParent(transform, false); // 创建 Controller 对象并传入 Model 和 View var playerController = new PlayerController(playerModel, playerView); } } ``` 这样就完成了一个简单的 MVC 架构的实现。在实际项目,可能需要更复杂的 Model 和 View 类,以及更多的 Controller 类来控制不同的数据和视图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值