当前位置: 首页 > news >正文

Unity 如何打造”大厅+子游戏”架构

现在越来越多的手机游戏开始要做成大厅+子游戏模式,简单的说就是,进入大厅后有很多子游戏,玩家选哪个完,就更新下载哪个子游戏,下次就直接进去玩子游戏就可以了。这就是现在要做的 “大厅+子游戏”架构,要拿一套这样的架构与设计出来主要解决一下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 主工程+子游戏模式架构设计分享就到这里了,喜欢的话别忘了点赞和收藏。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringBoot + MyBatis-Plus 实现分页操作详解
  • 边缘计算网关在温室大棚智能控制系统应用,开启农业新篇章
  • gnu工程的编译 - 以libiconv为例
  • “a == b”和“a.equals(b)”有什么区别?
  • 谷歌Linux内核自动测试平台架构介绍-用自动测试测试难以测试的问题
  • 2024年软件测试行业展望
  • 什么是负载均衡?
  • Frappe Charts:数据可视化的强大工具
  • 如何在 Ubuntu 16.04 上使用 Minio 设置对象存储服务器
  • 鸿蒙 DevEco Studio 3.1 入门指南
  • js遍历后端返回的集合将条件相同的放入同一个数组内
  • Portraiture4.1汉化版PS磨皮插件(支持原生m1芯片m2)
  • 约翰瑟尔的故事
  • QT上位机开发(抽奖软件)
  • 听GPT 讲Rust源代码--library/panic_unwind
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • bearychat的java client
  • emacs初体验
  • iOS 系统授权开发
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • java2019面试题北京
  • javascript从右向左截取指定位数字符的3种方法
  • JavaScript中的对象个人分享
  • Koa2 之文件上传下载
  • Lucene解析 - 基本概念
  • Mysql优化
  • oschina
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 译自由幺半群
  • 在electron中实现跨域请求,无需更改服务器端设置
  • ​水经微图Web1.5.0版即将上线
  • ######## golang各章节终篇索引 ########
  • #{}和${}的区别?
  • $.proxy和$.extend
  • (14)Hive调优——合并小文件
  • (Java数据结构)ArrayList
  • (第61天)多租户架构(CDB/PDB)
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (全注解开发)学习Spring-MVC的第三天
  • (十六)Flask之蓝图
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .gitignore文件_Git:.gitignore
  • .NET C# 配置 Options
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • /proc/vmstat 详解
  • @EnableAsync和@Async开始异步任务支持
  • [1]从概念到实践:电商智能助手在AI Agent技术驱动下的落地实战案例深度剖析(AI Agent技术打造个性化、智能化的用户助手)
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]