MVC是什么?
MVC即Model View Controller,是模型(model)【数据层】-视图(view)【表现层】-控制器(controller)【逻辑层】的缩写。主要应用于网站开发,在游戏开发方面,因为不同游戏的需求、功能不尽相同,所以一般来说游戏不使用统一架构开发游戏。
MVC
- M——数据层:就是各种资源(图片,声音,动画)在游戏引擎中形成的对象集合。美术提供的这些是最原始的,需要封装成一组可控的代码。这些对象在整个游戏中可以划分为数据层。在捕鱼2中,多处的功能模块设计使用这样的方法。比如多国语言的本地化。所有的字段的翻译通过一个plist文件存储,形成一张二维表。当需要切换语言时,只需要改变某个key相对的Value就行了。逻辑层不需要做任何改变。
- V——表现层:类与玩家交互且可看到的内容,掌控着游戏的大背景,并负责将程序中的各个数据元素各种状态及时显示。
- C——逻辑层:可以划分为数据接口层,游戏AI层,操作控制层。数据接口层是负责从数据层中提供相应的数据对象进行封装组合。在这个层次上,类似与面向对象中类的属性定义,并提供控制(Set/Get)接口。这一层既可以是无结构化(原始数据类型定义),也可以是结构化(表,树,集合)。游戏AI层是逻辑层之核心,定义了其下面的各种数据元素的状态变化(金币数量,武器等级,动画播放……)。根据不同的状态变量,控制着数据元素的状态表现,是游戏的大脑,指挥控制中心。操作控制层,负责处理用户的输入,并注册或绑定相应的AI事件。在逻辑层中,数据接口层向下面对数据层,操作控制层向上面对用户行为事件,而游戏AI层统筹这两层。
MVC的好处在于三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供方法,供上面一层调用,而模型层和视图层之间、视图与控制之间也提供了委托(事件)来回调方法。这样可以实现模块化,修改外观或者变更数据都不用修改其他层,大大方便了维护和升级。
实现MVC模式
MVC在游戏开发中属于什么位置?
(MVC在游戏开发中属于什么位置)
如何实现MVC模式,以游戏UI为例
- 在Unity中搭建UI界面
Unity中搭建UI界面
如图所示,假设需要搭建的UI有:人物等级、经验条、button按钮。
- 构建MVC模式中的View层
//UI组件
public Text TExperience;//经验
public Text PlayerLevel;//人物等级
public Button Tbutton;//按钮
//初始化经验、人物等级
void Awake()
{
TExperience.text=PlayerMsgModel.GetInstance().TExperience.ToString()+"/"+PlayerMsgModel.GetInstance( ).TFullExperience.ToString();
PlayerLevel.text=PlayerMsgModel.GetInstance().PlayerLevel.ToString();
}
void Start()
{
//委托事件绑定
//等级
PlayerMsgModel.GetInstance().OnLevelChange+=SetLevel;
//经验
PlayerMsgModel.GetInstance().OnExperienceChange+=SetExperience;
//满级经验
PlayerMsgModel.GetInstance().OnFullExperienceChange+=SetFullExperience;
//绑定按钮控制功能
Tbutton.onClick.AddListener( PlayerMsgModel.conteroller.OnTButtonClick );
}
//修改等级值
public void SetLevel(int level)
{
PlayerLevel.text=level.ToString();
}
//修改经验值
public void SetExperience(int experience)
{
string [ ] str=TExperience.text.Split(new char[ ]{'/'});
TExperience.text=experience+"/"+str[1];
}
//修改满级经验值
public void SetFullExperience(int fullExperience)
{
string [ ] str=TExperience.text.Split(new char[ ]{'/'});
TExperience.text=str[0]+"/"+fullExperience;
}
- 构建MVC模式中的Model层
//定义当用户信息发生变化时执行此委托的方法
public delegate void OnValueChange(int value);
public class PlayerMsgModel
{
private int PlayerLevel=1;//人物等级
private int TExperience=0;//经验
private int FullExperience=10;//升级经验
//声明委托对象,发生变化触发事件
public OnValueChange OnLevelChange;
public OnValueChange OnExperienceChange;
public OnValueChange OnFullExperienceChange;
//属性代码
}
//单例
private static PlayerMsgModel instance;
public static PlayerMsgModel GetInstance()
{
if(instance==null)
{
instance=new PlayerMsgModel();
}
return instance;
}
private PlayerMsgModel
{ }
//属性
public int PlayerLevel
{
get{return playerLevel;}
set
{
playerLevel=value;
//委托不为空,执行委托
if(OnLevelChange!=null)
{OnLevelChange(playerLevel)}
}
}
public int TExperience
{
get{return tExperience;}
set
{
tExperience=value;
//委托不为空,执行委托
if(OnExperienceChange!=null)
{OnExperienceChange(tExperience)}
}
}
public int FullExperience
{
get{return fullExperience;}
set
{
fullExperience=value;
//委托不为空,执行委托
if(OnFullExperienceChange!=null)
{OnFullExperienceChange(fullExperience)}
}
}
- 构建MVC模式中的Controller层
public static PlayerMsgModel controller;
void Awake()
{
controller=this;
}
//按钮点击事件
public void OnTButtonClick()
{
PlayerMsgModel.GetInstance().TExperience+=5;
if(PlayerMsgModel.GetInstance().TExperience>=PlayerMsgModel.GetInstance().FullExperience)
{
PlayerMsgModel.GetInstance().PlayerLevel++;
PlayerMsgModel.GetInstance().TExperience-=PlayerMsgModel.GetInstance().FullExperience;
PlayerMsgModel.GetInstance().FullExperience=(int)(PlayerMsgModel.GetInstance().FullExperience*PlayerMsgModel.GetInstance().PlayerLevel-0.8f)
}
}
最后
游戏开发写代码之前先整体考虑一下同类游戏的功能点,做个大概的结构规划再开始。需求不同,考虑问题的方式,解决问题的方式,游戏的整体框架规划等,都应该做些改变。