本文章为从构思到落地,较为详细的效果实现思路,因此会比较啰嗦。
可以先看视频,对感兴趣的部分选择性阅读。
实现思路视频:
正文:
1. 确定需求:
游戏中的“车厢”被设定为玩家进行快速移动,以及整理信息的空间。
玩家需要能够随时随地回到“车厢”中,并利用“车厢”在各处的传送点“车站信标”之间移动。
在其移动回“车厢”的过程中,需要有一个酷炫的效果将“车厢”场景与当前场景联系起来。
整理一下大概是这样的流程:
- 玩家选择“返回车厢”的选项
- “车厢”在玩家面前有一个“凭空出现”的效果,角色进入车厢
- 场景切换到车厢场景
2. 思考效果实现:
1. 结合车厢的性质,应该做一个“车辆到站”的效果
→ 效果固定,可以使用动画K帧的方式。
2. 考虑合理性,车厢本身给人的观感应该是“虚幻”与“超现实”的,在游戏设定中也是如此。
→ 配色与材质表现突出虚幻感,不需要做太真实的表现
3. 考虑要兼容各种场景,“凭空出现”的感觉应该怎么表现?
→ 本来车厢就是一个比较超现实的存在,不用太考虑符合真实逻辑
→ 从中心溶解出来可能是比较好的选择
那么,基本的实现方式就是动画K帧+材质Shader表现。不太需要粒子特效。
动画部分很简单,略过不提。
我们的材质Shader需要做下面的工作:
- 能够体现“虚幻”与“超现实”的调色
- 在动画播放的同时,“从某个固定点中心溶解出现”的效果。这一效果的位置不能受到动画的影响
3. Shader的核心思路:
1. VertexPosition不受骨骼变形的影响
→ 即使骨骼的位置与缩放变化了,VertexPosition也可以作为一个稳定不变的标尺
例如上图所展示的:将VertexPos直接以颜色的方式画出来,之后手动移动骨骼的位置。
可以看出,VertexPos的颜色始终不变,不会随着骨骼位置的移动而变化。
2. 基于VertexPosition的蒙版区域
→ 以某个固定的点为中心做一个圆形蒙版(Distance),可以用来Lerp各种效果
→ 因为VertexPosition不受骨骼变形的影响,所以其位置可以被确定下来,不会随着骨骼动画而移动。这就可以做一些文章
4. 制作过程拆解:
1. 首先进行骨骼绑定,之后一起导入Unity引擎
每个需要移动的部分绑一块骨头就好。我使用的是Blender,总之要保证各部分的骨骼能够自由移动。
注意:只有在骨骼位移时,才会有移动但是不影响VertexPosition的性质。 绑骨骼这一步是必须的,不能直接动画控制Object的位置。
2. 材质Shader制作:
调色:
全局光Diffuse + Matcap + 边缘光
Diffuse提供立体感,Matcap与边缘光营造虚幻,不真实的效果
基于VertexPosition划出圆柱区域,并将其作为Mask剔除透明度
发现边缘太生硬 → 使用SphereMask混合UV采样噪声来溶解边缘
题外话: 一个比较常用的纯视觉思路:渐变 → 采样 换句话说,在做材质效果时,如果发现某个量是连续变化的,那么就可以考虑:如果用这个量直接/混合UV采一张图,会出现什么样的效果? 最基础的:uv坐标是U向与V向两个方向的连续变化的量,直接采贴图 然后:Position也是连续变化(渐变)的,那么它自然也可以用来采贴图。 三面映射等效果的基本思路就是这样。 然后:如果我采了一张有渐变的噪声,这个渐变是不是也可以用来混合UV采个图? 各种Distort效果基本使用的是这个思路。 当然,这一思路是纯粹考虑视觉效果表现而言的。该交给数学计算的地方还是要交给数学,否则有些效果就是不精确的,看起来就不对。 采图的时候也要注意Remap与Clamp,保证用来采样的量在01范围内。不然也可能会出问题。
3. 效果动画:
Unity动画K骨骼位置与对应的材质参数。
提前分好分多个材质的话,可以控制溶解出现的节奏。
例如图中就通过动画控制了铁轨部分先出现,列车部分后出现。会更有节奏感一些。
4. 触发效果:
脚本只控制动画器Trigger触发,视觉表现的逻辑完全在动画中进行调整,比较符合MVC的思路。
大致思路就是这样。有相关的意见与建议的话,也请尽管提出。
效果真棒