언리얼 엔진 5/개발 일지

[UE5] 블루아카이브 TPS게임 개발일지 (56) - EX 스킬 제작 4

ciel45 2024. 2. 4. 15:55

이번엔 busted 이펙트를 만들 것이다.

 

이전에 카이저 PMC 병사 가슴팍의 마크를 구현하기 위해 3d Text 플러그인을 사용한 바가 있다.

https://ciel45.tistory.com/19

 

블루아카이브 TPS게임 개발일지 (8) - 적 모델링 임포트

작중 적으로 등장할 캐릭터는 원작의 최종장 내용과 마찬가지로 카이저 PMC이다. 그런데 칸나의 3d 모델링은 부스에서 구할 수 있었지만, 아무리 찾아봐도 카이저 PMC 병사의 모델링은 구할 수 없

ciel45.tistory.com

 

이번에도 해당 플러그인을 사용하여 busted 3d 텍스트를 만들고, 큐브로 테두리를 만든 다음 스태틱 메시로 변환해주었다.

 

만든 오브젝트들을 선택해준 뒤 Actor->Convert Actors To Static Mesh로 스태틱 메시 생성

 

 

그리고 만들어진 스태틱 메시에서 머티리얼을 적당히 어울리는 것으로 변경해주었다.

 

 

이 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