目录
一、解决炮弹穿过坦克炮塔问题
二、炮弹溅射伤害
效果
一、解决炮弹穿过坦克炮塔问题
打开“PHYS_West_Tank_M1A1Abrams”这个物理资产

造成这种现象的原因是,炮弹只会与如下紫色区域产生碰撞事件
选中坦克炮塔的骨骼

添加盒体外形

缩放盒体外形使其包裹住炮塔

再选中炮管的骨骼

添加一个胶囊体外形(注意不要覆盖炮口处,因为炮弹会从炮口处生成,如果外形覆盖炮口,那么炮弹生成后就会立刻爆炸)

此时运行游戏发现炮塔、炮管会全部从坦克上掉落分离,这是因为“TankZongLei”的父类——轮式载具类,开启了网格体的模拟物理。
我们需要将炮塔和炮管的物理外形中的物理类型设置为运动学


此时运行游戏攻击坦克炮塔和炮管也会检测到炮弹。
二、炮弹溅射伤害
主要通过“应用放射状伤害”节点实现。其中,“Base Damage”引脚表示爆炸中心的伤害值,“Origin”表示中心点位置,“Damage Radius”表示爆炸半径(单位:cm),“Damage Causer”表示造成伤害的对象,“Instigated by Controller”表示造成伤害的控制器,“Do Full Damage”表示爆炸范围内是否存在伤害衰减(离爆炸中心越远伤害越低),“Damage Prevention Channel”表示可以阻挡爆炸的碰撞类型,可视性表示只要能阻挡可视性通道的碰撞,都会阻挡伤害。
打开“TankShell”(坦克炮弹蓝图)

添加一个变量命名为“DamageByWhichController”,表示发射此炮弹的控制器(玩家控制器或AI控制器),变量类型为控制器的对象引用。


打开“BP_West_Tank_M1A1Abrams”

找到“从类生成Actor”节点

可以发现多了一个“DamageByWhichController”引脚,如果没有的话可以尝试刷新节点并查看创建变量时是否勾选了可编辑实例和生成时公开

添加“获取控制器”节点,如果控制坦克的是玩家,则获取的是玩家控制器,如果控制坦克的是AI,就会获取AI控制器。我们通过“获取控制器”节点向“DamageByWhichController”引脚传入控制器,给“TankShell”(坦克炮弹蓝图)中的变量“DamageByWhichController”赋值。

打开“TankShell”,添加如下节点,使得炮弹能够造成放射状伤害


打开“TankZongLei”,将如下选中的节点折叠到函数

折叠的函数重命名为“GetDamage”

函数设为私有

复制一份“GetDamage”函数给到收到放射状伤害时执行的逻辑

为了测试溅射伤害是否有效,我们可以打印输出一下坦克当前的血量。
效果
最终效果如下:
可以看到不论是攻击坦克炮塔还是攻击坦克附近都会对坦克造成伤害。








![[游戏开发]Unity随机网格中空位置_二叉树](https://img-blog.csdnimg.cn/51277550c86d409e94567170256c33c4.png)











