名为怪物的游戏——《星之魔女》FC小游戏移植(八)

前言

小游戏终篇,完成最后的敌人设计和关卡设计,以及各种音效处理。

为了加快写作速度,后面真的不贴代码了。

敌人系统

接前前篇,已经完成了部分敌人的动画和幽灵的行动轨迹。

敌人受伤

敌人没有受伤动画,而且也没有无敌时间。

只要计算伤害扣除当前血量,再判断是否归零,就执行死亡回调。

子弹的物理碰撞

这里存在一个很严重的问题,因为子弹添加了刚体,就会与敌人身上的刚体发生碰撞。

所以子弹击中敌人就会出现上图这样的效果,因为子弹脚本一直在给子弹施加一个前进的力,所以子弹会一直向前飞。

敌人身上又设置了弹性材质,把子弹弹开,子弹又继续向前,又被弹开……如此反复,变成抖动效果。

既要使用刚体组件,又不想用它的物理碰撞效果,看起来有点自相矛盾。

刚体类型

这个问题困扰了我一段时间,然后查阅手册以及看了一些教程才弄清楚了刚体组件的“妙用”。

Body Type

刚体组件有三种类型可以设置:

  • Dynamic(动力学的)
  • Kinematic(运动学的)
  • Static(静态的)

趁这个机会详细搜寻了相关的资料,恶补一下 unity 的知识。

Dynamic(动力学的)

贴个官方手册的说明:

Dynamic类型说明

简单地说如果一个物体要符合物理特性,可以受到外力的作用,就用此类型。

如果将物体设置为此类型,那么它应该是受到外力的驱动而发生移动,不应该直接用 transform 来修改坐标。

此类型对于 CPU 的消耗是极高的,因为它要计算各种物理效果。

Dynamic 类型的特性大致就是这样,在 FC 小游戏中,把主角设置成这个类型就可以了。

正如其名“动力学”即通过外力来驱动。

Kinematic(运动学的)

Kinematic 类型的刚体,不会受到重力以及其他外力的影响。

虽然不能受到外力的驱动而移动,但是刚体可以直接赋予速度,例如前文控制主角移动的方法:

1
rb.velocity = new Vector2(horizontal * moveSpeed, rb.velocity.y);

给与刚体一个水平方向的力,就可以驱动刚体朝着水平方向移动。

所以这种类型才是我想要的:不会受到外力影响。

正如其名“运动学”即通过改变速度来驱动。

Static(静态的)

静态的比较好理解,就是风雨不动安如山。

既无法通过外力“撼动”它,亦无法赋予刚体速度来移动它。

不管你推它、撞它,它都在那里。

解决子弹卡住问题

将子弹类型设置为 Kinematic

运动学不发生碰撞

默认情况下,Kinematic 类型只与 Dynamic 类型的刚体发生碰撞。

如果要检测与其他类型的碰撞,需要勾选 Use Full Kinematic Contacts

完全碰撞检测设置

不过这里并不希望子弹发生物理碰撞效果。

只需要把子弹的碰撞体改成 Trigger(触发器),然后监听触发器事件即可。

敌人消失动画

敌人死亡时,会停止移动,然后原地淡出消失。

敌人消失

掉落物

敌人完全消失后,会在原地爆出道具。

消灭敌人爆金币

吃到道具加上分数提示效果。

分数提示

子弹击中特效

子弹击中敌人时,应该把子弹消除,而不是让子弹还能继续穿透。

制作子弹击中的特效动画。

子弹击中动画

把这个做成预制体,当子弹击中目标的时候就生成这个动画特效,然后把子弹消除。

击中特效

击中特效在动画播放结束后也会自动销毁。

敌人受伤事件这样就完成了。

怪物设计

幽灵的行动轨迹比较简单,但是后面的这几个就比较复杂了。

垃圾桶怪

垃圾桶怪前方一小片区域是“侦查区”,如果玩家靠近这个区域,自己的“领地”被入侵了,它就会发怒驱逐入侵者。

玩家没有踏进领地,但是在远处用子弹“骚扰攻击”,也会令垃圾桶怪变得愤怒,原因是“吵到”它休息了!

愤怒的垃圾桶怪会向前“狂奔”,如果玩家被碰到了就会受到 1 点伤害。

而且因为有“垃圾桶”的防护,它的防御力比起其他生物要高得多,想要打败它可不容易。

如果不小心激怒了它,最好的方法就是找个机会从它身上跳过。

踏入警戒区

踏入垃圾桶怪的警戒区时,这个距离非常危险。

垃圾桶怪会现出“原形”吓退入侵者,原本可爱的外表也会变得十分可怕。

踏入警戒区

骚扰攻击

玩家使用子弹攻击多次后,垃圾桶怪也会因为被骚扰而变得烦躁愤怒。

如果本体还未出现,玩家的子弹会打在垃圾桶上,这是不会对本体造成伤害的。

可以从子弹的攻击特效看出来,在还没露出本体的时候,子弹直接消失了,而本体出现之后,子弹击中会产生特效。

除此之外,还会加入一个打中铁桶的音效。

这样设计之后,即使不告诉玩家垃圾桶怪是无敌的,玩家自然也能根据细节判断出来了。

当一个怪物不可战胜的时候,应该让玩家从细微之处发觉不对劲,而不是故意让玩家去挑战一个无法战胜的敌人白费时间。

演示效果:

攻击骚扰

愤怒追击

现在它还只是傻傻的在原地挨打,是时候给它增加一些对玩家的威胁了。

在整个 FC 小游戏中,它是第二危险的魔物!

垃圾桶怪在进入愤怒状态的时候,会朝着玩家“飞扑”过来。

受到骚扰的愤怒追击

进入警戒区域的追击

挑战失败案例

试图强行跳过的玩家很容易被“三连击”。

三连带走

强行击破案例

强行“站撸”在垃圾桶靠近之前消灭它!

强行站撸

虽然最终消灭了垃圾桶怪,但还是被带走一颗心。

比起直接踏入警戒区,用子弹骚扰会让它更加愤怒!

所以千万不要这么做……

正确挑战示例

实际上只要找准位置,可以轻松的从它的头上跃过。

正确跳过垃圾桶怪

球球怪

球球怪是在地面巡逻的敌人。

它会在地面弹跳巡逻指定的区域,不会主动攻击玩家。

动画效果

在地面弹起动画。

球球怪

巡逻逻辑

因为不是用刚体实现跳跃,花了好长时间……

不过总算是完成了。

跳跃巡逻球球怪

自爆怪

自爆怪是头顶上有着竹蜻蜓的球状炸弹型敌人。

最开始的时候,并不是将这只怪物设计成投弹自爆的。

而是想做一个类似“苍蝇”一样很小只的敌人,在 BOSS 的第二阶段,BOSS 使用召唤技能就会招来一群这样的敌人。

然后这群“苍蝇”会排的整整齐齐飞向玩家(肉搏冲击!)

它本身并不会发射子弹,仅仅只是用身体撞击玩家造成伤害。

脑补出它们成群阶段,转着圈圈,摆出各种阵势的样子(类似大雁成群结队飞行,摆出各种阵型)感觉会很有趣。

但是要实现起来就比较复杂了,要设计好各种阵型的坐标……

然后就弃坑了。

弃坑之后,反而激发了另一种灵感:

既然是飞行,像多啦A梦那样在头上带着竹蜻蜓感觉也是挺有趣的。

因为本体太重了,竹蜻蜓脱落,并且飞走了!

它本体并不会飞,所以就自由落体运动掉了下来。

掉到地上砸到玩家?感觉也不错,但是为何不像飞机投下导弹那样?

伴随着咻咻的音效(空袭警报)让玩家产生紧张感。

所以头顶竹蜻蜓的自爆怪就这么设计出来了。

动态效果

自爆怪

它会在天上飞行,然后从竹蜻蜓脱落,掉到地上产生爆炸。

因为体型很小,如果玩家没有注意观察的话很容易中招。

爆炸动画

自爆怪掉到地上或者在空中被玩家击中就会产生爆炸。

爆炸动画

竹蜻蜓

竹蜻蜓会与本体分离,独自飞出去,最后消失在天空。

竹蜻蜓脱离动画

炸弹本体

当竹蜻蜓脱离后,本体就不能再继续飞行了,而会掉落到地上。

本体(炸弹)会因为惯性继续向前运动,直到落到地上或者被玩家击中爆炸。

运动轨迹

爆炸攻击

掉落的本体要与角色或者地面碰撞,然后发生爆炸。

碰到地板爆炸

一起去看流星雨,落在主角的头上。

碰到玩家

高难度操作,在对方还没落地成盒之前打爆它!

截胡射击

后言

虽然今天又是爆肝一整天,但还是做不完啊!!!!

文章作者: 火烧兔子
文章链接: http://huotuyouxi.com/2021/05/08/monster-game-8/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 火兔游戏工作室