知乎专栏:游戏开发入门指南——Unity+
/gdguide
大家好。
接下来的两篇内容,是用Unity来做传送门的效果。这里是用自己的方法来做的,中途踩了许多坑不过最终还是实现了。下面是效果图:
本篇文章几乎没有代码。主要是介绍一下实现的原理。
不看code的感觉是不是很爽
先不说如何打开传送门以及如何在传送门中穿梭的问题,我们先来看看摄像机是怎样将场景及主角从另一个角度渲染进门里面的。
在现实生活中,如果把眼睛比作主摄像机,人的眼睛是不能直接看见自己的侧面的,如果一定要看则会用另外的摄像头从侧面对自己进行拍摄,再吧显示器材放在视线范围内,这样就能实时的去观察自己的侧面了。同样的道理,要达到上图中的效果,一个摄像机是肯定不够的,需要其它的摄像机来辅助。
来看看我们的场景,场景很简单,就是一个墙面的地面组成的,当传送门打开时,就让该处的墙暂时禁用:
让主摄像机作为主角的眼睛始终跟随主角移动,如果主摄像机从传送门看出去,门里其实是什么都没有的:
那么这段“空白”就需要填补,刚才我们提到了其它的摄像机,就是用来填补这个空白的。
在效果展示中,主角从橙色门中由内而外看出去,是和辅助摄像机从蓝色门由外到内看进来的画面是一样的:
所以只要将辅助摄像机看到的画面拿来填补主摄像机的空缺就可以了,二手手机转让前提是主摄像机的渲染层级更高,我们对主摄像机的属性进行设置:
但是要真正的无缝衔接则对摄像机的位置关系有一定的要求,也就是说主摄像机与橙色门的位置关系同辅助摄像机与蓝色门的位置关系必须是一致的:
要让辅助摄像机的位置同步,我们可以创建一个空物体,取名叫Substitute,让它成为橙色门的子物体,再创建一个辅助摄像机,取名Camera_1,的视锥范围要和主摄像机一样,但渲染层级较低,将Camera_1作为蓝色门的子物体:
注意这里为了方便理解使用了中文,在实际开发中请避免使用中文命名。
通过代码让Substitute实时获取主摄像机的世界坐标的位置与旋转,再将本地坐标赋给Camera_1,这样辅助摄像机与蓝色门的位置和主角与橙色门的位置就会保持同步:
//获取主摄像机世界位置和旋转substitute.position=mainCamera.position;substitute.rotation=mainCamera.rotation;//将本地位置和旋转赋给辅助摄像机camera_1.localPosition=substitute.localPosition;camera_1.localRotation=substitute.localRotation;复制代码
同样的方法,再创建一个替身和辅助摄像机,也可以用来渲染蓝色门内的场景:
第三层空间的渲染
如果把主场景成为第一层空间,传送门看进去的是第二层,那么上图中红框内渲染的就是第三层。做到第三层空间的渲染,其实还是和渲染第二层一样的原理,创建渲染第三层空间的辅助摄像机Camera_2:
Camera_1与橙色门的位置关系,就是Camera_2与蓝色门的位置关系。 同样颜色的线代表相同的位置关系
同样的方法,将第三层的另一个摄像机也创建好,我们来看三层空间的效果展示:
这样就保持着三层空间的渲染,当然也可以再继续往下发展,除第一层空间外,每层都需要两个摄像机,方法都是一样,越往下层的摄像机渲染层级越低,例如主摄像机的层级为0,那么第二层空间的两个摄像机分别为-1和-2,第三层为-3和-4,且最低的摄像机的ClearFlags选项要设为Skybox或者SolidColor,其它所有摄像机都设置为Depth only。
层级最低的摄像机
而每个辅助摄像机都需要一个Substitute来帮助定位,如果要渲染三层空间,就一共需要四个Substitute(四个辅助摄像机)。
本期文章内容不多,主要是介绍了传送门的制作原理。当大家理解之后,在下一期中将会正式介绍物体在门中穿梭的实现方法,届时会少不了代码,并且同时会介绍过程中会遇到的许多坑。
每个坑都是一行泪