MVC的解释为(MVC的字母顺序也代表了框架的构建顺序):
Model(模型层/数据层):负责数据的处理、例如增删查改等等。
View(视图层):负责获取控件,向用户显示数据。
Controller(控制层/业务逻辑层):处理业务逻辑,包括事件监听、触发数据更新、触发界面更新。
MVC各个模块之间的协作图:
使用MVC的
好处:
- 各个模块之间各司其职、能够降低耦合度;
- 有利于项目的分工进行;
- 有利于组件的复用。
坏处:
- 文件和类增加会导致系统的复杂度变高;
- 有些小的项目只用一个脚本就能包括的逻辑,使用MVC框架后会增加结构的复杂性;
- 随着系统中类的增加,会导致性能的消耗随之增加。
适用场景:
较大型的商业级别项目
MVC在游戏当中的使用:作为UI框架使用较多,M为数据层面,V为UI层面,C是连接和管理两个模块的业务层。
下面是MVC框架例子:
如何使用?
脚本说明:
创建三个脚本分别为(脚本具体内容处于博客最下方):
PlayerModel.cs、RoleView.cs以及RoleController.cs。
PlayerModel.cs:定义数据模型、包括了更新数据和保存数据的方法、通过事件绑定通知Controller层需要让View层更新数据;
RoleView.cs:获取UI控件,并提供一个更新UI数据的方法;
RoleController.cs:上为视图层中的组件绑定事件业务、让视图层更新UI显示的数据,下能提醒数据层进行数据处理。
步骤:
- 创建一个UIPanel,取名为RolePanel,为其挂载RoleView和RoleController脚本,同时在该Panel中添加一个按钮和一个文本。


- 运行游戏,点击按钮后,生命值会减少。


PlayerModel.cs:
using UnityEngine;
using UnityEngine.Events;
public class PlayerModel
{
//自身的单例,让数据在整个游戏中只存在一份
private static PlayerModel instance = null;
public static PlayerModel Instance
{
get
{
if(instance == null)
instance = new PlayerModel();
return instance;
}
}
//数据
private int health;//生命值
public int Health
{
get
{
return health;
}
}
//反馈给Controller的更新事件
public UnityAction<PlayerModel> updateModelEvent = null;
public void InitData()
{
health = PlayerPrefs.GetInt("Health", 100);//初始化生命值,若在PlayerPrefs中没有这个属性则创建它,并将其的数值设置为100
}
//2.更新数据,假定更新一次减少10的生命值
public void UpdateData()
{
health -= 10;
//保存数据
SaveData();
}
public void SaveData()
{
PlayerPrefs.SetInt("Health",health);
//触发更新事件
UpdateDataInvoke();
}
/// <summary>
/// 添加事件的方法
/// </summary>
/// <param name="action"></param>
public void AddUpdateEvent(UnityAction<PlayerModel> action)
{
if (action != null)
updateModelEvent += action;
}
/// <summary>
/// 移除事件的方法
/// </summary>
/// <param name="action"></param>
public void RemoveUpdateEvent(UnityAction<PlayerModel> action)
{
if(action != null)
updateModelEvent -= action;
}
/// <summary>
/// 更新时的操作
/// </summary>
private void UpdateDataInvoke()
{
if (updateModelEvent != null)
{
updateModelEvent?.Invoke(this);
}
}
}
RoleView.cs:
using UnityEngine;
using UnityEngine.UI;
public class RoleView : MonoBehaviour
{
public Text health_Text;
public Button hurtButton;
public void UpdateUIInfo(PlayerModel playerModel)
{
health_Text.text = "当前生命值:" + playerModel.Health.ToString();
}
}
RoleController.cs:
using UnityEngine;
public class RoleController : MonoBehaviour
{
//自己的单例(作为系统访问MVC的入口)
private static RoleController instance;
public static RoleController Instance
{
get
{
return instance;
}
}
private RoleView roleView;//对应的视图层
private PlayerModel playerModel => PlayerModel.Instance;
// Start is called before the first frame update
void Start()
{
if(roleView == null)
{
//获取Panel
//获取组件
roleView = this.GetComponent<RoleView>();
instance = this.GetComponent<RoleController>();
PlayerModel.Instance.InitData();
roleView.UpdateUIInfo(playerModel);
//View层绑定业务
roleView.hurtButton.onClick.AddListener(HurtBtnMethod);
//Model层绑定更新事件
PlayerModel.Instance.AddUpdateEvent(UpdateEvent);
}
}
/// <summary>
/// 受伤按钮绑定的方法
/// </summary>
private void HurtBtnMethod()
{
//受伤
PlayerModel.Instance.UpdateData();
}
private void OnDestroy()
{
if (roleView != null)
{
roleView.hurtButton.onClick.RemoveListener(HurtBtnMethod);
Destroy(roleView);
roleView = null;
}
PlayerModel.Instance.RemoveUpdateEvent(UpdateEvent);
}
/// <summary>
/// 更新事件
/// </summary>
private void UpdateEvent(PlayerModel playerModel_)
{
roleView.UpdateUIInfo(playerModel_);
}
}
完成!!!