이번엔 busted 이펙트를 만들 것이다.
이전에 카이저 PMC 병사 가슴팍의 마크를 구현하기 위해 3d Text 플러그인을 사용한 바가 있다.
이번에도 해당 플러그인을 사용하여 busted 3d 텍스트를 만들고, 큐브로 테두리를 만든 다음 스태틱 메시로 변환해주었다.
그리고 만들어진 스태틱 메시에서 머티리얼을 적당히 어울리는 것으로 변경해주었다.
이 busted 메시는 적에게 EX 스킬이 맞았을 때 SpawnActor 함수를 통해 적의 머리 위에 소환할 것이다.
또한 소환되면서 파티클 이펙트도 재생되고, 약간의 시간이 지나면 사라지게 할 것이다.
이러한 점들을 구현하기 위해서, 새로운 블루프린트 클래스 BP_Busted를 만들었다.
부모 클래스는 Actor이다.
상술한 기능들은 블루프린트의 이벤트 그래프 내부에서 처리하도록 했다.
ExProjectile이 적과 부딪혀 BP_Busted를 스폰하면, 파티클 이펙트 소환과 일정 시간 뒤 소멸 로직은 BP_Busted가 BeginPlay를 통해 알아서 수행할 것이다.
SetLifeSpan노드를 통해 2초 후 소멸되게 하였고, SpawnEmitterLocation을 통해 파티클 이펙트를 재생한다.
(0,0,20) 벡터를 더해준 이유는 이펙트 위치가 busted 글자 중앙에서 나오게 하기 위해서이다.
이제 ExProjectile에서 이것을 스폰하게 할 차례이다.
//ExProjectile.h 중 일부
protected:
UFUNCTION()
virtual void Damage(
UPrimitiveComponent* HitComponent,
AActor* OtherActor,
UPrimitiveComponent* OtherComp,
FVector NormalImpulse,
const FHitResult& Hit) override;
void SpawnBustedText(const FVector& SpawnLocation, const FVector& InstigatorLocation);
private:
UPROPERTY(EditDefaultsOnly)
TSubclassOf<AActor> BustedText;
float TextOffset;
void AExProjectile::Damage(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)
{
//맞은 액터가 AEnemy였을 경우
if (AEnemy* Enemy = Cast<AEnemy>(OtherActor))
{
if (!Enemy->IsDead())
{
UGameplayStatics::ApplyDamage(OtherActor, 100.f, GetInstigator()->GetController(), this, UDamageType::StaticClass());
SpawnBustedText(OtherActor->GetActorLocation() + FVector::UpVector * TextOffset, GetInstigator()->GetActorLocation());
UGameplayStatics::PlaySound2D(GetWorld(), HitSound);
}
Destroy();
}
}
void AExProjectile::SpawnBustedText(const FVector& SpawnLocation, const FVector& InstigatorLocation)
{
FRotator SpawnRotation = UKismetMathLibrary::FindLookAtRotation(SpawnLocation, InstigatorLocation);
SpawnRotation += FRotator(0.f, 180.f, 0.f); // 뒤집기
GetWorld()->SpawnActor<AActor>(BustedText, SpawnLocation, SpawnRotation);
}
Damage 함수는 OnComponentHit 델리게이트(이벤트)에 바인딩되어있다.
죽지 않은 Enemy에게 ExProjectile이 맞았다면, SpawnBustedText를 호출한다.
SpawnLocation은 Enemy의 GetActorLocation을 그대로 사용하고, SpawnRotation은 UKismetMathLibrary::FindLookAtRotation를 사용하여 문구가 플레이어 방향에 올바르게 정렬되도록 하였다.
다만 해당 함수만 쓰면 문구가 뒤집혀져보여, (0,180,0) FRotator를 더해 180도 뒤집어주었다.
SpawnActor의 인자로 이 SpawnLocation, SpawnRotation을 넣어주면 된다.
테스트 영상:
https://www.youtube.com/watch?v=kIF18qbABEw&ab_channel=Ciel45
'언리얼 엔진 5 > 개발 일지' 카테고리의 다른 글
[UE5] 블루아카이브 TPS게임 개발일지 (58) - 사망 연출 제작 2 (0) | 2024.02.16 |
---|---|
[UE5] 블루아카이브 TPS게임 개발일지 (57) - 사망 연출 제작 (Geometry Collection) (0) | 2024.02.16 |
[UE5] 블루아카이브 TPS게임 개발일지 (55) - EX 스킬 제작 3 (UParticleSystem) (0) | 2024.02.02 |
[UE5] 블루아카이브 TPS게임 개발일지 (54) - EX 스킬 제작 2 + LSP (0) | 2024.02.02 |
[UE5] 블루아카이브 TPS게임 개발일지 (53) - EX 스킬 제작 1 (0) | 2024.02.01 |