【Unity】MVC的简单分享以及一个在UI中使用的例子

MVC解释为(MVC的字母顺序也代表了框架的构建顺序):

Model(模型层/数据层):负责数据的处理、例如增删查改等等。

View(视图层):负责获取控件,向用户显示数据。

Controller(控制层/业务逻辑层):处理业务逻辑,包括事件监听、触发数据更新、触发界面更新。

MVC各个模块之间协作

使用MVC的

好处:

  1. 各个模块之间各司其职、能够降低耦合度;
  2. 有利于项目的分工进行;
  3. 有利于组件的复用。

坏处:

  1. 文件和类增加会导致系统的复杂度变高;
  2. 有些小的项目只用一个脚本就能包括的逻辑,使用MVC框架后会增加结构的复杂性;
  3. 随着系统中类的增加,会导致性能的消耗随之增加。

适用场景:

简单应用、小游戏、小型工具等。

MVC在游戏当中的使用:作为UI框架使用较多,M为数据层面,V为UI层面,C是连接和管理两个模块的业务层。

下面是MVC框架例子

如何使用

脚本说明

创建三个脚本分别为(脚本具体内容处于博客最下方):

PlayerModel.cs、RoleView.cs以及RoleController.cs

PlayerModel.cs:定义数据模型包括更新数据保存数据方法通过事件绑定通知Controller需要View更新数据

RoleView.cs:获取UI控件提供一个更新UI数据方法

RoleController.cs:视图层中的组件绑定事件业务、让视图层更新UI显示的数据,提醒数据进行数据处理

步骤

  1. 创建一个UIPanel,取名为RolePanel,为其挂载RoleViewRoleController脚本同时Panel添加一个按钮一个文本

  1. 运行游戏点击按钮生命减少

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;

//1.初始化数据

public void InitData()

{

health = PlayerPrefs.GetInt("Health", 100);//初始化生命值,若在PlayerPrefs中没有这个属性则创建它,并将其的数值设置为100

}

//2.更新数据,假定更新一次减少10的生命值

public void UpdateData()

{

health -= 10;

//保存数据

SaveData();

}

//3.保存数据

public void SaveData()

{

PlayerPrefs.SetInt("Health",health);

//触发更新事件

UpdateDataInvoke();

}

//4.更新后触发的事件

/// <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

{

//1.获取控件

public Text health_Text;

public Button hurtButton;

//2.更新数据的方法

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)

{

//1.获取相关引用

//获取Panel

//获取组件

roleView = this.GetComponent<RoleView>();

instance = this.GetComponent<RoleController>();

//2.初始化

PlayerModel.Instance.InitData();

roleView.UpdateUIInfo(playerModel);

//3.绑定相应逻辑

//View层绑定业务

roleView.hurtButton.onClick.AddListener(HurtBtnMethod);

//Model层绑定更新事件

PlayerModel.Instance.AddUpdateEvent(UpdateEvent);

}

}

/// <summary>

/// 受伤按钮绑定的方法

/// </summary>

private void HurtBtnMethod()

{

//受伤

PlayerModel.Instance.UpdateData();

}

private void OnDestroy()

{

//1.移除业务

//2.销毁对象

//3.置空

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_);

}

}

完成

Unity游戏中,MVC框架可以帮助我们更好地管理UIMVC是一种将代码的功能进行划分的设计框架,主要原理是将软件用户界面和业务逻辑分离,提高代码的可扩展性、可复用性、可维护性和灵活性。 在Unity中,我们可以将MVC框架应用到游戏的UI设计中。举个例子来说,当游戏要发布节日活动,并且需要相应地更改游戏UI时,使用MVC框架可以将UI的功能分开,达到低耦合的效果。这样,当替换UI时,其他功能不会受到影响,提高游戏的质量。 在Unity开发过程中,许多公司都使用MVC的逻辑模式,即数据模型-视图-控制器。数据模型负责存储和管理游戏数据,视图负责显示用户界面,而控制器负责处理用户输入和更新数据模型。通过将这些功能分离,我们可以更好地组织和管理UI代码,提高开发效率。 所以,通过应用MVC框架,我们可以更好地管理Unity游戏的UI,提高代码的可维护性和可扩展性,同时也能提高游戏的质量和用户体验。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【Unity3D日常开发】Unity3d中使用MVC框架](https://blog.csdn.net/q764424567/article/details/83788696)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Unity框架——MVC框架](https://blog.csdn.net/Htlas/article/details/79076201)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值