查看原文
其他

Unity 2D教程 | 相机系统(上)

2016-12-26 Unity官方 Unity官方平台

相机是游戏开发的基础。在棋盘应用中展示的游戏场景,或是直接娴熟地控制3A级3D游戏的相机移动来实现电影级特效,基本上制作的所有视频游戏都会用到相机,相机的应用实际上甚至发生在“相机”的说法出现之前。


本文将阐述如何设计2D游戏的相机系统,并说明在Unity中如何实现。

从2D到2.5D:可扩展的相机系统

我们要设计的相机系统是模块化且可扩展的。基本核心由几个含有基本功能的组件构成,还有大量的组件和特效视具体情况选用。

该相机系统针对2D平台游戏,但也很容易扩展为其它类型的2D、2.5D甚至是3D游戏。



将相机功能分为两个重要组成部分:相机跟踪和相机特效。

跟踪

这里的大多数相机运动都是基于跟踪的。相机可以在游戏场景里跟随其它对象移动。我们要实现的跟踪类型是为了解决一些2D平台游戏中常见的场景,但可以扩展一些新的跟踪类型以用于特定的场景。

特效

还将实现一些非常酷的特效,例如:相机抖动,相机缩放,相机淡入淡出,和颜色叠加等。

准备工作

在Unity中新建2D项目并导入Standard Assets,特别是RobotBoy角色。下一步,创建地板并添加角色。角色加入场景后就可以走动及跳跃。然后将Camera设置为正交(Orthographic)模式(默认是Perspective透视)。



跟踪目标

下面的脚本为Main Camera添加基本的跟踪行为。脚本必须作为组件附加到场景中的Main Camera上,它会显示跟踪的目标对象字段。该脚本确保将相机的x和y坐标设置为与跟踪对象一致。这些步骤在Update函数中完成。


将层级视图中的RobotBoy角色拖拽至脚本的“Tracking Target”字段,确保相机跟踪主角。



添加offset偏移量

现在还有一处明显限制,就是角色总是位于场景中心位置。角色后方的场景过多,角色前方的视野又太窄,可能不利于游戏进程。

为了解决这个问题,在脚本上添加一些字段,定义相机与目标之间的偏移量。具体代码请参阅[阅读原文]


2个新字段赋值如下:



平滑移动

目前相机移动是比较生硬的,频繁移动的游戏环境也会导致部分玩家产生眩晕。可以利用线性插值给相机在跟踪过程中添加一些延迟来解决这个问题,新字段就是角色开始改变移动后,控制相机到达目的地的速度。具体代码请参阅[阅读原文]




阻止眩晕:锁定轴

锁定轴来防止大脑因为相机跟随角色上下抖动感到眩晕。也就是只跟踪一个轴。将跟踪代码基于不同的跟踪轴分离开来,并加入锁定标志。具体代码请参阅[阅读原文]。


路径系统

至此,我们的相机会在水平方向上追踪玩家,相机的观察区域被限制在一个屏幕的高度之内。如果玩家爬上了梯子,或者跳跃到了屏幕上方,应该让相机跟踪这些行为。这里我们使用了一种叫做路径系统(Lane System)的机制来达到这一目的。

想象如下场景:



最开始,游戏角色位于较低的路径。随着角色在区域范围内的移动,相机只会在路径指定的高度上水平移动,而路径指定的高度是可以设定的。

一旦玩家进入了另一条路径,相机就会转移到新的路径中并继续水平移动,直到再次转换路径。

在设计路径时要当心,我们不想在玩家跳跃时产生频繁的路径转换行为,这会让玩家感到困惑。如果玩家接下来会长时间地在某个区域活动,则你应该切换到这个区域。

根据设计师的需求,在不同的游戏关卡会需要不同的路径设定,甚至可能需要完全移除该系统并使用另一种相机追踪系统来替代。因此,我们需要为路径指定限制因素。

实现

一种实现思路是使用一个简单对象作为路径的载体。我们使用该对象的Y坐标轴位置与上文追踪脚本中Y坐标轴的位置来共同实现。所以无需考虑它们X和Z坐标的位置。

将路径系统(LaneSystem)类脚本与追踪类脚本一同附加到相机上,并向提供的数组中填入路径对象。同样还要为引用(Reference)字段赋值,将玩家角色对象填入其中。



LaneSystem负责根据引用的位置来处理路径之间相机的移动。这里我们再次用到了追踪速度followSpeed,对坐标进行插值处理,这可以避免在切换区域时产生过于突兀的画面切换效果。具体代码请参阅[阅读原文]


该实现并非所见即所得,因此我们将它作为练习留给读者。

锁定节点系统

现在已经有了一个不错的相机路径系统,但有时还是需要让相机锁定在场景中的某个物体上面,即游戏场景中的“兴趣点”(POI)。

我们可以在场景中配置一个这样的POI对象,并在上面添加触发器碰撞体(Trigger Collider)来达到这一目的。不管什么时候,只要玩家角色进入了触发体区域,我们就把相机的焦点放在POI上。当角色离开碰撞体区域后,我们再恢复相机的正常行为,例如跟踪。



相机追踪目标的切换通常有两种方法可以实现,一种是简单地进行切换,而另一种是使用栈系统,即将追踪模式push到栈中,再pop恢复。

实现

为了能够对POI锁定点进行配置,只需新建一个对象(可以是空对象,或者和下图一样使用Sprite),然后在该对象上添加一个大的2D圆形碰撞体,这个碰撞体可以指示出POI影响的区域,表示相机会锁定的节点。可以使用任何类型的碰撞体,这里以圆形碰撞体为例。此外再新建一个tag,例如“CameraNode”,将这个tag添加到POI对象上,这样检查起来更加方便。



在相机的追踪脚本上添加一段代码,然后将一个新的脚本添加到玩家对象上,该对象允许相机临时将关注点切换到设定好的POI节点上。具体添加代码请参阅[阅读原文]


该脚本同样还可以记住锁定之前相机的状态,这样当玩家离开触发区域时就可以让相机重新回到之前的状态。如果有需要还可以在此基础上走得更远一点,例如使用栈,不过目前本文并没有重叠多个锁定区域的需求。同样需要注意,还可以调整2D圆形碰撞体的大小,或者替换成其他任意类型的触发碰撞体来触发相机锁定,这里所讲述的仅仅是一个示例。




本期教程先到此为止,下一次我们将为大家介绍相机缩放,屏幕抖动,淡入淡出&重叠等等技巧。    


相关阅读

Unity 5.6 Beta版发布

Unity即将内置骨骼动画插件Anima2D

Unity 2D教程 | 平台游戏

Unity教程|3D无尽跑酷游戏

Unity教程|制作一款3D射击游戏


点击“阅读原文”查看所有代码!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存