1. TPS 게임 개발에서의 문제점
- TPS 게임을 개발하면서 가장 먼저 마주한 문제는, 총알이 조준한 곳으로 날아가지 않는 현상이었다.
- 총알을 카메라의 조준점 방향으로 날아가게 하면, 총구가 보통 카메라보다 앞쪽 아래에 위치하기 때문에, 그 사이의 공간으로 발사 될 수 있었다.
- 게다가 카메라가 스프링 암을 통해 움직이다 보니, 총구와 카메라 사이의 거리도 계속 변화하여 단순한 고정값으로는 이 문제를 해결할 수 없었다.
- 또 다른 문제는 조준점이 총알의 최대 비행 거리보다 가까운 경우에는 맞은 지점에서 사라지지만, 조준점이 그 거리보다 멀 경우, 총알이 조준점에서 벗어난 곳으로 날아가며 어색하게 사라진다는 점이었다.
- 이 문제들을 해결하기 위해, 총알이 카메라의 조준선 방향으로 정확히 총알의 총 비행 거리만틈 날아가게 하는 보정 시스템을 설계했다.
2. 총구-조준점 간 오차 보정
- 총알이 카메라와 총구 사이로 발사 되지 않도록, 카메라와 총구까지의 깊이(b)를 계산하고, 카메라 조준점 방향으로 그만 큼 보정 거리를 더한 후, 그 위치를 라인 트레이스 시작 위치로 설정하였다.
- 총알이 조준점에서 사라지도록, 총구 위치, 총알의 총 비행거리(c)와 라인 트레이스 시작 위치를 이용해, 라인 트레이스 끝 위치를 설정했다.
- 이 과정을 통해 총알은 항상 조준점과 일치하는 방향으로 날아가도록 만들 수 있었다.

3. 구현 코드
// 카메라와 발사위치까지의 거리 구하기
FVector CamPos = Camera->GetComponentLocation(); // 카메라 위치
FVector CamForward = Camera->GetForwardVector(); // 카메라 앞 단위벡터
FVector muzzlePos = GetActorTransform().TransformPosition(pyoMuzzle); // 발사 위치 = 총구의 월드 위치
FVector tmpV = muzzlePos - CamPos; // 카메라에서 총구까지의 벡터
// 총구가 카메라 전방으로 얼마나 떨어져 있는지(깊이)를 구함
float camToStartDistance = FVector::DotProduct(CamForward , tmpV); // 발사위치와 카메라의 깊이 구하기
FHitResult tmpHit;
// 카메라 조준선 상의 총구 깊이 위치에 있는 점
FVector start = CamPos + CamForward * camToStartDistance; // 발사 위치와 같은 깊이에서 시작
// 총구와 Start 간의 거리
float startToMz = FVector::Distance(start, muzzlePos);
// 피타고라스의 정리로 표창이 날아갈 직선 거리 계산
// 표창 비행 거리 = pyoDistance, 총구와 Start 간의 거리 = startToMz
float startToEndDistance = FMath::Sqrt(FMath::Square(pyoDistance) - FMath::Square(startToMz));
// 조준선 상 최종 목표 지점, start에서 계산해도 됨
FVector end = CamPos + CamForward * ( startToEndDistance + camToStartDistance );
FCollisionQueryParams tmpCP;
tmpCP.AddIgnoredActor(this); // 자기 자신 제외하기, 3인칭이라 가끔 자기 자신 맞음
// 라인 트레이스 실행
GetWorld()->LineTraceSingleByChannel(tmpHit , start , end , ECollisionChannel::ECC_Camera , tmpCP);
FVector direction;
if ( tmpHit.bBlockingHit ) // 맞은 오브젝트가 있다면
{
direction = ( tmpHit.Location - muzzlePos ).GetSafeNormal(); // 해당 방향으로 표창 발사
}
else // 맞은 오브젝트가 없다면
{
direction = ( end - muzzlePos ).GetSafeNormal();
}
4. 영상
- 위의 그림 부분을 영상에서 확인할 수 있다.
'Programming > Unreal 5 구현' 카테고리의 다른 글
| Unreal 5 구현 - 벽 타기 시스템 (0) | 2025.06.27 |
|---|---|
| Unreal 5 구현 - 자기장 시스템 (3) | 2025.06.26 |
| Unreal 5 구현 - 인벤토리 시스템 (0) | 2025.06.24 |
| Unreal 5 구현 - AI #2 (2) | 2025.06.23 |
| Unreal 5 구현 - AI #1 (1) | 2025.06.20 |
