이번엔 busted 이펙트를 만들 것이다.
이전에 카이저 PMC 병사 가슴팍의 마크를 구현하기 위해 3d Text 플러그인을 사용한 바가 있다.
블루아카이브 TPS게임 개발일지 (8) - 적 모델링 임포트
작중 적으로 등장할 캐릭터는 원작의 최종장 내용과 마찬가지로 카이저 PMC이다. 그런데 칸나의 3d 모델링은 부스에서 구할 수 있었지만, 아무리 찾아봐도 카이저 PMC 병사의 모델링은 구할 수 없
ciel45.tistory.com
이번에도 해당 플러그인을 사용하여 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 |