本文由参与GGJ 2017的游戏开发者Ciro Continisio为大家分享他与美术设计师Jana Kilianová组成的二人团队,在48小时内开发出小游戏《Splash Clash》的过程与经验。
Global Game Jam(GGJ) 2017已于1月22日落幕。全球共有三万多游戏开发者在700多个不同的城市参与了为期三天的游戏创作活动,围绕着今年的主题“Waves”制作了7000款游戏。

《Splash Clash》就是其中一款优秀的游戏。这款可以被轻松掌握的双人对战游戏由两个像素角色通过跳跃产生波浪,借助波浪将对手推出平台。下面我们从波浪特效、物理、场景设置和粒子这几个方面一起来看看开发者是如何在48小时内将它开发出来的。

波浪特效
一开始我们希望实现较为炫酷且逼真的水特效,但是不愿用一些按圆圈扩散的3D物体或粒子来模拟波浪效果。最终的方案是为Displacement着色器使用一张圆的纹理,这样就可以从表面(Plane)产生波浪,对这个圆的纹理进行缩放,就可以实现动态的波浪。需要说明的一点是:本文分享的是如何在GGJ中快速实现这样的效果,并非介绍实现该效果的最佳方案。可能还会有性能更高的解决方案。

初步模拟
在开始制作前,我们先在Photoshop中绘制了圆形纹理并利用网上找到的角色,例如下图的蝙蝠侠,进行了初步模拟。

011221ikzcg5cw4nwczc48.jpg

我们在Unity Manual中找到了简单易用的位移(Displacement)着色器,它还支持曲面细分(Tessellation),这样就不用担心一些几何问题了。将该着色器用于水材质后效果如下:
011221wa4tizp8zi4kn844.jpg

如上图所示,Tessellation数值已被设为最大值,它用于控制表面被细分的次数。下面的Displacement滑动条则用于控制波浪凸起的高度。

可行性分析
初步模拟过后,首先要确认该想法的可行性。因此,我们创建了纯色并含有透明通道的圆形纹理,并通过函数将其固定在不透明纹理上。将其作为位移贴图后的效果如下:
011222wtaptt6az39xtpq8.jpg
多个静止圆形

我们必须合成多个透明的圆形来实现表面上移动的多个波浪。如上图所示,目前这些圆形纹理的分辨率相当高,基本都是256 x 256的。

由于波浪是独立的,所以每帧都必须删除整个纹理再重新计算缩放的圆形。动态效果如下:
011227pcwhcifcf5pwwx6p.jpg

一旦碰撞器与某个角色发生碰撞(OnTriggerEnter),就检测角色的Y坐标是否低于某个固定的阈值,该阈值与波浪强度相关,是随时间减小的浮点数。如果是低于这个固定的阈值,则角色被Rigidbody上添加的力推开,这个力的大小也同样与波浪强度成比例关系。

我们使用标签(Tag)对碰撞器进行过滤,保证玩家1产生的波浪仅与玩家2碰撞,反之亦然。这里稍微提一下Drag,用纯物理方法对角色添加外力(AddForce)使其快速加速时,通常会使用Drag方法进行平衡以防止角色漂移。但添加太多Drag会让角色在跳跃时降落缓慢,从而产生一些奇怪的漂浮物理效果。

我们在此例中实现了个伪Drag,但仅将Rigidbody速度的x与z分量乘以一个随机因子,不动y分量(重力):
[C#] 纯文本查看 复制代码rb.velocity = new Vector3(rb.velocity.x * .8f, rb.velocity.y, rb.velocity.z * .8f);
场景设置
从下图中可以看出,这个游戏是2D与3D混合的,角色是沿X轴旋转30度的Sprite,以适配相机旋转,场景下方掉落的水滴与岩石也同样旋转。盛水的圆盘是游戏中唯一货真价实的3D对象,因为要用它来实现复杂而逼真的波浪。

012434nb448ox5584xkd4v.png
原文链接:https://blogs.unity3d.com/cn/2017/02/02/ggj-splash-clash-post-mortem/
原文作者:Ciro Continisio
转载请注明来源:Unity官方中文社区(forum.china.unity3d.com)。请勿私自更改任何版权说明信息。
GGJ, 游戏, 开发, 经验分享锐亚教育

锐亚教育 锐亚科技 unity unity教程