[velog에서 블로그 이전하며 가져온 글입니다]
작성 일자 : 2022년 7월 8일
총알자국
총을 벽에 발사하게 된다면 그 벽에는 총알 자국이 남는다. UE4에서는 데칼(Decal) 기능으로 이것을 지원한다. 참고 영상에서는 블루프린트에서는 SpawnDecalAttached
노드로 데칼 컴포넌트를 피격된 컴포넌트에 Attach 하여 데칼을 표시하는 방식을 선택했다.
C++에서도 Kismet/GameplayStatics.h
헤더를 include하면 블루프린트에서 사용할 수 있는 노드를 사용할 수 있다. UGameplayStatics::SpawnDecalAttached(...)
를 블루프린트 노드와 동일하게 사용할 수 있다.
데칼 컴포넌트 뿐 아니라 데칼 액터도 동일하게 존재한다. ADecalActor
를 GetWorld()->SpawnActor<ADecalActor>()
으로 생성한 다음 Material
와 LifeTime
를 설정해주면 동일하게 동작한다.
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 하면 멀티플레이 환경에서 정상적으로 데칼을 확인할 수 있다.
'게임개발일지 > 멀티플레이 FPS' 카테고리의 다른 글
언리얼 엔진 네트워크 FPS 게임 개발 일지#6 에임 오프셋 기능 개선 (0) | 2023.08.17 |
---|---|
언리얼 엔진 네트워크 FPS 게임 개발 일지#4 탄퍼짐, 반동 구간 반복, 반동 안정성 (0) | 2023.08.17 |
언리얼 엔진 네트워크 FPS 게임 개발 일지#3 무기 반동 (1) | 2023.08.17 |
언리얼 엔진 네트워크 FPS 게임 개발 일지#2 무기 클립핑 현상 수정 (0) | 2023.08.17 |
언리얼 엔진 네트워크 FPS 게임 개발 일지#1 개발환경 세팅 (0) | 2023.08.17 |