上一篇文章我们把靶子的一个基本功能给实现了,实际上手操作过的小伙伴可能遇到了这样一个问题,我们把靶子做成了一个预制体后,将其摆放在场景中的各处。然后我们就可以拿起我们心爱的枪开始打靶了。这时候你会发现我们打倒一个靶子时,场景中的其他靶子都会跟着一起倒下。 看到这我第一反应是我不会把生命值声明为 static 了吧。发现生命值并没有声明错后,我又查了一下逻辑的问题。最终发现是我们在靶子的脚本中的Start函数里注册了Hit事件,如下图:
这样一写,所以在游戏一运行,所有的靶子都注册了这个事件,所以当子弹击中其中一个靶子触发这个事件时,所有的靶子都会去响应这个事件。所以我们不应该把事件注册放在Start里面。那应该放在什么时候呢?我们来捋一捋这个逻辑: 子弹击中靶子时,靶子的对应部位会触发一个事件,在同一时间,我们只能命中一个靶子,所以我们只希望被击中的那个靶子去处理这个事件,所以我们只应该在被击中的靶子里去注册这个事件,但这样仍然有一个问题,这个靶子被击中一次后,我们击倒其他的靶子时候,它仍然会倒下。所以我们还应该把这个靶子在处理完一次事件后取消注册这个事件。
好了,捋清了逻辑后,我们就来写代码:
首先我们需要在子弹击中靶子时,通知该靶子,我击中你了,你需要注册这个事件了。说到通知,我们当然可以采用事件中心的方式去再注册和触发一个新的事件。但是这样有点麻烦,我们可以使用Unity为我们提供的消息传递方法SendMessage(SendMessage包含三种方法形式,由于我们要从靶子的被击中部位向靶子通知,也就是子物体向父物体通知,我们应该使用SendMessageUpwards())。所以在靶子各个部位的脚本中添加一句发送消息的语句,告诉靶子该注册事件了。
然后给其他部位也添加上这一句之后,我们来到靶子的脚本去处理这个消息了。处理过程也很简单就是给当前靶子注册这个Hit事件。
其他的就和以前的脚本一样。只是需要在处理完事件后要去取消注册这个事件。
到此,BUG就被修好了,效果图如下:
Logo

分享前沿Unity技术干货和开发经验,精彩的Unity活动和社区相关信息

更多推荐