https://learn.unity.com/project/john-lemon-s-haunted-jaunt-3d-beginner?language=en
勇哥推荐的教程,当时他兴致冲冲地给我展示,“看我做的游戏!”大致是说有个小人儿被困在了一间闹鬼的屋子里,他要在不被鬼发现的前提下跑出去,小人儿吓得两腿发抖,总之看起来挺厉害的。
我的第一想法是:“这个能做毕设题目吗?”勇哥说:“当然可以,这个还是很厉害的,做出来很有成就感。”“那你花了多久?”“五个小时吧。”“......还是算了,这个跟我们通信系没有关系。”
其实我自己很想试试,但是感觉没有时间不务正业。没想到后来真的有了个机会,数媒系找其他系借老师指导毕业设计,那这个题目就很合适了。
为了指导学生,我终于自己上手了。这是前话~
-------------------------------------------------------------------------------------------
做完的感觉是,用Unity Editor做一个3D游戏真的很像“搭”一个游戏。可能这就是3D和2D的区别,2D时代会一帧帧地画原画,3D时代则更多地是建一些模型组建所需的场景和故事。当然,2D游戏里可能也是用2D素材搭起来的。不过可以在这里可以先做一个略微naive的对比总结:
● 2D是图像的,而3D多了物理特性;
● 3D有光这个关键的元素。
说回这个游戏,搭这个游戏需要:●玩家操作的人物(John Lemmon);●场景(一座鬼屋的一层);●NPC(一些静止的石像怪物,一些会动的幽灵)。以上是组成这个3D游戏世界的元素,游戏制作者首先需要把它们制作出来,然后需要让它们的表象和行为符合这个游戏的逻辑,最后还需要让这个游戏有一个不错的游戏体验。好在人物、场景和NPC在教程的素材包里已经有了,我们不需要自己动手画,画这些东西可是很复杂的美术工作呀。
下面分点介绍一下用Unity Editor制作3D游戏的技术细节。
1. GameObject、Prefab、Component
话说不管是人物还是场景,在Unity Editor里都叫做GameObject,也就是组成游戏的东西。每一个GameObject又会有一些Component,比如最基本的Component是Transform,它表示跟这个GameObject形变相关的位移、旋转和缩放,这些Component共同定义了这个GameObject的表象和行为。一个GameObject还可以若干个子GameObject,比如John Lemmon是一个GameObject,它的子GameObject包括蒙皮(skinned mesh)和骨架(root),再比如Level这个GameObject是游戏场景,它有很多子GameObject,桌子、椅子、墙壁等等。
为了制作更便利,Unity有一类特殊的GameObject叫Prefab,可以理解为GameObject的模版,可以用Prefab制作一个GameObject的实例(instance),然后在这个示例上做一些个性化的修改,这样就不用从头做一个GameObject了。
游戏里还需要有一些其他的CameObject,比如:音效、失败/通关画面、用户界面、Camera、光线预处理器、出口等等所有游戏需要的东西。
为了让这些CameObject构成一个合理的游戏,还需要给他们加上合适的Component。
◆ Collider 为了处理CameObject A和CameObject B之间的碰撞,需要给他们都加上合适的Collider。比如给John Lemmon和Ghost的视线范围都套上了合适大小的胶囊型Collider(Capsule Collider),这样就可以通过两个Collider是否重叠来判断John Lemmon是不是撞到鬼了。使用Collider是一种简化物理仿真的操作,可以避免考虑John Lemmon和Ghost的手手脚脚等细节。
◆ Script Script(脚本)是一个特殊的Component,它是写给这个CameObject的一段代码(通常用C#语言来写),为了实现简单的设置实现不了的一些逻辑,比如事件(如撞鬼)的触发。一个 Script通常是一个class,其中会定义一些所需的变量和方法。其中有两个方法比较特别:Start方法是游戏开始时会执行的;Update方法是在游戏更新每一帧时都会执行的。游戏制作到后期,为了实现需要多个CameObject配合的游戏逻辑,在相应的Script中会用到一些public的变量和方法。
2. 运动:Animator和Animation
大多数情况下游戏当中都会有运动的物体。在Unity中,控制一个CameObject运动需要有一个Animator Controller,这个Controller控制着CameObject的运动状态。
而具体的运动动作Animation怎么制作,这个教程中没有教到。
值得注意的是在这个游戏里会走动的CameObject有John Lemmon和Ghost两个,它们有不同的运动导航方式。John Lemmon的运动路径是由游戏玩家控制的,在这方面Unity Engine提供了很便利的跟键盘交互的方法。Ghost作为NPC,它的运动则是由根据游戏场景生成的导航网格来导航的,导航网格可以理解为游戏的地图,可以通过写Script使Ghost在地图上的几个点之间来回运动。
3. 光:Light、Camera
对于光的操作可以说Unity 3D游戏制作的重头戏。想象一下我们已经搭好了游戏场景也设置好了游戏中的角色,可是如果没有光源,那么这个游戏就是一个黑暗世界,我们无法看到当中在发生什么。为了让玩家看到游戏场景需要两个东西:
◆ 光源 包括默认的主要光源(类似太阳的直线光源)以及灯和蜡烛等。
◆ Camera 类似电影的镜头。默认的主Camera是固定不动的,游戏中通过Unity的Cinemachine机制设置了虚拟Camera作为主Camera的分身来跟随John Lemmon。这样玩家看到的画面就仿佛是跟随在John Lemmon后脑勺上方的镜头呈现出的画面。
此外,教程中花了大量的篇幅来讲怎么对光线效果进行前期处理,使游戏画面更符合真实世界的场景以及呈现出更为恐怖的鬼屋效果,包括使用偏蓝色光、角落阴影、边缘模糊等等。毕竟3D是光线渲染的艺术嘛。
4. 声音:Audio
对于声音的设置与对于光的设置有点类似,也是需要添加声源以及声音接收器。其中声源粗略可分为背景声音(一般为2D)以及事件声音(一般为3D,如鬼飘的声音)。至于声音接收器(Listener)默认也是主Camera的Component,这款游戏当中为了符合游戏逻辑移到了John Lemmon上。
如果说对于光线的处理使游戏画面从平平无奇普普通通到有了恐怖的氛围,那加上音效则是画龙点睛了,最后真的是让这个很简单的游戏玩得我紧张到要心梗。
------------------------------------------------------------------------------------------
总结:这个教程已经准备好了全部材料包和使用说明,因此操作上是没有难度也没有坑的。教程的好处贵在带你从头到尾走了一遍Unity 3D游戏的搭建过程,让你看看游戏的各个部分是怎么回事,最后导出游戏程序并自己通关之后说真的还是蛮有成就感的。
3D引擎是光和物理的游戏,其实其中还有些地方我不明白。记一个小细节:游戏当中有一种固定的石像小怪物,如果John Lemmon被它看到了游戏就失败了。怎么判断John Lemmon是不是被它看到了呢?可以给它做一个Capsule Collider来代表它的视线范围,只要John Lemmon跟这个视线Collider碰撞了就是被它看到了。可是教程里还做了一个RayCast来判断石像跟John Lemmon之间的光线打到的是不是John Lemmon,这我就不明白了,小怪物跟John Lemmon之间的光线打到的难道不是一定是John Lemmon吗?勇哥解释说这是因为有可能John Lemmon跟石像的视线Collider碰撞了,但其实它和石像之间隔了堵墙(或者别的什么),那么石像跟John Lemmon之间的光线打到的就不是John Lemmon而是墙了。这个是没有开发经验的游戏制作者不会想到的,可见3D游戏制作当中还是有很多光和物理的细节需要推敲呀。