一、传送门特效
1、使用组件
采用Unity内置渲染管线中的Particle System制作
2、实现思路
(1)首先创建四个圆球用于特效的定位,并且采用动画效果使其分散并旋转。
(2)新建一个Particle System,将其作为上述小球的子物体,将shape改为box,并修改颜色,添加自定义材质。
(3)再新建一个Particle System,将其作为上述小球的子物体,修改同上,并且设置Start Delay、Start Speed等,增加粒子量与Emission,使其呈现出喷散效果。
(4)将 (2) (3) 组合,并复制一份到另一个小球上。
(5)再次新建Particle System,将shape改为Circle,适当减少粒子量
,同时调整Start Delay、Start Lifetime、Start Speed与Velocity over LifeTime,添加碰撞效果,增加半径,并改为从边缘发射,得到如下效果。
(6)添加底部倒影。将Emission的粒子量减小到5,Start Speed设为0,进行旋转缩放,使其贴近地面
(7)制作两侧溅射效果。将(5)处效果复制一份,对圆进行扇形裁减,扩大其 Velocity of LifeTime,使其溅射距离加大,同时添加与地面的碰撞效果。
(8)将(7)处效果复制一份,旋转180置于另一侧,将上述效果组合起来,开启后处理(Bloom效果)。同时将一开始创建的四个小球利用起来,为其添加HDR颜色,伪装成高光闪烁部分。
3、分析
共计使用了8个Particle System,总粒子数在10000左右。材质贴图为自定义制作。
可以通过不同的材质贴图对粒子数进行修改,若将图中白色部分拉长,可适当减少粒子数量。
经过测试,粒子将会显得十分细长,且颜色不好控制,即使将bloom效果开的很低,也难以分辨。
二、具体传送效果
1、组件使用情况
玩家:一个人物和摄像机移动的控制脚本
传送门:一个总控制脚本,两个传送脚本
Shader:使用屏幕空间的坐标,材质附加在传送门上
传送门:一个Cylinder模型,将其压缩,模拟一个圆形面。
2、实现思路
场景中共有三个摄像头(两个传送门)。一个玩家主摄像头,两个传送门摄像头PortalCamA 和 PortalCamB,首先新建两个Render Texture 作为两个传送门所用的摄像头的Target Texture,将PortalCamA 渲染出的Render Texture添加到传送门B上,作为主纹理。
配合上述Shader中的裁剪效果
1 | // vert |
传送门B中显示的便是PortalCamA摄像机所观察到的画面。
对另一个传送门采用同样的设置。
根据向量加减的原理,可以同玩家相对于传送门A的位置 和 传送门B的位置求出PortalCamB的位置,此时PortalCamB的观察图像就相当于玩家在另一个场景的观察图像。
1 | Yangle = player.transform.eulerAngles.y; |
为传送门添加一个碰撞体,当玩家进入到传送门A时,触发传送效果,将此时 PortalCamB 的位置和旋转角度赋值给玩家及摄像头,即可实现玩家位置的传送效果。
此处添加了一个判断,用于对摄像机进行渲染层级的裁剪,避免视角重叠情况。
1 | // camera.cullingMask &= ~(1 << x); // 关闭层x |
踩坑点:
1、玩家控制脚本使用了Character Controller组件导致
1 | other.transform.position = transPos; |
赋值后不起作用,需要在cc. move() 前面添加如下代码
1 | Physics.autoSyncTransforms = true; |
2、在使用碰撞体触发传送时,进入第一个传送门触发一次OnTriggerEnter(),然后传送到第二个传送门,触发一次来自第一个传送门的OnTriggerExit() 和来自第二个传送门的OnTriggerEnter()。