Unity游戏原型快速开发案例剖析 -- Unite2017 杨栋分享
关于Unite
Unite大会是由Unity举办的全球开发者大会,至今已有10年的历史。Unite现已成为游戏行业,VR/AR行业中最具有权威性和影响力的活动。
今天的主题是Unity游戏原型快速开发实践,我的题目和前面几位同事稍微有点差别,他们会讲非常技术的包括数学公式,非常地干货。我这边主要是想讲一下我过去做过的一个项目,我觉得这个项目因为整个是在Unity里面做的,也是做了很多的尝试,用了很多的工具。我觉得把这整个项目剖析一下,分享给大家,希望对大家有所帮助。
目前我负责我们大中华区的讲师团队,待会儿会跟大家大概地介绍一下我们的团队,这个是放在最后。另外一块的业务是跟第三方的合作平台,比如说小米,我们有对小米平台有支持。小米平台对于我们国内开发者来说是一个非常好的一个游戏的发布平台。我们Unity做的事情包括2017.1要发布的平台是直接在安卓平台下面的。
一、为什么要制作游戏原型?
当然在座的大部分是游戏开发者,可能多多少少甚至是自己整个完成过游戏制作。大家知道做游戏原型其实对我们游戏设计是一个非常重要的过程,因为你要知道你不可能花非常多的时间和精力一下子就去做一个可能是策划或者是老板说我要做这么一个类型的游戏,我们肯定要做一些原型包括寻找我们需要用到什么样的技术,需要什么样的玩法,什么样的玩法是吸引人的。我想给大家过一下这方面的内容,当然游戏原型开发形式非常多样,可能有些时候你有一个想法,用纸和笔就能把游戏原型实现出来。当然游戏原型是可以玩的,直接在里面改素材,实现自己不一样的想法。
第一个当然是验证技术的可行性,包括你要用的引擎,你要用的技术,包括AI,你直接可以做出简单的版本出来。第二个核心玩法的试验,大家知道你玩一款游戏肯定会有核心玩法,核心玩法是真正吸引玩家去玩你游戏的东西。如果只是纸上谈兵,没有办法做任何的测试,所以游戏原型可以支持你做小规模的测试,不管是内部还是外部的。第三点是可以从一堆原型里面挑出最好的玩法和原型。大家知道GameJam这种游戏每年都会有,我们去年同事就去参加了,非常地有趣,就是48小时内做出一个可玩的游戏。我们看一个具体的例子,大家知道现在最火的一款游戏GDC,其实它最开始的原形是这个样子。它这个音频是日文的,我就不放出来了。之前是2D的,但是这个是相对应的是3D最后的场景。它用一个非常简单的2D的游戏就可以快速地实验自己的数值设计、AI这方面。而不需要去花很多的精力和时间去做具体的三维模型就出来了。
另外一个例子是我们很熟悉的SUPERCELL,它最火的几款游戏,做到目前有四款游戏,但是利润非常地高。实际上有一个游戏是像CLASH royale,这款游戏在做之前做了十个原型,这十个原型他们淘汰掉七个,剩下三个。然后做试运营,试运营的过程中又淘汰了两个,最后留下了这个SLASH CLANS这个游戏。你要获得一个精品游戏,让玩家可以玩下去,经济收益有很大的话,你可以做游戏原型。
二、游戏开发制作团队
第二个我们说一下可能我们很多游戏公司有好几种工种组成,首先你要有策划,当然你有程序员、美术可能有专门做音乐的。最后可能剩老板,老板他可能只是商务方面的,他其实并不懂怎么开发代码,但是他知道市场需要一些什么,或者是他就是很有钱。OK,有这么多人,谁来做这个游戏原型呢?实际上理论上来讲任何人都可以作游戏原型,只要你会使用工具。当然咱们说游戏策划的话可能是有最多想法的,他知道他设计的系统是什么,玩法是什么,数值是什么,关卡是什么。他可以和我们程序和我们的美术,和我们的音乐,当然我们的老板,一起沟通去做这个原型。因为如果一个工具好用的话比如说他熟悉使用Unity,他就可以使用这个工具,让程序员、美术来配合他。因为策划一个游戏最重要的能力实际上并不是说他的想法有多新奇,或者数量有多少,其实说到底,他是一个沟通能力。程序员、美术、老板这些人他们都有自己的想法,如果他沟通能力很强,能够把他的想法给沟通到这些人,让大家形成一股合力,这是最强的。大家知道游戏想法,在座的几百个人可能每个人都有几十个很稀奇的想法,但是你怎么把它沟通出来,怎么样让大家配合你完成。
三、怎么来具体做这个游戏原型
我们现在知道可能哪些人会来做,我们怎么样来做这个游戏原型。首先刚才提到了我们可以用纸和笔,很简单,而且速度也非常地快。但是可能你沟通的效率也不是那么高,因为人家可能没办法理解你这个想法。当然第二点比较偷懒的想法,asset store里面有很多模板。像FPS都有,你可以拿来套用,这是一个可以快速出原型的方法,当然成本也不高。但是更多的情况下,可能我们是程序员,我们有现成的代码,现成的素材,直接用这些快速做一个原型出来。这个方式就是我接下去要跟大家说的我之前做过这款原型的方式。
实际项目解析,我主要是想讲这一块。实际项目解析,实际上这个项目是我跟我其他三个朋友在我加入Unity之前,我是去年3月份加入Unity的。就是一年之前,我们花了大概一个月的时间,我们几个人业余时间做的,因为他们也在别的公司里面上班。他们也有这个想法,想把这个故事做出来。他们是美术设计感非常强的人,所以他们做了一个也是视频给我,他们希望我去用Unity这个工具把视频里主要的几个功能点做出来。我先给大家看一个视频,他们到底要做什么。
(视频播放)。
这个是我们最初的一个稿子,就是第一版,很粗糙的人物设计。然后这是最终版的人物设计。这个是最开始他们做的影视视频,打击感是什么样的。包括这个应该是第二版的第二个场景。这是最终版他们想实现的一个效果。当然最后我们实现的不是完全跟这个相象的,但是我们是想研究哪些技术可行性,用什么样的方式可以快速去做这些人物,去做这些动画的六连击。之后会给大家详细解释一下。
这个技术游戏原型的目标其实之前我朋友这个团队他们是用cocos2D来实现的,它实际上从编辑器来讲,操作起来会比较麻烦。他们想尝试用Unity来开发这款2D的游戏。他们想实现的具体功能我全列在这里了。首先是我们背景视差滚动这个功能,当然这个功能比较简单。我会说一下怎么做。然后是解决Flash素材导入的Unity问题。第三个是主角的连击操作,在Unity里面怎么去实践它。第四个是找到一个合适的系统做一些简单的AI,第五个是触屏的滑动操作,让你可以有更高的灵活性。然后是解决碰撞物体在正确的时间出现的正确的位置上的问题。你要在正确的时间点去播放你的打击的效果,实际上是要做一些工作的,我会解释一下怎么解决的。最后就是粒子效果,这个比较简单,用一些素材就可以。
大概讲一下每一个功能点是怎么解决的?像视差滚动在我们的2D的平台上,Unity的官方项目上就有现成的脚本可以用,直接找到那个地方,放到相机上和相关的背景的上面。然后关联那几层素材背景就可以。因为现成的东西本来就有就不用花时间自己再去写。如果你想证明自己技术的话,没有问题,你可以自己写一个。
第二点解决Flash素材导入Unity的问题,我找了一个GAF Pro插件,我做了比较以后,看了用户反馈,决定用这个。包括给这个团队写了一个信,问他们性能上还有具体的问题,才决定用这个工具。
第三点是主角连击操作,一开始的时候,我们想写一堆代码来控制这些触屏,其实我想到达的效果是我按住按纽,每个按纽点击之间是0.3毫秒之内,就出下一招,一直出到第六招。如果下一次点击超过了0.3毫秒,我就直接回到待机状态。逻辑非常简单,虽然这个逻辑很简单,但是你要做成六连招,我相信代码是绝对可以写出来的。但是当时我是选择了用了PlayMaker来做这个连击的操作。
它有非常多的动作,大家可以看到这个长列表,你要写代码也是一样的,来对应每一个动作。但是它的好处是它都写好了,你只要把节点关联起来就可以了。这就是快速开发的优点。另外一个万一你找到相关的动作,它有一个按纽,再装另外几个文件进来,它有一个动作的搜索引擎,可以把开发者们贡献出来的这些脚本直接放在这里,你可以搜出来,直接导入到Unity里面去使用。当然这些代码它全部都是开源的。
触摸屏的操作我用了这个插件,EasyTouch 5,只要通过简单的脚本实现就可以了。我会解释一下它是怎么和PlayMaker做交互。另外是在解决这个碰撞体在正确时间出现在正确位置上的问题。大家知道我刚才播的动画,其实像这样的解释有一点困难,我直接打开那个工程。在这个项目里面,假设我把这个素材全部导入进来了,我后面的背景全设置好了,然后我可以做六连击,然后把它打倒,或者说我只有一个操作,或者可以出大招或者可以做跳跃。像这种操作,先来看到我挡住他这个球的时候,我要知道我是打中了他的肚子,但是Unity并不知道它肚子在哪里,它只是一张图片,并不像3D,就是一张长方形的图片。那么一个解决方法用到的是跟美术商量,就是说你去攻击他的时候,我要知道这个拳是什么时候打出去的。比如说我们看一下这个主角,它的插件导入进来之后,你可以调你的帧。比如说我这拳打出去是这个样子,在这个点的时候,我可以在这个点放一个。如果碰到僵尸的话就应该播放这个动画。如果就加在这个上面,一直不去管它,很多时候你会朋到敌人,这样就一直播放那个效果,也不是我们想要的。所以跟美术商量是做了不同攻击时段的节点。这一拳打出去的时候,在这个地方,就是攻击判定点,我知道他这只手是生成这个样子的,在这个地方我们可以给它加一个视线。这个视线我们可以做到,当你进到collider的时候,我们知道它是什么时候进去的。如果停留在那一个动作的时候,我们也知道。如果它结束的时候我们也知道。其实这样的话就很简单了,我们在进入这个动画节点的时候,我们就去把这个拳头上的collider打开,当然这个方法比较原始,但是也是可以工作的。可能会有在座的朋友会有更好的方式,但是这种方法可以解决这个问题。如果我出这个state,我就把collide关掉。这样的话,只有我在需要的时候它这个碰撞体才会生效。
回到PPT,这个是我们刚刚的脚本。粒子效果很简单,就是用了一些asset store里面的素材。具体开发步骤,刚才讲的是我想实现的点。接下来具体的步骤是怎么样子的,包括从导入素材到连接,会给大家过一下。
首先我们的素材是在Flash里面,比如我拿一个我们的主角的素材出来,我们设计师设计的时候,他把它所有的这些动画全部都做好了。然后Flash里面有很多attack,这些很直观,然后调起来也方便。比如说我这个受击的时候不想要这个动作,想再往后延0.5秒,往后改一下就可以了。然后改好以后就丢给我了,然后到Unity引擎里面去,我们主角可以E-sport出来。比如说我把它随便放在一个文件夹里面,我们打开GAF,它会生成两个文件。这边可以预览这些动画,确保是跟你的Flash里面是一模一样的。他给我们声称是一个Zip文件,里面有两个文件。它包含了主角的动画,哪一段动画是应该用哪几张图片,是怎么摆放的,位置信息都在里面。然后还有一个是图片,这个不是很好,没有充分考虑到把手和脚都分开,导致转换器去转换的时候,要切得很乱。给大家看一个比较好的例子,是另外一个角色。就是怪物的角色是一个比较好的例子,我给也它导出一下。这个角色如果泥你把它给converter一下,这个动画都是一样的。它都能显示所有动画,但是它的贴图就会很小,因为它是手脚都给你分开了,所以贴图非常地小。但是其实它效果并不比英雄的效果差。所以这个要看你的设计师怎么去设计,可能这个主角设计的时候并没有考虑那么多,只是按照他自己的想法这么做。到了怪物的时候,他就想到我要分开这些肢体。
有了这两个文件以后,其实就非常地简单了,比如说我到Unity里面找一个文件夹,然后我把这两个文件就是monster直接给放到这里,然后会做导入。导入以后,它会有一个素材在这边,大家看到它有非常多属性和按纽,你要做的就是生成一个可以用的这么一个东西,它会把你所有的attack全部转换,包括像这个里面放了非常多的jeger包括你要的动作,怎么去触发这些动作。你可以把单独的一招里面分成好几招,你可以把它分开来,这样比较整洁。当然这个例子看起来比较干净,不是很乱,一目了然。但是有一个不好的例子,给大家看一下是我们那个怪物。实际上它是不那么好的例子。其实像这种节点,你导入这块可以去做连击,我们可以看到FSM是怎么做的。大家看到我主角下面放了几个脚本,还有一堆的FSM。这个是什么意思呢?就是说我要给这个角色赋予,我要控制他的角色,包括他的奔跑包括他的打击,包括他受击的状态。比如说这个attack用了这些节点,看上去很复杂,实际上他的逻辑非常地简单。因为要做六连击的动作,首先我要看是不是要做动画的过渡,其次要确保它已经到了角色的待机状态。看是不是在第一拳那里,如果不在第一拳那里,要确保它已经回到了第一拳那里。这些判断实际上都是在判断它是否已经回到了原来的状态。包括我用EasyTouch那个脚本,要去判断它有没有点击到。这个就是一招、两招、三招、四招、五招到最后第六招。当然这个看起来比较复杂,但是实际上从开发的角度来讲,比如说你写的一个代码,我不喜欢你打出去那一招之间的间隔,或者是那一招它的间隔太大。实际上代码它要依赖于程序员去修改这个参数。如果打比方说,你的策划是可以用这个playmaker的,所以调整很简单。程序员可能会有一点看不起这个,但是对策划来说是非常友好的。而且你快速做原型是非常好的一个工具。
我稍微说一下我们这个脚本。其实player control里面,它就像一个空壳一样,去调用Playmaker里面的。如果你没有编程的经验的话,或者你不想用,因为我本身是一个程序员,所以这样写起来比较简单一点。看一下PPT,应该都已经覆盖了。我想说的内容都已经覆盖得差不多了。
最后我想给大家看一下的是C#脚本用于控制碰撞测试,用于具体的逻辑还有角色移动这些。AnimationEvent用于与Playmaker交互。具体他们之间的关联,我搞了一张图,大家可以看一下,最左边的脚本,实际上你完全可以拿Playmaker来处理,他们之间的关系是这样子的。另外,因为我们讲师团队很多时候会发一些教程,我们的活动会直接放在我们的官微和社区上。我们是3月份开始做的Unity中国技术路演,我们三位讲师已经去了八个城市,去深圳、厦门、广州跟香港还有4月份去了西安、北京、成都、重庆,下半年也会去更多其他的城市做这些技术演讲。这些活动都是免费的,欢迎大家来参加!