[Unity Demo]从零开始制作空洞骑士第三集之导入插件2D toolkit和使用playmaker制作敌人状态机以及扩展FSM脚本
当你看到我这段字的时候,说明我正在火车上用手机打字,因为我要回家过中秋了但我没带电脑。但我记忆又贼差,乘着我还记得我前几个小时都干了什么我先把记得的内容都写到这里,等过两天回去了我再把代码贴出来。
首先还是感谢你坚持到第三期,因为前期的准备工作还是挺混乱的 ,你能全部看懂前两期真的是神人了,请注意本期内容并不会比前面的简单!
为什么需要使用2D Toolkit?
当你看到这几个字时,你可能都不知道这是一个插件,没关系我一开始也不知道,因为它好像已经不支持新的更新了,基本上销声匿迹了。
要用它的原因是:首先我们的playmaker可以支持这个插件,说白了这个插件就是能用在playmaker上面,它可以放在fsm的action上面,所以贼好用
然后它用起来也简单了,而且它包含了sprite,animation,tilemap和UI方面的,可以完全平替unity的这些功能
导入插件:2d toolkit后,会发现有一些editor和application上的错误debug,这是因为它已经不支持新版的unity了,所以有一些unity自带的代码已经被弃用或者迭代了,如果被弃用了话我们就删除它,迭代的就用新迭代的方法。随便改改反正都是无关紧要的。
等到没有报错以后,我们就可以找到tk2droot文件夹了,把后缀带demo的文件夹都删掉,这些demo除非你还没搞懂可以点进去看看,如果你完全解读了就可以直接删掉了。
然后在asset搜索playmaker.package点击让它导入有关tk2d的playmakerfsm脚本,这些就都是可以用到fsm上的action行为
还有其他工作需要完成,比如用tk2dsprite代替sprite renderer,用tk2dspriteanimation代替animator,终于可以不用unity傻呗一样的animator了舒服。
asset文件夹空白处右键create,找到最底端的tk2d,点一下tk2dspritecollection,然后命名knight sprite collection,单击后点下open editor,然后就到了我们把小骑士的sprite拖入到左侧,点开右上角的setting照我下面设置(我图呢?我没电脑啊我不到啊)
设置完成后点一下apply,然后你就会发现好像生成了一个叫altas的图集还有一个material,然后我们就可以在小骑士身上用到了,删掉小骑士上面的sprite renderer,添加tk2dsprite,然后collection选择刚刚创建的knight。
然后我们就可以创建tk2dspriteanimation了,asset文件夹空白处右键create,找到最底端的tk2d,点一下tk2dspriteanimation,然后命名knight sprite animation,单击后点下open editor,左上角create 选择clip,然后命名为idle,点击下面的加号一个一个把有关idle的tk2dsprite添加到animation中 然后找到合适的targetframe一遍遍play找到合适的,run动画也是同理。完成后点击apply。
回到小骑士中,删掉上面的animator选择创建tk2danimation,现在idle作为初始动画,勾选play automaticlly
回到脚本中来,创建新的脚本.heroanimationcontroller.cs删掉原本的heroanimatorcontroller.cs,完成后点开,此后我们再也不需要使用animator了。(别急代码等我回去后贴)
完成以后我们打开herocontroller.cs更改错误debug
运行以后发现动画播放没有问题,接下来就可以制作enemy的行为状态机了。
这次我们项目的一个敌人就是大家在空洞遇到的第二个敌人蚊子buzzer,导入buzzer的素材,然后老办法给它一个tk2dsprite和tk2danimation
然后我们就可以用playmaker来控制这个敌人的行为了。
如果还没有导入playmaker可以现在导入,然后选择install now下载好后你会发现左上角有个playmaker,点开playmaker窗口你就可以看到一个界面,给buzzer一个playmaker名字就叫chaser,这个是控制buzzer追击玩家的。
既然要追击玩家就要我们collider2d了,给buzzer一个子对象alert range new,完成后给它circle collider2d,勾选是触发器,然后我们创建几个layer,player给小骑士,enemy给buzzer,hero detector给alert range new。创建脚本lineofsight detectors给buzzer,目的是检测应该检测的对象。
然后我就到了我们playmaker的扩展脚本了,那么为什么要扩展呢?肯定是原本的playmaker很多功能action无法满足特定需要啊,好在playmaker提供了自定义创建行为脚本的窗口,接下来我会一个个解释要创建的新自定义脚本
创建好后,我们就开始创建state和连线transition了
还需要添加必须的fsm event和fsm variable
我将一个个展示fsm的state状态
首先是initial状态
事件event是切换state状态的必需品,必须保证每一个state都至少有一个事件。
初始化结束后就进入idle状态
然后是startle状态
判断用的alert?状态,是的话直接进入alert状态
alert状态
还需要chase in sight
以及chase out of sight
至此一个循环就构成了完整的buzzer状态机
测试的时候我们将buzzer设置成远离玩家的位置,游戏刚开始时,buzzer会保持在idle状态,当玩家进入到circlecollider2d的区域内,状态机会经过一系列状态打到chase in sight状态,直到玩家走出circlecollider2d的区域。
至此我们迈出了非常重要的一步,其实很多敌人的行为都是类似的,我们可以在这些大同小异的敌人都用状态机来实现它们相似的行为。
所以下一期我打算稍微摆一摆,去创建更多的敌人enemy,让我们的场景更具有生机。