Laya Air游戏开发模式之MVC模式(核心篇)

上次结尾有说到Laya引擎在3D方面是借助Unity3d引擎的编辑器做好通过插件导出数据来做这没什么可挑剔(Unity引擎牛逼),但在2d编辑器(自身的)方面却存在很多bug(作者深有体会),所以这篇文章基本是针对传统MVC模式(指上篇文章)的改良版,该开发框架作者也是从一位优秀的资深游戏架构师那边学来的,并且作者也有应用到自己的项目上,下面也会以作者的一个2d(3d也是同理使用)塔防游戏做为例子

一、为什么不使用传统MVC

简而言之就是一句话:laya的编辑器问题太多了。作者曾经在使用引擎写2d游戏的时候遇到过节点莫名其妙消失、无法使用节点的数组属性等,在做UI的时候也是各种难受(与cocos creator或unity相比),如果使用传统的模式在场景下必然要挂载许多ui节点和脚本,而这篇文章介绍的就是为了尽量避免在可视化的界面中挂载节点,所有节点通过代码动态生成挂到场景下

二、MVC遵循原则

1.每个View层都是独立的,互相之间不能存在联系,每一个视图层做好后生成预制体并删除场景下的节点

2.整个游戏我们只使用一个场景,整个场景我们只会挂载一个代码脚本(game_app),游戏中的不同的运行场景通过代码new出视图来显示

3.在所有视图的预制体中我们不会挂在任何代码脚本,所有脚本通过控制器动态挂载

三、DEMO演示MVC模式

这里直接上作者以前用JavaScript写过的一个塔防游戏来说明,首先我们会封装好游戏的底层框架,每一个管理器做成一个单例(这里作者只封装了最主要的几个),不同游戏管理器不同的具体封装这里不赘述,读者可以根据游戏不同添加其他不同的底层管理器:

下面可以看见作者整个游戏中只有一个game_app脚本和一个游戏场景

所有的其他不同的场景视图作者都做成在预制体放在资源目录下:

作者在这里把每一个场景做成一个视图,并有一个对应的控制器(ctrl)来对整个逻辑场景进行控制(上面game_scene其实属于同一种场景,只是因为关卡不同作者做成许多个预制体通过代码来控制区分)

还有一个很重要的点就是,因为每一个控制器要控制对应的场景,就必然要读取到节点,所以我们会将所有ctrl继承自一个抽象的View类,这个类里会包含不同场景的不同节点在引擎onAwake()的时候自动初始化:

ui_view会将所有节点遍历存入一个表中,ctrl在访问的时候只要通过this.view["节点名"]的方式就能获取到:

export default class ui_view extends Laya.Script {
    constructor() { 
        super(); 
        
    }
    onAwake(){
        this.view = {};
        this.load_node(this.owner,"");
    }

    load_node(node,path){
 
        if(node.numChildren === 0){
            return;
        }
        for(var i = 0; i < node.numChildren; i ++) {
            var child = node.getChildAt(i);
            this.view[path + child.name] = child;

            this.load_node(child, path + child.name + "/");
        }
    }
    
}

现在我们每一个控制器已经可以访问的视图层了,而模型层只要通过导入的方式调用就行(更好的方式是在模型层添加自己封装的事件派送器进行监听),接下来我们进入最核心的game_app中,将上面所有东西整合到这个脚本中:

在初始化时我们将所有封装好的管理器添加在场景下,然后调用资源控制器进行游戏资源预加载:

       res_manager.Instance.pre_load_all_res({
            altas:[
                  //此处省略资源路径

            ],
            prefabs:[
                //场景json
                "res/game_prefabs/customs_scene.json",
                //此处省略资源路径
            ],
            font:[
                "res/game_ui/font/MarkerFelt.ttf"
            ]
            //sounds:[],
        },this.add_width.bind(this),function(){
            console.log("加载完毕...");
            this.enter_home_scene();
        }.bind(this));

加载完成后调用ui_manager封装好的方法生成每一个场景的预制体(.json文件),并添加上控制器,在进入下一个场景的时候移除就可以了:

这里添加脚本我们是通过Laya引擎中的反射机制来获取(在game_app中已经进行了注册),每一个添加好的场景都加入管理器的ui_view表中,调用remove_ui()的时候再移除就可以了。

最后就是模型层,策划人员只要将最喜欢使用的excel表通过工具转成.json文件(或者js的表结构也可以),然后导入控制器中就可以了,这里给大家看下作者自己做的数据:

 

ok,场景添加完成之后,在场景中每一个具体的节点要添加什么具体的组件只要通过在xx_ctrl中访问view["节点名"]的方式就可以了,基本上这就是此MVC模式的全部内容。

 

三、写在最后(容我bb多两句)

其实MVC模式至今已经有二十年历史,无论是网站、游戏、还是其他领域都是用的比较多,其实后来也出现了许多其他的游戏框架如PureMVC、ESC等等,作者曾经听一位腾讯大佬说游戏与其他领域不同的一点是不同类型的游戏使用同一种名字的框架做出来的效果可能完全不同,这也是与网站开发比较大不同的一点,因为游戏框架永远没有重复的(如果是错的当我没说),其实游戏你只会用引擎不会框架也能找到工作(UI崽),因为不同公司开发的模式可能完全不同只要去适应对应公司的模式就行,像Java那种你不懂框架可能就会si(没有框架你是打算手撸吗?),但java其实常用的就那么些主流框架。而游戏使用的开发框架你只能根据不同公司开发模式的不同去不停适应它,其实作者也只能算是个初学者,说这些只是为了想说明做游戏不能固定在"框架"这种字眼上,只要是能适应这个游戏的我们都愿意去用他,就像本篇MVC一样也是为了适应Laya引擎的缺陷而去设计的这样一种改版过的MVC。

 

感谢阅览奎斯文章,如有错误欢迎各位大佬批评指正

 

 

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值