文章转载自:https://blog.csdn.net/m0_69824302/article/details/135328614
现在越来越多的手机游戏开始要做成大厅+子游戏模式,简单的说就是,进入大厅后有很多子游戏,玩家选哪个完,就更新下载哪个子游戏,下次就直接进去玩子游戏就可以了。这就是现在要做的 “大厅+子游戏”架构,要拿一套这样的架构与设计出来主要解决一下3大问题:
(1) 大量的子游戏,只有等用户玩的时候再从服务器下载资源+更新代码;
(2) 做好”主框架”的工程项目,为各子游戏提供框架支持+功能服务;
(3) 大量子游戏的开发相对独立,如何设计工作机制,能让各子游戏项目组独立工作;
接下来我们从上面3个方向入手,来看下如何做好架构设计能实现这种模式。
1:如何实现从服务器下载子游戏资源与代码
手机游戏的大厅+子游戏模式架构,我们主要采用热更新的技术来做到从服务器下载资源+游戏逻辑代码来实现玩家玩哪个子游戏,再下载这个子游戏。热更新的技术目前Unity主流的有Lua, ILRuntime,huatuo等,今天我们以Lua为例来讨论,其它热更新的技术架构原理都是一样的。
一个子游戏,我们分为资源+代码逻辑,资源我们会把子游戏的资源打包成几个资源ab包,子游戏的lua代码也打成一个子游戏代码ab包。当玩家点击某个子游戏的时候,先检查本地是不是有这个游戏or版本是不是最新的,如果本地没有或不是最新的,就从服务器下载子游戏的代码包+ab包。
每个子游戏开发出来后放服务器上的子游戏文件夹包体如下:
a: 子游戏LuaScript ab包,这里有个固定的命名规则: 游戏名字_LuaScript
b: 子游戏的若干ab包,这里的命令规则: 游戏名字_资源包名字,防止子游戏间冲突;
c: 子游戏的版本号配置;
d: 子游戏包的最新文件的md5列表,用来做版本比对与增量下载更新;
e: 子游戏的名称+游戏ICON等游戏相关的信息;
每次用户在“大厅”点击子游戏的时候,查看本地是否有子游戏包,并确定包是否为最新版本,先拉取md5文件列表,比对两个版本的文件列表,获得需要更新下载的文件列表,根据文件列表下载最新的文件到本地,这就可以把上面子游戏包的全部内容下载到本地来。
接下来框架从子游戏_LuaScript的ab包中装载Lua脚本代码,入口模块做一个规定,是一个全局模块,同时模块的名字为子游戏的名字,规则为SubGameNameApp.lua, 在里面定义一个SubGameNameApp模块,这个模块有一个固定的入口函数”EnterSubGame(args)”。
这样进入子游戏逻辑,子游戏加载资源,跑游戏的业务逻辑,把子游戏运行起来。
每个子游戏在开发的时候,入口也要遵守这个规则,这样大厅才能准确的找到子游戏的入口代码跑子游戏的逻辑。
2:做好”主框架”的项目,为各子游戏提支持与服务
主框架工程其实就是整个游戏的主体,包括对子游戏提供的各种功能服务+热更新框架主体+大厅功能的逻辑(大厅也可以看作是基于框架的一个”游戏”), 主框架内置好Lua热更新机制,同时提供支付,广告等SDK的服务支撑,主框架工程中Lua相关的包括大厅,也可以热更,C#编写的不做到热更新。每个子游戏项目,子游戏团队在开发的时候,要先拉取一下主框架工程代码,不用管其它子游戏,基于主框架工程来进一步开发子游戏。如果子游戏有一些公共的功能支撑与服务,可以提需求给主框架工程项目,看是否内置这样的功能与服务。
在主框架工程开发”大厅的逻辑功能”,做好加载子游戏的lua脚本机制,当用户点击了某个子游戏,调用增量下载更新子游戏,按照子游戏的入口规则加载lua脚本,进入子游戏后,就有子游戏自己来加载自己要的资源。
3:如何设计”大厅+子游”戏各团队的工作方式
整个”大厅+子游戏”项目我们在开发中分成两类项目开发组,框架组+子游戏组。框架组负责支持热更的框架开发+大厅逻辑+SDK对接+Apk打包发布。这个项目组的日常就是做好框架支持与客户端App的版本发布于更新,以及SDK的对接。
每个子游戏组,在开发时拉取框架代码组的代码来基于这个项目工程来进行开发,子游戏开发组只用Lua开发子游戏逻辑,如果有共用的需要框架平台支撑的提好需求。子游戏开发完成后,扩展编辑器, 添加一个 导出”子游戏”资源包(资源包+代码资源包)的功能,交付给框架项目组。
框架项目组拿到子游戏的资源包后,部署到热更新资源服务器上,资源热更新服务器,我们是基于http server的文件服务。我们做如下配置:
SubGameApps.json: 这里存放所有的子游戏的名字, 大厅就是根据这个Json来知道当前服务器上有多少子游戏。当开发一个新子游戏出来以后,我们把子游戏的名字更新到SubGameApps.json文件里面,这样,大厅就能发现新开发的子游戏。
在http 文件服务器上部署子游戏app, 每个子游戏是一个文件夹,文件夹名字是子游戏的名字,文件夹里面是子游戏的资源包和配置,如上面所说的子游戏文件夹。当用户点击子游戏的时候,框架工程就根据子游戏的名字,到子游戏文件夹下载资源即可。
这样框架项目工程开发与各子游戏间就独立出来了,各子游戏也不用管彼此存在,只要发布子游戏的资源包就可以了。
今天的Unity 主工程+子游戏模式架构设计分享就到这里了,喜欢的话别忘了点赞和收藏。