如何在Unity中实现MVC模式?

MVC是什么?

​ MVC即Model View Controller,是模型(model)【数据层】-视图(view)【表现层】-控制器(controller)【逻辑层】的缩写。主要应用于网站开发,在游戏开发方面,因为不同游戏的需求、功能不尽相同,所以一般来说游戏不使用统一架构开发游戏。

如何在Unity中实现MVC模式?_第1张图片

MVC

  • M——数据层:就是各种资源(图片,声音,动画)在游戏引擎中形成的对象集合。美术提供的这些是最原始的,需要封装成一组可控的代码。这些对象在整个游戏中可以划分为数据层。在捕鱼2中,多处的功能模块设计使用这样的方法。比如多国语言的本地化。所有的字段的翻译通过一个plist文件存储,形成一张二维表。当需要切换语言时,只需要改变某个key相对的Value就行了。逻辑层不需要做任何改变。
  • V——表现层:类与玩家交互且可看到的内容,掌控着游戏的大背景,并负责将程序中的各个数据元素各种状态及时显示。
  • C——逻辑层:可以划分为数据接口层,游戏AI层,操作控制层。数据接口层是负责从数据层中提供相应的数据对象进行封装组合。在这个层次上,类似与面向对象中类的属性定义,并提供控制(Set/Get)接口。这一层既可以是无结构化(原始数据类型定义),也可以是结构化(表,树,集合)。游戏AI层是逻辑层之核心,定义了其下面的各种数据元素的状态变化(金币数量,武器等级,动画播放……)。根据不同的状态变量,控制着数据元素的状态表现,是游戏的大脑,指挥控制中心。操作控制层,负责处理用户的输入,并注册或绑定相应的AI事件。在逻辑层中,数据接口层向下面对数据层,操作控制层向上面对用户行为事件,而游戏AI层统筹这两层。

​ MVC的好处在于三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供方法,供上面一层调用,而模型层和视图层之间、视图与控制之间也提供了委托(事件)来回调方法。这样可以实现模块化,修改外观或者变更数据都不用修改其他层,大大方便了维护和升级。

实现MVC模式

MVC在游戏开发中属于什么位置?

如何在Unity中实现MVC模式?_第2张图片

(MVC在游戏开发中属于什么位置)

如何实现MVC模式,以游戏UI为例

  • 在Unity中搭建UI界面

如何在Unity中实现MVC模式?_第3张图片

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)
    }
}

最后

游戏开发写代码之前先整体考虑一下同类游戏的功能点,做个大概的结构规划再开始。需求不同,考虑问题的方式,解决问题的方式,游戏的整体框架规划等,都应该做些改变。

你可能感兴趣的:(虚幻,编程,游戏开发,unity,mvc,游戏引擎)