会员登陆
已有账号?登陆账号 还未注册?注册

快捷登陆

[Unity] Unity手游实战:从0开始SLG—客户端技术选型

14
回复
757
查看
打印 上一主题 下一主题
[复制链接]

13

主题

13

帖子

215

积分

不屈白银

Rank: 2

积分
215
楼主
发表于 2020-11-17 17:11:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
如何在立项前做好客户端的技术选型?一起来看这篇Unity手游实战:从0开始SLG—客户端技术选型

项目背景

所谓选型,我认为就是为了实现某(些)个需求或者解决某(些)个问题所使用的解决方案。它可能是一个技术方案,也可能是一个管理方案,也可以是一个软件、工具或者是流程规范。

这篇的主题是技术选型,所以主要会分析项目客户端部分的技术解决方案。那么做选型分析之前就要先收集需求,分析需求,搞清楚我们的项目需要什么,达到什么效果,实现什么功能。除了项目本身章程和范围之外,还要看同项目的其他部门分工和合作方案(比如服务器的技术对接,美术资源的规范流程以及部分效果的实现对接),在这之外还需要考虑公司的大环境,比如资源的支持程度,项目的编制和人员的支持力度,开发环境甚至是市场和法律条件。

世界地图

我们现在的项目是一个沙盘类型的SLG。主要玩法也是世界地图的资源掠夺。这是比较经典的SLG玩法,包括《列王纷争》《王国纪元》《乱世王者》《真龙霸业》等等国内外数据良好的游戏都是这种核心玩法。大地图很大,一个大服甚至会有几十万的地形数据。在地形编辑、行军寻路(需要支持关隘和高地)、服务器数据同步等诸多地方都会有比较大的挑战。

主城

接下来是城市发展。这部分和市面上大多数的同类型游戏设计都不一样了。大部分的沙盘类游戏都是采用静态城市的布局策略,即每个建筑的坑都留好了,你达到等级之后只要点击坑位建造指定的兵营、伐木场、训练营等建筑就好了。

而且建筑本身也只是一个功能系统的入口,并不会有建筑和建筑之间产能影响,亦或是按照自己的习惯建造建筑和道路。我们的建筑后期加起来会有140多个,每个建筑都是可以自由移动和布局,在这个功能点上更像《部落冲突》的表现形式。

但是和它不同的是,我们的主城不会参与战斗,所以也不会有防御性的建筑,取而代之的是服务器性的建筑,比如水井、医院、教堂、公园等等这些服务器性的建筑会影响到生产建筑的产能,所以相同等级的情况下,合理的布局会让你的产能超出别人一截。另外我们的道路也是可以自定义编辑的,和道路相连的建筑也会有加成。如果有人玩过《城市:天际线》应该能够更明白一些主城的玩法模型。但是和《天际线》相比我们又没有那么复杂的计算和影响,毕竟人家是PC上的纯单机模拟养成类型。

除了建筑和道路的的自由编辑之外,NPC也是主城的主要功能。NPC会有10几种,每种的AI都不一样,并且要求能够在两个完全紧连的建筑缝隙中穿插和移动,还要考虑道路优先。

城市会有自定的保存模板,还要有可破坏和不可破坏的装饰机制等等。

所以主城的难点除了实现各个功能之外,还需要解决100多个建筑+几十个NPC+场景本身和UI部分的所有性能消耗。

战斗

战斗之前也有说过,需要支持同屏500+的单位同时战斗,这些单位每个都是独立的个体。这表示,每个AI都需要有自己的AI机制和独立的动作表现。一个单位大概会有5-6种动作,小型单位600+面,大型单位1000+面。这对GPU和CPU的压力都非常的大。

战斗还需要支持录像回放,并且在任何设备任何时候播放出来的结果和过程都要一致。

战斗需要支持倍速功能。

如果有人熟悉《全面战争》系列会比较容易理解我们战斗模式。不过和全战不同的是,我们的士兵在出战之后就不能手动控制了,毕竟是移动游戏,太复杂了伤害玩家。。。不过,其实还是可以手动释放英雄技能的。【手动滑稽】

三块重点内容分析完成之后,技术方案就需要根据需求去挑选了。用一句概括游戏就是:轻经营、重策略的沙盘SLG。

技术选型

嗯,下面就正式入活了。

引擎版本

技术选型要服务于产品。但在挑选技术方案之前还要做一件事情,引擎版本的选择。

早在2018年末,我们就收到了谷歌商店上架APP强制要求64位版本的需求,具体强制时间在19年8月1日。当时和Unity团队沟通的时候,反馈是必须2018以上的版本才能支持64位(不过一段时间之后又说2017.3也可以)。加上当时手里有Unity2018.3的引擎源码,所以就把版本定在了Unity2018.3(不过未来可能会升级到2019,里面有分帧GC的功能我会比较感兴趣)。

版本选定之后,就开始真正的技术选型了,这里我大致罗列了一下,其中有些是框架方向,有些是工具插件,有些是设计思路。但总体还是囊括了客户端该有的技术部分。



Sproto

网络游戏,首先要考虑的是如何与服务器进行通信。作为SLG类型,对于响应速度需求并不会像FPS或者MOBA类型那么的强烈。所以就挑选了TCP的方式进行连接。然后,使用了Sproto作为协议的载体进行消息传递和RPC封装。

TCP的部分就不用过多讲解了,做网络游戏都会接触和了解。这里讲一下Sproto。但是在讲Sproto之前呢,还必须先拓展另外一个东西:skynet。

skynet是云风大神创建的开源服务器框架,使用C和Lua结合的技术搭建的基于Actor模式的引擎。这里不会拓展讲解skynet的技术细节,有兴趣的可以去看下我同事对于skynet的源码赏析。

回到刚才SProto的问题上来,Skynet本来是支持PB(proto buffer)的。但是只支持2.X的版本,并且已经不再维护了。出于优化的目的,skynet使用了一套自定义的格式Sproto。它其实是基于proto的改良,将proto里的冗余表达进行了简化,让它更满足于skynet在Lua端的性能表现。那么我们综合考虑下来也是选取了sproto的方式进行协议传输。

这其实又涉及到一个问题,Sproto其实是设计个skynet用的,但是客户端用的是Unity,开发语言是C#,肯定不能直接使用。不过没关系,我央求了服务端大佬给我们写了C#的转译工具,可以将Sproto的描述文件转为CS文件,然后再写了一套序列化和反序列化工具,呃~可以像PB一样正常序列化了。

一般客户端关心数据分为两个部分,一个部分来自于服务器端,另一个部分来自于策划配置表。现在网络端搞定了,数据表怎么办呢?对,我又去央求了我们的服务端大佬,给我们写了一个excel转Sproto的工具(过程非常复杂。。嗯先把Excel转成Lua格式,再Lua转成Sproto的描述文件,再把描述文件转为CS),这样我们的策划数据也搞定了。

GPUSkin+GPUInstance

我们的战斗场景需要显示500+的单位,每个单位携带自己独立的AI和动作。大型单位约有100面,小型约600面。那么同屏显示之后,CPU和GPU都面临巨大的性能压力。用小米5S做过一次测试,当使用skinmesh的时候,4000单位的帧率就只能到20了,换了GPUSkin方案,8000个单位仍然能够保持50帧。这部分的选型是为了解决同屏渲染压力。

ECS

与传统的面向对象的编程理念不一样,ECS(Entity-Component-System)是面向数据的编程思想。如果不理解概念的可以自己先去翻阅下资料,也可以等后面讲技术细节的时候再去了解。这里简单的类比一下帮助理解。就好比Unity的开发模式,一个GameOject可以理解为一个Entity,单独放在场景里它什么都不是。如果你给它绑定了一个Text组件,那么它马上就会变成一个Text 组件;如果绑定一个Button组件那么它就是一个Button。那么这个时候你可以理解为Unity就是一个EC的思想。至于为什么引入S的概念就是为了解决耦合和数据冗余。让一个Component里只有数据而没有方法,所有的方法都写在System。让数据在内存里的排布更加紧密,增加缓存命中率,特别善于处理大批量的数据。

同时,因为数据和系统分离,那么做回放的时候数据非常便于保存。这又符合了我们常规的逻辑和表现分离的设定,所以这套机制完美契合了我们战斗需求。配合GPUSkin和GPUInstance既优化了性能,又能实现回放和解耦,同时还会带来另外一个优势,逻辑和表现分离。

我们还做了一个大胆的尝试,将逻辑和表现分离之后,将逻辑层接入到服务器中(服务器是基于Actor的,所以扩展一个战斗服很容易),客户端则既跑逻辑又跑表现。这样带来的好处就是,只要我们给定的输入一致,因为逻辑是一套,跑出来的结果也必定一致。所以世界离线战斗的时候我们调用服务器秒算结果,PVE副本的时候,客户端展现战斗过程,非常美妙。

XLua

Lua在客户端集成的主要作用还是用来解决热更新问题的,它带来了便捷的同时当然也带来了性能问题。一般来说,Lua和C#的性能差距在40倍左右。移动开发一路走来有很多Lua相关的框架,比如toLua,uLua,slua,Xlua等。

所以有的时候就会想,有没有既可以实现热更新又能提高性能的方法,那么Xlua就是这种。开发用C#,热更新修复用XLua。当然这也不是完全免费的,取而代之的是要在开发的过程中做好各种标识,增加了开发管理难度同时包的代码段会增长很多。

说点题外话,移动游戏刚起步的阶段,除了Lua之外确实没有更好的热更新手段。所以大家才考虑将Lua接入到游戏开发中,甚至一度接管项目的整体外围开发。但是现在除了Lua之外,也还有很多其他方式可以做到热更新,比如腾讯的潘多拉。当然项目的开发过程中要使用防御性编程是肯定的,除了做好各项QA验收之外,还要对每个功能做出屏蔽入口,甚至在一些运营活动上做好模板参数,可以通过快速调节参数就能变成另外一个活动。

我们使用XLua的想法也会趋近于这个思维。平时开发都会在C#上,但是仍然会在Lua层面维护一整套的功能系统,让Lua层面有能力解决大部分的突发情况和新增需求,但是这仅仅是一个后备手段。所有一切还是以C#为主,哪怕是上线阶段用lua修了某些问题,那么再下一个版本里也会把功能修复到C#层面,并从lua层移除。

GCloud

GCloud是腾讯云产品的一种,起初是为了服务内部游戏产品所孵化出的统一平台。



国内游戏常用的游戏内语音,电台等都可以接入这个实现。另外功能还覆盖了游戏更新,区服导航,微端puffer等游戏内常用的功能设定。

这一套接入起来真真儿是极好的,为手游的几个难搞部分提供了统一化的服务,后台的操作也是极其简单,有兴趣的可以去官网了解。

Addressable Asset System

这套东西是我目前极力推荐的,它起于2018版本(预览版),在2019已经是正式版本功能,提供了一套极其强大的资源打包和加载的管理方案。

以往我们的资源打包方案都需要自己去实现,诸如在编辑器下使用编辑器接口,在实机状态下打包成bundle形式加载,然后还需要我们自己去收集和管理资源的依赖关系,维护自定义的资源列表,而这套统统帮我们做好了,并且提供了可视化的界面操作,管理资源妈妈再也不用为我费心了。

依稀记得4.x的版本,要做资源管理需要自己指定目录或者资源,然后根据是否是依赖项的方式调用打包的API。甚至如果做资源更新,你需要自己维护一份资源列表,自己自定义MD5值比对差异,如果需要告知用户下载的资源大小,你还要自己统计单个资源的大小,汇总告知玩家。

5.X的时候,资源管理做过一次大的升级,让每个资源都带有Asset Bundle标签,这样在Unity的工程目录就可以通过自定义标注资源的方式标识资源,并且在生成的每个bundle的同时为bundle生成一个manifest文件,用来标识该bundle的内容和依赖项等大概长这样:



在运行时进行资源加载的时候也是先加载这个文件查找依赖项,递归加载直至完成。比起4.x之后肯定是好了很多,但是仍然是极度的麻烦。

现在是一个这样的可视化面板,所有资源都可以通过拖拽完成,另外代码里也提供了完整的加载方案,让你在编辑器和真机的都不用关心资源格式只使用同一个接口调用就好。



收尾

选型是个很大的课题,这篇文章只讲了技术部分的方案,后面会针对各种技术细节做探讨,以及讲解项目中遇到的实际问题从什么维度去思考解决方案,但在这之前还需要先讲一下客户端的目录分布。看看一个实际的大项目是怎么在几十个人之间合作有序,各司其职的。

分享到:  QQ好友和群QQ好友和群
收藏0 支持0 反对0
分享
回复

使用道具 举报

0

主题

1207

帖子

2071

积分

华贵铂金

Rank: 4

积分
2071
沙发
发表于 2020-11-18 10:50:36 | 只看该作者
大佬不要再学了,跟不上了
回复

使用道具 举报

2

主题

1864

帖子

5681

积分

璀璨钻石

Rank: 6Rank: 6

积分
5681
板凳
发表于 2020-11-18 15:22:25 | 只看该作者
告诉我,你为何如此之屌!
回复

使用道具 举报

0

主题

1020

帖子

3535

积分

华贵铂金

Rank: 4

积分
3535
地板
发表于 2020-11-19 07:41:00 | 只看该作者

感谢楼主分享!
回复

使用道具 举报

1

主题

1435

帖子

556

积分

荣耀黄金

Rank: 3Rank: 3

积分
556
5#
发表于 2020-11-19 08:56:42 | 只看该作者
感谢楼主分享!
回复

使用道具 举报

0

主题

295

帖子

724

积分

荣耀黄金

Rank: 3Rank: 3

积分
724
6#
发表于 2020-11-19 09:07:15 | 只看该作者
我一个小美术,说话都不硬气
回复

使用道具 举报

9

主题

2358

帖子

3082

积分

华贵铂金

Rank: 4

积分
3082
7#
发表于 2020-11-19 09:11:17 | 只看该作者

我一个小美术,说话都不硬气
回复

使用道具 举报

0

主题

2886

帖子

3985

积分

华贵铂金

Rank: 4

积分
3985
8#
发表于 2020-11-19 09:24:19 | 只看该作者
感谢楼主分享!
回复

使用道具 举报

0

主题

799

帖子

2889

积分

华贵铂金

Rank: 4

积分
2889
9#
发表于 2020-11-22 11:05:52 | 只看该作者
牛逼!!一位不愿露面的美术前来捧场
回复

使用道具 举报

1

主题

1435

帖子

556

积分

荣耀黄金

Rank: 3Rank: 3

积分
556
10#
发表于 2020-11-23 08:32:22 | 只看该作者
感谢楼主分享!
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

最新信息

更多+
关闭

站长推荐上一条 /2 下一条

客服QQ:3360799237

服务时间:周一至周五9:00-20:00

邮箱:biubiuiu@sina.cn

  • 动效1群

  • 动效2群

  • 公众号

本站帖子资源均转载自互联网分享,如若不慎侵犯您的权益请联系客服我们将及时删除。

Powered by Discuz! X3.4   © 2001-2013 Comsenz Inc.biubiu游戏美术网站