본문 바로가기

게임 개발 공부/언리얼엔진

UE5 | C++ - 조준점 정렬

슈팅게임에서 캐릭터가 든 총의 조준선을 플레이어의 시선과 일치시키는건 굉장히 어렵다.

물론 방법은 있겠지만, 얕은 지식으론 접근하기 쉽지 않을 것같다.

그래서 아예 화면의 중앙에서 직선으로 총이 발사되도록 해버렸다.

 

-기존의 로직

FVector SpawnLocation = GetActorLocation();
FRotator SpawnRotation = GetActorRotation();
		
if (WeaponMesh && WeaponMesh->DoesSocketExist("MuzzleSocket"))
{
SpawnLocation = WeaponMesh->GetSocketLocation("MuzzleSocket");
SpawnRotation = WeaponMesh->GetSocketRotation("MuzzleSocket");

}
FinalAccuracy = MaxSpreadAngle * (1 - OriginalAccuracy);
FVector BaseDirection = SpawnRotation.Vector();
FVector SpreadDirection = FMath::VRandCone(BaseDirection, FMath::DegreesToRadians(FinalAccuracy));
FRotator FinalRotation = SpreadDirection.Rotation();

FActorSpawnParameters SpawnParams;
SpawnParams.Owner = this;
Bullet = GetWorld()->SpawnActor<ABullet>(BulletClass, SpawnLocation, FinalRotation, SpawnParams);

 

총구에 배치한 MuzzleSocket의 위치와 회전을 가져와 스폰시켰다.

그러나 이렇게하면 유저의 조준선에 궤적을 맞추기 어렵다.

 

-수정된 로직

FVector ControllerDirection;
FVector FinalLocation;
		
if (APlayerController* PlayerController = GetWorld()->GetFirstPlayerController())
{
    if (AMyPlayerController* Controller = Cast<AMyPlayerController>(PlayerController))
    {
        FRotator ControlRotation = Controller->GetControlRotation();
        ControllerDirection = ControlRotation.Vector();

        FVector CameraLocation = Controller->PlayerCameraManager->GetCameraLocation();
        FinalLocation = CameraLocation + (ControllerDirection * 20);
    }			
}
        
FinalAccuracy = MaxSpreadAngle * (1 - OriginalAccuracy);

FVector SpreadDirection = FMath::VRandCone(ControllerDirection, FMath::DegreesToRadians(FinalAccuracy));
FRotator FinalRotation = SpreadDirection.Rotation();
        
FActorSpawnParameters SpawnParams;
SpawnParams.Owner = this;
Bullet = GetWorld()->SpawnActor<ABullet>(BulletClass, FinalLocation, FinalRotation, SpawnParams);

 

캐릭터의 카메라위치와 컨트롤러의 회전을 가져와서 탄환을 스폰해줬다.

추가로, 카메라의 위치에서 곧바로 스폰하니 스프링암과 반응하여 카메라가 튀는 현상이 발생해서 위치를 앞으로 좀 전진시켜주었다.

 

명중!