您的位置:首页 > 产品设计 > UI/UE

【UE4】蓝图中实现Projectile伤害、碰撞体伤害

2018-03-23 10:43 2226 查看
先在人物基础类中写好 对应的属性(血量100,是否死亡这个布尔值,什么时候判定死亡)void ABaseCharacter::CalculateDead() {
if (Health <= 0)
isDead = true;
else
isDead = false;
}

void ABaseCharacter::CalculateHealth(float delta) {
Health += delta;

CalculateDead();
}

#if WITH_EDITOR
void ABaseCharacter::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangeEvent) {
isDead = false;
Health = 100;

Super::PostEditChangeProperty(PropertyChangeEvent);

CalculateDead();
}
#endif创建一个蓝图接口BP_Damage ,创建一个叫AffectHealth的函数,在其中创建一个float输入值作为伤害



Projectile伤害:
接下来在敌人组件中 写死亡事件
具体逻辑就是:首先,发生了AffectHealth事件,影响了血量,所以要计算血量(C++中的CalculateHealth),再用一个分支来判断血量,如果死亡便执行..,如果没死就不执行..



接下来便让Projectile有伤害
具体逻辑就是,发生碰撞时,
先检测是不是有BP_Damage接口的物件,



再检测是不是有不需攻击对象的tags(Friendly)


排除其他不需要我们攻击的Pawn,接下来用分支来判断,当的确是我们需要伤害的物体时,便执行AffectHealth来伤害,伤害完,子弹(Projectile)不能留着,固要对其进行其他操作(销毁删除之类的)

先将碰撞预设改为

(和Pawn重叠时发生碰撞事件)



碰撞体伤害:


创建好对应的碰撞体

在要被伤害的对象中加入伤害的接口


在被伤害的对象中写计算血量逻辑:发生AffectHealth事件,计算血量,分支如果死就销毁(print是用来看是否成功扣血)



在加害者的对象中写伤害逻辑:
如果发生碰撞(ActorBeginOverlap),将碰撞到的物体类型转换成BaseCharacter(自己C++创建的那个),提取出变量称为Hero,然后每过一个DamagePerSecond便执行一次伤害事件(AffectHealth)也就是攻击频率。
如果结束碰撞了(ActorEndOverlap),判断结束碰撞的是不是Hero,如果是就清除伤害组件(SetTimerbyFunctionName里面的DamageHero)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息