Unite2019

今年的Unite大会在上海, 跟17年一样在上海国际会议中心举行。时间也一样是五月的10、11、12,又一次跟母亲节重合,出差没法陪家人过节,实在惭愧。今年还是4个会场,内容满满,不停赶场实在是累,不过收获也很多,很值得。项目组今年从过完年开始一直在加班,五月抽空3天去参加会议后回来也一直加班,到现在才有空整理这次大会的内容,在此简单梳理记录一下。

《Unity 科幻巨作《异教徒》影视级技术大起底》

每年的第一场都是类似炫技的主题,今年第一场也一样。主题是Unity最新的实时渲染短片《异教徒》的技术讲解。通过这个CG短片可以感受到Unity最新的HDRP已经做得功能很强大了。皮肤、毛发、眼睛,角色专属灯光等都有非常多的细节可供调整。例如皮肤的斑点,胡渣的细节,瞳孔的底图,反射光等等。除此之外在短片中有一个类似时空穿越的效果是通过环境光切片过度来达到的,也非常炫酷,并且给我们提供了一个做效果的思路。而最新的后处理系统加入了模拟真实相机的参数,例如iso,快门时间,曝光度等等,可以让我们从另外一个维度来调我们希望的效果。

《用刚体控制角色移动的实践》

这一场分享主要讲解的是结合Unity物理引擎控制角色移动的一种思路。首先分析了目前比较常用的三种方式:1. NavMeshAgent;2. Character Controller;3. 动画位移驱动的利与弊。还提到了一个细节,在运用动画控制位移的方法中,如果update与fixupdate同时操作对象的position,而多个fixupdate穿插在两个update中时,直接操作Transform的position会不正确,应该使用RigidBody的position。最后提出了一些利用物理引擎来驱动角色移动的思路,例如利用RigidBody.velocity判断是否浮空,跳跃上升时关闭useGravity,大型角色肢体做成isKinematic从而影响小角色不不被影响,通过设置不同角度的斜面的摩擦系数从而达到不同地形是否可攀登等。不过这一套控制移动方式还是依赖物理引擎来驱动的。我们项目组目前的移动逻辑是建立在Unity的物理引擎上,但只使用了物理引擎的检测判断而不依赖其来驱动物体的,所有的移动逻辑自己实现的,并且以面向数据的形式进行了封装。之所以这样做是因为我们游戏采用帧同步模式来做实时战斗模块,Unity的物理引擎模块底层已经根据DOTS进行了重构,如果依赖引擎来驱动的话是无法保证多个客户端的一致性的。再有就是一些特殊移动规则例如漂浮,正弦曲线移动,类抛物线移动等还是要自己实现或者利用动画驱动。与其自己的代码与引擎代码混杂驱动还不如全部自己实现掌握。

《新一代后期处理栈:Post Processing v3》

与第一场类似的,还是以《异教徒》短片为例子,讲解了最新的PPS v3的功能以及各个参数如何使用,能达到什么样的效果。除了前面说到的物理镜头参数等,还有散射,屏幕扭曲等效果也是很炫酷。网上相关资料很多,就不在此重复了。

《Timeline 高阶使用方法》

Timeline在2019终于加入了打标签功能了。官方为其命名为Markers,功能就跟动画标签一样,标记某一个时刻触发某一个事件(信号),然后进行相应的逻辑处理。按理说这个需求是非常普遍的,但在之前一直都没有这样的功能,我们都是用一个PlayableObject的Start来模拟触发的。现在有了Markers后这一块可以不用写得这么纠结了。此外Marker不仅可以打在整个Timeline的时间轴上,还可以打在一个专门的Signals track上,或是打在任意其他的track上。Signals是随着Markers一齐推出的一个新概念,可以认为它是对Markers的一个封装。 Signal可以作为一个独立资源序列化到磁盘上, Timeline上打的一个Markers对应Asset上的一个Signal,然后我们自己写的脚本关心特定的Signal,从而响应这些信号执行对应的逻辑,这样做可以使Markers与对应的逻辑脚本解耦,类似观察者模式。

《基于 Unity 的 AI 和机器学习工具的行为生成研究》

首先介绍了AI目前的三大类型,第一类是Reactive AI,例如状态机,行为树等基于规则的系统,这一类的AI是最Controllability的;第二类是Deliberative AI,例如A* GOAP等基于启发式搜索的AI,这一类有一定的规则约束又有一定的自发性;第三类则是Machine Learning,这一类AI算法是完全Autonomy的。我们都知道游戏中的AI不是竞技类型的AI,不存在最优解或最智能一说。应对不同的需求就需要采用不同的算法。Unity在去年推出了MLAgent就是对第三类机器学习AI的包装,而今年要讲的新功能AIPlanner则是对第二类AI,启发式搜索的包装。运用AIPlanner我们可以设置好角色的不同状态以及对应的不同行为,这些状态组成一张搜索图,然后设置节点上的权值以及启发式函数的条件。AIPlanner系统会帮我们完成搜索,给出每个时刻对应的状态节点及执行我们设置的行为。我觉得AIPlanner相比于MLAgent更容易引入到游戏中,应用更广泛。在讲解完AIPlanner后又简单讲了一下MLAgent,内容基本就是去年那些。

《不可思议之梦蝶》从 PC 版移植到 Nintendo Switch 经验分享

这是第三方团队带来的Switch游戏开发经验分享。主要讲运用Unity开发Switch会遇到的一些问题。例如输出方面,不能用默认的Input,要根据API重定向输入,Joy-Con的5种输入方式,HD震动,加速计的使用等等。存档方面也要根据API重写IO,声音格式支持Ppus格式硬解,建议使用wwise引擎。贴图方面使用ETC2或ASTC。Switch的可用内存只有1G多,贴图一定要压缩,声音最好使用流方式读入。

《微软 Game Stack 工具和服务介绍》

这一场就是微软卖广告,不知道我为什么会选了这场,囧。一开始聊了游戏的发展趋势,从以前的单机到现在的社交,然后就讲微软在游戏的各个阶段都有什么样的产品可以帮到大家。游戏从开发到上线经历的各个阶段:开发、测试、发布、变现、监控、迭代再开发。微软对应的产品有 windows平台、XBOX平台、VS、XBOX Live、 VS APP Center、Power BI、DirectX、mixer、Azure、Havok等等等等。

《如何将游戏转为 DOTS 模式》

这一场现场演示了一遍ECS模式组织代码实现简单的功能,关于DOTS的文章非常多了,下面还有一场也是关于DOTS的,这里就不作什么记录了。

《动合批原理及如何成功合批》

合批也是个老话题了,这里又重新讲了一遍。首先讲了合批的重要性,为什么要合批,如何影响效率。然后讲了合批的四种类型:静态合批,动态合批,InstancingBatch和SRPBatch。接着详细讲解了合批过程中的细节,什么问题会打断合批,影响排序的因素有哪些, 合批的过程是怎么样的,还给出了伪代码结合讲解。相关的知识网上也很容易找到。

闪耀暖暖技术分享:2D 到 3D 的进化与创造之路

这场会议干货满满,分享了闪耀暖暖在做角色渲染上的很多亮点。在做衣服效果时他们使用的分层UV做法,既把资源大小降下来,又把衣服效果做得非常丰富。虽然会让渲染耗时高一点,但还是非常有价值。还有他们的程序化闪点,光照系统中轮廓光与阴影处理,物理系统中各个部件的碰撞处理。这些技术点都非常的实用,详细内容可以看GameRes的链接。这场分享非常有诚意,很有价值,值得细看。

《Unity C# Job System 的功能使用》

JobSystem也是这几年Unite大会年年必讲的内容了,今年还是由NewWay师兄讲。今年提出了一个新理念就是如何判断Android机器的多核中有多少个是大核,多少个是小核,然后根据这些数据来决定我们应该开多少个Job能最大化的利用计算力而又不跟Unity竞争资源。还讲了两个新功能,一个是
JobHandle.ScheduleBatchedJobs,能够将多个小任务合并在一起后一次性Schedule出去执行,避免频繁的唤醒,从而提高效率。第二个是
JobHandle.Complete,能够等待某个Job完成后再执行后续的逻辑。此外还提到了Job内使用内存的一些要点,例如不要使用托管内存,所有变量默认都是struct,传参时要考虑按值复制是否合理,是否要用引用等。最后提到了如何调试多Job的程序,Unity Profiler已经支持了,Android Systrace 与 IOS的XCode TimeProfiler也是很好的选择。

游戏架构和云服务的耦合前瞻 —— 匹配对战和连续大世界

这是腾讯云带来的分享,当然少不了腾讯云的广告,但其中有两个技术点对我们游戏很有帮助。一个是多人对战的匹配可以考虑就近选择玩家,尽量让华南的玩家与华南的玩家匹配然后让他们去华南的节点上对战。我们游戏是跨服匹配的,匹配人数够的情况下,这样的策略可以让玩家降低延迟得到更好的游戏体验。另外一个点是连续大世界中,如果夸区域之间想无缝切换,而这两个区域又是由两台独立计算机处理的情况下,怎么解决边界问题。方法是两个区域要有适当的重合区域,然后在重合区域内双方共享数据,但通过距离约定好数据的修改权在哪一方,这样双方都有过度区域的数据,逻辑能照常进行,而又不会有数据不一致的问题。

《Timeline 高级应用案例解析》

这个分享的内容跟前面Timeline高阶使用方法比较相似。不过这场是直接摆出一个Demo对着讲解的。里面有一个新功能点是通过自定义跳转来实现不同剧情的播放。我们以前不同剧情的做法是切分开不同的Timeline然后代码控制接下来播哪一个,现在有了这个功能后可以把所有剧情做到一个Timeline内,比较方便。还有一个新的点是在Timeline中加入数值,然后再加入一些逻辑代码从而让Timeline能够根据当前的环境(数据)来播不同的剧情。

《用 Unity 开发高视觉保真度的安卓游戏》

这场是三星的讲座,主要是介绍三星提供的SDK以及如何运用这些SDK做性能优化。接入他们的Adaptive Performance后,可以通过接口得到当前手机的温度、CPU时间、GPU时间等信息。还能动态调整CPU、GPU的频率。有了这些接口及信息以后,我们可以动态的调整游戏的优化策略。例如温度高或者GPU时间高时,降低渲染效果,采用LOD的资源从而降低负荷,保证游戏流畅。或者是限制CPU、GPU频率,让手机耗电及发热降低。另外三星手机的上还有一个很强大的工具GPUWatch,它可以实时观察及统计到当前手机的GPU信息,对于真机调试有很大帮助。

《Unity 的 Asset 管理和序列化》

这场是官方的分享,讲解的内容就是各种资源在Asset内是如何存放及管理的。有非常多的细节,深入到每种资源是怎么序列化到磁盘的,还有他们对应的meta文件都记录了哪些信息、GUID和FileID的区别,分别都有什么作用、导入资源时都做了什么处理、Library内都放了什么以及怎么跟我们的资源对应起来、Mesh如何压缩,不同方式的优点缺点等等。还介绍了一个比较有用的工具binary2text。这是Unity自带的,可以把metadata内的二进制数据还原成text的工具。资源少时meta可以采用text的形式处理,但资源变多后text的meta导入非常慢,必须要是二进制的。但如果meta是二进制的话有些资源想做工具检查meta又获取不到信息,通过这个工具就能解决这个问题。

《适用于开放世界的遮挡剔除流式加载》

首先讲解了什么是OC以及现在比较普及的OC方案,接着讲解了Unity目前的OC做法和这套的不足。然后重点讲解的就是Unity接下来会推出的新的OC方案——基于流式加载的OC。新的这套OC是基于网格的,在进入新区域时会异步加载流式的网格数据而不是整个模型或地形,然后在工作线程中与当前区域完成合并,再提交到主线程进行下一次剔除计算。这样做不仅内存能降低很多,并且对运行时的效率也有提升。除此之外,新的OC还支持多相机和动态加载的Prefab,这些对大世界类型的游戏有非常大的提升。

《深入理解 DOTS 核心概念及实践》

还是DOTS,相关的文章非常多,最重要还是靠实践,找出适合自己项目的方式,略过了。

《一步解决 Unity 游戏新安全风险》

腾讯与Unity合作推出的UPS(Unity Protect Solution),可以说是广大游戏开发团队的福音。我从11年做端游的时候开始就一直陆续面对和处理过各种各样的游戏安全方面的问题。说真的这些问题跟游戏开发没什么关系,但外挂却困扰每个开发团队。同时客户端安全是一个细分领域相当专业的问题,让做游戏开发的团队人员来面对处理这些问题真的吃力不讨好。外挂实在是国内游戏游戏开发界的痛点。市面上虽然也有一些提供游戏安全服务的第三方公司,但貌似效果一直不理想。UPS对于Mono的编译方式还是IL2CPP的编译方式都提供了加密、混淆功能,并且采用随机加密,每次加密结果都不一样,让游戏的安全性有一个较大的提升。另外这个功能直接集成在Unity中,只需要我们打包的时候勾选Security-Build就可以了,非常简便。不过要注意的两点是:1.目前也还没有Release计划,不知道什么时候能用到;2.UPS这套是对代码加密保护,防止反编译的。但对于扫描内存这类外挂还是无能为力,这方面的问题依然存在。不过无论如何都希望能赶紧用上这功能,从一定程度上减少外挂问题。

这次大会的众多主题中,AIPlanner、DOTS、LWRP、PPSv3这些新功能是我们要持续跟进学习的,希望在后面的新项目中运用上。而Timeline高级功能、优化相关的知识以及匹配对战的新思路则是对我们现有项目有很大帮助的,应该要抓紧落实到现在的项目中。新的OC、UPS等即将推出的新功能则非常吸引,希望能赶紧在新版本中用上,从而做出更好的游戏。

Bookmark the permalink.

Comments are closed.