심드렁하게 저장

전차 자동 조준 기능 구현 본문

Game, Graphics/Unreal Engine

전차 자동 조준 기능 구현

Ggoosae 2024. 11. 15. 11:41

1. 개요

전차 콘텐츠 구현 중 자동 조준 기능을 구현해야 했다. 이 포스팅에서는 Unreal Engine 5에서 구현한 AK2_AutoTurret 클래스에 대해 이 클래스는 AWheeledVehiclePawn 타입의 전차를 목표로 추적하는 자동 터렛을 다룬다. 이 코드는 KismetMathLibrary와 UGameplayStatics 등의 유틸리티를 사용하여 복잡한 연산을 처리하도록 하였다.

주요 기능은 다음과 같다.

 

  • 화면 좌표로 전차의 위치 값을 변환
  • 터렛의 회전 조정
  • 특정 상황에서 NULL 검사 및 로그 출력

2. 클래스 구현 세부 사항

2.1 헤더

#include "K2_AutoTurret.h"
#include "WheeledVehiclePawn.h"
#include "Kismet/KismetMathLibrary.h"
#include "Kismet/GameplayStatics.h"
  • WheeledVehiclePawn: 전차의 기본 클래스 (Chaos Vehicle 시스템을 적용)
  • KismetMathLibrary: 다양한 수학 관련 유틸리티 함수가 포함된 라이브러리
  • UGameplayStatics: 게임 플레이와 관련된 유틸리티 기능을 제공

2.2 주요 함수

FVector2D AK2_AutoTurret::CalcScreenPos(APlayerController* PlayerController, AWheeledVehiclePawn* EnemyTank)
{
    USkeletalMeshComponent* TankMesh = EnemyTank->GetMesh();
    FVector TankMeshLocation = TankMesh->GetComponentLocation();

    FVector2D ScreenPos;
    UGameplayStatics::ProjectWorldToScreen(PlayerController, TankMeshLocation, ScreenPos, false);
    return ScreenPos;
}
  • 적 전차의 세계 좌표를 화면 좌표로 변환하여 반환
  • UGameplayStatics::ProjectWorldToScreen()을 사용하여 3D 세계 좌표를 2D 화면 좌표로 변환
  • Tank Mesh의 3D World Location을 2D Position으로 Projection 
FVector2D AK2_AutoTurret::TurretTracking(AWheeledVehiclePawn* PlayerTank, AWheeledVehiclePawn* EnemyTank)
{
    if (!PlayerTank || !EnemyTank)
    {
        UE_LOG(LogTemp, Warning, TEXT("전차 NULL"));
        return FVector2D::ZeroVector; // 기본 반환값
    }
    USkeletalMeshComponent* K2Mesh = PlayerTank->GetMesh();
    USkeletalMeshComponent* EnemyMesh = EnemyTank->GetMesh();
    if (!EnemyMesh)
    {
        UE_LOG(LogTemp, Warning, TEXT("EnemyTank mesh NULL"));
        return FVector2D::ZeroVector; // 기본 반환값
    }

    FVector OwnerLocation = K2Mesh->GetComponentLocation();
    FVector TankMeshLocation = EnemyMesh->GetComponentLocation();

    FRotator LookAtRotation = UKismetMathLibrary::FindLookAtRotation(OwnerLocation, TankMeshLocation);
    FRotator OwnerRotation = K2Mesh->GetComponentRotation();
    FRotator DeltaRotation = UKismetMathLibrary::NormalizedDeltaRotator(OwnerRotation, LookAtRotation);

    return FVector2D(DeltaRotation.Pitch, DeltaRotation.Yaw);
}
  • OwnerLocation: 플레이어 전차의 현재 위치를 나타내는 벡터 
  • TankMeshLocation: 적 전차의 현재 위치를 나타내는 벡터 
  • FindLookAtRotation() 함수는 전차의 현재 위치를 나타내는 벡터 에서 적 전차의 현재 위치를 나타내는 벡터로 향하는 벡터 기준으로 하는 회전각을 계산
  • 이 회전각은 전차가 적 전차를 바라보기 위해 필요한 회전 방향
  • OwnerRotation: 플레이어 전차의 회전각
  • NormalizedDeltaRotator() 함수는 두 회전 각도 사이의 차이 계산하고 정규화하여 반환
  • 최종적으로 터렛이 목표를 조준하기 위해 회전해야 할 각도의 Pitch와 Yaw 성분을 2D 벡터로 반환

3. 예시 화면

플레이 시 배열에 있는 적을 순서대로 추적

 

포신의 위치를 업데이트하는 방안을 구상해야 할 것 같다.