언리얼 엔진 네트워크 FPS 게임 개발 일지#5 총알 자국(Bullet holes), 데칼(Decal)

김진우·2022년 7월 8일
0

참고 영상 링크

총알자국

총을 벽에 발사하게 된다면 그 벽에는 총알 자국이 남는다. UE4에서는 데칼(Decal) 기능으로 이것을 지원한다. 참고 영상에서는 블루프린트에서는 SpawnDecalAttached 노드로 데칼 컴포넌트를 피격된 컴포넌트에 Attach 하여 데칼을 표시하는 방식을 선택했다.
C++에서도 Kismet/GameplayStatics.h 헤더를 include하면 블루프린트에서 사용할 수 있는 노드를 사용할 수 있다. UGameplayStatics::SpawnDecalAttached(...) 를 블루프린트 노드와 동일하게 사용할 수 있다.
데칼 컴포넌트 뿐 아니라 데칼 액터도 동일하게 존재한다. ADecalActorGetWorld()->SpawnActor<ADecalActor>()으로 생성한 다음 MaterialLifeTime를 설정해주면 동일하게 동작한다.

ADecalActor* AHitScanWeapon::SpawnDecalActor(FVector Location, FRotator Rotator)
{
	if (DecalMaterial == nullptr) return nullptr;
	Rotator.Pitch += 90;
	ADecalActor* DecalActor = GetWorld()->SpawnActor<ADecalActor>(Location, Rotator);
	if (!IsValid(DecalActor)) return nullptr;
	DecalActor->SetDecalMaterial(DecalMaterial);
	DecalActor->SetLifeSpan(5.f);
	DecalActor->GetDecal()->DecalSize = FVector(8.f, 8.f, 8.f);
	return DecalActor;
}

주의할 점은 이렇게 생성된 데칼 액터는 피치가 90도 돌아가있기 때문에 조절을 해줘야 정상적으로 출력된다는 점이다.

이렇게 만들어진 함수는 아래와 같이 사용된다

void AHitScanWeapon::OnHitResult(FHitResult HitResult, APlayerController* PlayerController)
{
 	// 피격된 액터에 데미지
	GiveDamage(HitResult, PlayerController);
	
    // 피격된 지점에 데칼 액터를 피격 방향으로 회전시켜 생성
    SpawnDecalActor(HitResult.Location, HitResult.ImpactNormal.Rotation());
}

아래는 결과 화면이다

데칼 액터는 멀티플레이 환경에서 다른 액터와 다르게 Replicate 되지 않는다. 출력이 비정상적일 수 있기 때문에 Multicast Rpc를 적용해서 서버를 제외한 다른 클라이언트에 데칼 액터를 따로 Spawn 하면 멀티플레이 환경에서 정상적으로 데칼을 확인할 수 있다.

profile
게임 개발자입니다.

0개의 댓글