在此前腾讯互娱发布的报告中,对于VR社交表示强烈关注。VRZINC了解到,其实腾讯对VR无论是硬件、平台还是投资都有所行动。

4月24日,腾讯互娱前沿技术中心专家程序员李君白出席Unreal Open Day活动,其分享了使用UE4引擎开发Solar VR社交游戏平台的经验以及遇到的相关问题。

李君白解释了腾讯做轻社交的VR娱乐平台的原因,社交比起纯粹的VR,黏性和用户反复体验性更强。此外根据其团队长期数据统计的结果,RecRoom的周活跃用数超过其他几个VR社交应用的综合,轻娱乐是关键。

在VR社交游戏中有大量的物理交互,为了实现将服务器的代码移到服务器中,在一些小的团队服务器人员在紧张的情况下就可以不用参与游戏逻辑的开发,而是由客户端程序员去参与,李君白团队采用Unreal Delicated server同步逻辑。“使用DS server会出现这样一个问题,不能依赖于Replicate的,因为其无法保证在Clent中获取顺序。”

在交互设计相关问题上,李君白详细介绍了手势控制这块,并以互相抛接物体的设计为例进行了分享。而对于交互物体的开发,其分享了一种通过手柄按键设计,减轻用户学习成本以及内容开发移植的方法。

以下是演讲内容,VRZINC整理有删减:

李君白:我是来自腾讯前沿技术中心的李君白,做个简单的自我介绍,之前用Unreal3也有很多年头,开发过不少的游戏,加入腾讯后曾在《天涯明月刀》做自研引擎的架构开发,现在负责Solar VR社交游戏平台的开发工作。

为什么腾讯要做轻社交的VR娱乐平台?

众所周知VR是全新的领域,在VR下很多的开发领域都面临着革新和创新,我们的应用是立足于以社交平台为基础的开发定义。我们需要带给人们的是一种玩家交互之间的沉浸感和交互临场感。

社交比起纯粹的VR,黏性和用户反复体验性是非常强的。以市面上的VR游戏为例,很多都是以一次性体验的效果。其实市场中有很多社交VR的先行者,包括AltspaceVR、RecRoom,还有FaceBookSPaces。

VR的社交是完全崭新的,可以期待、有想象空间的领域。根据我们长期数据统计的结果,RecRoom的周活跃用数超过其他几个VR社交应用的综合,所以我们觉得轻娱乐是关键。

因此我们有了Solar VR的构想和尝试,在开发过程当中会对社交玩法中的某些元素进行提取,大家可以想象在这样的空间里面好友聚在一起可以打牌、唱歌、开会等等。

为什么选择UE4作为VR的渲染引擎呢?

除了其他嘉宾分享的优点,对我来说更看重的是可靠的引擎基础和高质量的渲染架构。UE4的语音质量和渲染质量在业内是领先地位。在Unreal长期的发展过程当中累计了很多可靠性非常强的工具链,无论是美术资源的支持还是程序生成过程都是非常好的,这样完善的工具链会为整个开发流程提供顺畅性和高效性

原型从Unity迁移到Unreal的注意点

首先我们的原型在Unity上实现的,后来我们决定要迁移到Unreal平台上,有很多的切换。比如说代码、数据、开发流程的切换。从Unity切换到Unreal上来用了一个星期的时间。

从代码切换有几个方面,一是把原来的服务器的代码移植到客户端,因为我们还是采用了Unreal的技术。移植过程当中最主要的问题就是第三方插件,大家可以放心,大多数第三方知名的插件在Unreal中都可以得到相应的切换。

数据可以重复使用,但场景是需要重新构建的。如果需要,可以通过Unity导出场景列表,再从Unreal中一次性导入,这取决于场景重构的工作量。

Unreal需要建立比较完善的CR持续构建体系,来保证美术和策划能够及时地得到更新的程序。

技术选型采用Unreal Delicated server同步逻辑

传统的游戏后台都会使用数据包重复、服务器写套逻辑。我们选用的是Unreal自用的Unreal Delicated server同步的逻辑,为什么这样选择呢?有几个原则。

因为是社交游戏,有大量的物理交互,我们想在服务器单独写引擎,而这个代价是很高的。因此我们想一用DS server来实现将服务器的代码移到服务器中,在一些小的团队服务器人员在紧张的情况下就可以不用参与游戏逻辑的开发,而是由客户端程序员去参与,这是优势所在。

整个过程中服务器后台也只用了一位同学做后台DS server的开发。我们使用这套系统有签权的体系。用Client端向GameServer申请迁入,会产生Generate Token ID。再进行从GS上返取回玩家数据后再往客户端发送通知的过程,将Room信息送过去。下一步将切割信息与DS对上,DS进行签证的验证后,Clinet和DS server就建立了连接。

建立这样的连接后,后面的游戏都可以直接进行通信,不用依赖于后台的任何逻辑,后台只负责登陆登出和数据库访问。后面我们还会做一些DS Messager来管理创建和销毁,这样整一套东西可以在服务器架构下完美地运作起来。

DS server使用中出现的一个坑

说到了DS server有一个坑要跟大家分享一下,我们开发过程当中会遇到很多的Replicate的问题。当我们Server想写一个代码的时候,哪怕经过了若干帧服务器想做函数代用,过程是不确定的。

另外一个例子也是一样的,哪怕是在同一帧里写两个条件,在Clent仍然无法保证A比B先得到,所以是不能依赖于Replicate的。

我们采用的解决方法是,将关键数据copy好以后,在合适的时候通过RPC的方法发出去,这样可以在服务器端拿到RPC,这个顺序就可以得到一定的保证。

VR开发应用的特性

在VR下最主要的关键因素有几个。一是基础交互的操作,这对于社交而言更加重要。因为人面对面地交流,其实每一举动包括嘴型、IK表现都是被对方仔细观察的,社交对于交互的要求比一般的游戏都要高很多。

除此之外,VR是沉浸式体验的环境,在这种环境下玩家对声音的敏感度是非常高的,所以需要对Spatial Audio3D声音的设计和实现提出更多的需求。当然VR永恒的话题就是优化,在投显设备都是要求90帧率的情况下,优化和效率永远是VR绕不开的话题,在关键上要做一些取舍。

VR交互上有很多的设计,包括手部动作的设计、交互动作延迟、手臂、脚部、角色VR移动、口形语音同步力反馈、Camera控制、手势识别这些主题非常多,对于交互也都非常重要,时间关系就两点跟大家分享一下。

手势交互的设计,举例互相抛接物体

首先是手势的识别。识别手指是否按下的状态,这种动态的辨别可以用Animation Layer + Mask合成动画过程,美术手只要提供张开和闭合的动画可以完整地模拟出来。

手与物件交互有很多种,每一种都需要我们仔细地去实现。例如我们用拳打东西的时候要考虑到伸开手的时候动作是什么样的,闭合的时候是什么样的;打出去以后和力度产生的冲击力有多大,带来了力反馈这种参数的调整;还有摇一摇功能,需要去测摇一摇的频率、力度是多少,这些交互的动作都需要我们去精细地调整。

这里给大家举一个互相抛接物体的例子。多数情况下互相抛接物体的距离是非常近的,这样网络延迟会带来非常大的影响。

通过研究我们得出结论,可以把帧同步和状态同步稍微融合一下,进行优化。手拿到东西之前,同步是通过手本身的同步来进行,当我们拿起东西和松开东西的第二阶段,可以通过状态同步。而手在拿东西的过程中物体是可以跟着手继续运动,这样的情况下本地玩家是感受不到任何延迟的,体验比较好。

将东西扔出时可以同步对象的位置和朝向,把角速度和朝向速度都同步。在最后速度比较小的时候可以把它的速度慢慢回到服务器应该的位置上,这样玩家在网络情况波动的情况下也能获得比较好的体验。

VR中交互物件开发和玩法设计

我们想在游戏中实时创建和销毁以蓝图为单位的交互物件,这样在游戏中拿出来可以直接玩的游戏设计。

然而这样的情况下面临一个问题,物件在VR中有多种多样性,对于交互来说用户的学习成本非常高。我们的设计师通过讨论得出一种方法,通过将手柄的控制器所有的AB、XY都定义成功能键,再把手柄反面的键定位为Action键,这样三种基本元素的组合形成了整个交互物件的最基础操作。

这么做有两个好处。玩家的学习成本会非常低,他们拿到物件以后试试A和B就可以知道怎么用;此外对我们迭代开发和移植非常方便。基础建立好以后我们开始了快速迭代的开发,可以让程序员并行地开发很多种原型,甚至考虑让玩家UGC创建出内容为我们的游戏增加内容,保持内容的持续性。

验证玩法,用源码开发

我们团队在比较短的时间内验证了很多的玩法,大家讨论哪一个东西比较好。比较好的情况下会投入美术资源优化,并快速推出各种原型让大家来体验。

如果团队有一定的能力能够把控源码的质量和方法,应该使用源码去进行开发,为什么?用源码以后可以做底层的优化。就像之前提到我们可以集成到游戏中去,很方便。对于一些升级来说,可以选择性地升级一些新的Unreal引擎带来的想法,这也是开源的优势。

腾讯社交组件Plugin的两个集成

最后想给大家的分享的是引擎开发当中腾讯社交组件Plugin的两个集成。一个是Apollo Voice,它是第三方语音交互的集成,大家可能不是很熟悉,《王者荣耀》的开黑语音大家应该很清楚,平台都是以这样的平台为基础,后面有专门的语音服务器来组织语音的传送和多人对话。VR社交里面声音是非常重要的一点,会提供给很多后处理的声音来处理,包括混响还有空间声音定位,Apollo Voice也是作为公司的组件。

另一个是是QQ的远程桌面共享。这个大家年轻的时候都帮妹子远程修电脑都用过,但是我们把它集成到VR中以后可以实现很多很有意思的尝试。比如说直播电竞解说、大屏看电影、多人同屏协作工作、远程开会。我们把图片、模型、文本、声音都直接从电脑里拖到VR世界中就像是从异空间拉入到VR世界中,在VR世界中产生虚拟的世界。