炮弹伤害
上一章中我们已经可以正确的发射炮弹,但是炮弹打出去没有任何的效果,这一章我们来完善炮弹的伤害事件。
我们打开ShellExplosion.cs,把它拖入到预制物Shell下,打开它

首先在炮弹发射2s后,无论怎么样都将其销毁。然后有个OnTreggerEnter方法,即炮弹和其他物体碰撞后调用的方法。记得完善代码组件

现在我们来完善OnTreggerEnter方法,首先,我们添加炮弹碰到物体后的爆炸效果。如下:

现在炮弹打到任何物体都有爆炸效果了,但是打到对方坦克时坦克任然纹丝不动,这不过瘾,我们要让炮弹爆炸点离坦克越近,坦克被推动地越远。我们设一个爆炸半径 m_MaxLifeTime ,半径内的坦克都受到影响,爆炸冲击力m_ExplosionForce。
然后获取爆炸半径内的layer是player的所有collider,遍历它们,给它们的rigidbody添加一个力,力的中心点就是爆炸的中心点。

然后设置代码组件:

试一下吧,爆炸可以正确地震动坦克了,如果自己离爆炸很近,自己也会被推开。
再来完善伤害,即越近收到的伤害越高。新建一个方法CalculateDamage来计算爆炸点和坦克的距离,根据距离来算出伤害,在这里这个伤害是线性变化的。最近点为max,超过爆炸半径为0。

最后我们在OnTriggerEnter方法中使用CalculateDamage方法,给TankHealth造成伤害。

再试一下,嗯,可以的。

添加生成点和默认界面
我们现在在游戏中动态地生成2个坦克,而不是一开始就存在,像servival shooter一样,我们在需要2个坦克生成点。先删去场景里的Tank,在Hierarchy 下新建2个空物体分别命名为SpawnPoint1和SpawnPoint2,并进行设置


接下来是一个游戏默认界面,在Hierarchy下新建一个Canvas,叫MessageCanvas,里面添加一个Text,设置如下:

注意里面有一个Shadow,用于阴影显示,完成后界面应该是这个样子

接下来我们将CameraRig下的camera control 里的tank内容去掉,只用将Targets置为0再回车即可

camera control.cs脚本里的的m_Targets变量前面的HideInInspector可以加上了,这样在组件中就不会显示它了。

TankManager
现在我们梳理一下游戏结构,这个游戏的目标是2个人分别控制一个坦克,血量清零时进行下一局,五局三胜,当然这些条件可以设置。那么我们需要一个GameManager充当管理全局的角色,然后用一个TankManager进行坦克的管理,它负责坦克的颜色、射击和移动,这样就实现解耦,利于游戏的拓展。

我们打开TankManager.cs,查看里面的内容:

在Setup()方法中先获取movment 和shooting脚本,添加编号,改变颜色,用于后面的方法。
然后我们需要在里面加上启用、禁用和重置坦克的方法:

因为这部分比较好理解,所以官方一开始就给好了,下一章我们一起看GameManager.cs如何进行游戏的管理。
网友评论