现在我们添加一个怪物死亡的动画,在hellephantController中添加一个State,如下

添加一个参数Dead

给Death这个State赋值

给指向Death的连线进行设置,我们改动红框中的,类似的另一个AnimatorController也进行这样的修改。

在代码enemyhealth.cs中修改

即当生命小于0时,播放怪物的死亡动画。
试了一下,有3个问题:1.有个报错、 2、死的怪物还在跟着主角跑 3、死的怪物挡住了子弹。我们现在解决
一、

我们在模型里点击这里

原来这里有个StartSinking的方法需要补全,打开EnemyHealth.cs
在里面添加一个publicStartSinking()方法,再运行就不报错了。

这个方法在代码里没有调用的地方,我们肯定可以想到就是在模型里点击出的AnimationEvent里执行的,注意这个方法只执行一次。我们加入以下内容:

Rigidbody.isKinematic参数为true时表示该物体不受其他的物理控制,只能通过直接设置位置、旋转、缩放来控制。这样设置后就不会被其他的怪物推着走了。
设定一个标志位isSinking,表示正在下沉中,update()方法中加入下沉的移动。然后在2s后摧毁它。
再次运行,死的怪物还是跟着主角走,且还是不下沉,原因是它还处于自动寻路的状态,我们再加上这样的内容:

我们获取capsuleCollider,设置isTrigger,即可让子弹穿越;提出Death()方法,让代码更整洁;然后取消导航。
结果有这个错误:

有错误没关系,原来是我们把自动寻路取消后,EnemyMovement.cs里的 nav.SetDestination (player.transform.position);方法还在执行,因此我们要让它只有在怪物还没死的时候才执行就好了。

注意这里调用了currenHealth这个变量,因此在EnemyHealth.cs中,这个变量要为public的。
再试一次,没有错误了。

我们的游戏越来越细致了,但是现在主角还是可以钻进障碍物或者干脆推到墙外面躲起来,这对小怪兽来说不公平。我们需要给障碍物加上collider,加上哪一种collder就要根据障碍物具体的形状来了,即准确的表现出阻挡的效果,又不会消耗太多性能。我们以Stool这个障碍物为例,由于真正起阻挡作用的是四个腿,我们可以建立4个capsuleCollider。


场景中的障碍物都设置好后,我们还需要四堵看不见的墙,来阻挡玩家。每个gameObject里加上boxCollider。

障碍物都可以挡住子弹了,但是怪物的行为还是有点奇怪,比如撞上障碍物会被弹走,我们给它加上无穷大的刚体阻力和角阻力。

再试一下,嗯,效果不错!
网友评论