[이득우 언리얼 C++] 3. 움직이는 액터의 제작

    💻 Code : https://github.com/tedison7/ArenaBattle

    로깅 환경의 설정

    출력 로그 윈도우

    언리얼 엔진은 로그(Log) 환경을 위해 UE_LOG 라는 매크로를 제공하고 있다.

    UE_LOG(카테고리, 로깅수준, 형식 문자열, 인자... )

    해당 매크로를 사용하여 생성된 로그는 Saved\Logs 폴더의 Log 파일과 출력로그 윈도우에서 확인할 수 있다.

    로그 카테고리

    로그에는 카테고리를 지정할 수 있다. 로그를 확인해보면 로그가 "카테고리:" 으로 시작하는것을 확인할 수 있다.

    로깅 수준

    로깅 수준은 크게 메시지(Log), 경고(Warning), 에러(Error) 세가지로 나뉜다. 각각 흰색, 노란색, 붉은색으로 출력 로그 윈도우에 표시된다. 색상은 편집 > 에디터 개인설정 > 외형 메뉴에서 변경할 수 있다.

    로그 필터

    출력 로그 윈도우에는 필터 기능이 있어 원하는 로깅 수준과 카테고리에 해당하는 로그만 출력하도록 설정할 수 있다.

    형식 문자열

    로그 매크로는 printf 와 같은 형식 문자열 기능을 지원한다. 문자열을 정의할 때는 TEXT 매크로를 사용하고, FString 변수로 사용할 경우 * 연산자를 앞에 지정해줘야 한다.

    로깅을 위한 공용 매크로 설정

    실습을 위한 ArenaBattle이라는 로그 카테고리를 새롭게 정의 해보자. ArenaBattle.h 에 로그 매크로를 선언하고 모듈의 모든 헤더들이 해당 헤더를 참조하도록 구성하자.

    이제 로그가 출력될수 있도록 AFountain::BeginPlay 함수에 로그를 추가해보자

    // Called when the game starts or when spawned
    void AFountain::BeginPlay()
    {
        Super::BeginPlay();
    
        UE_LOG(ArenaBattle, Warning, TEXT("Actor Name : %s, ID : %d, Location X : %.3f"), *GetName(), ID, GetActorLocation().X);
    }

    이후 실행시 배치된 분수대 만큼 로그가 출력됨을 확인하였다.

    다음으로 좀더 간편하게 로그를 작성할 수 있도록 매크로를 추가로 정의한다.

    • ABLOG_S : 코드가 들어있는 파일 이름과 함수, 그리고 라인 정보를 추가하여 ArenaBattle 카테고리로 로그를 남긴다.
    • ABLOG : ABLOG_S 정보에 형식 문자열로 추가 정보를 지정해 로그를 남긴다.

    로그 출력 결과는 다음과 같다

    어설션

    프로그래밍에서 어설션(Assertion)은 반드시 확인하고 넘어가야하는 점검 코드를 의미한다. 원활한 디버깅을 위해 디버깅 기호를 추가로 설치한다. 런처를 열고 엔진 버전의 옵션을 선택하여 디버깅을 위한 편집기 기호를 선택하여 설치하였다.

    어설션에 대한 설명은 이전 포스트에 정리해 두었다.

    액터의 주요 이벤트 함수

    PostInitializeComponents 함수는 액터에 속한 모든 컴포넌트의 세팅이 완료되었을때 호출된다. 액터가 게임에 참여할 때는 BeginPlay 함수가 호출되고, 매 프레임마다 액터의 Tick 함수를 호출한다. 액터가 게임에서 퇴장되면 EndPlay를 호출하고 이후 엔진의 가비지콜렉션에 의해 메모리에서 소멸된다. 액터에 PostInitializeComponents, EndPlay 함수를 추가로 선언하여 호출 순서가 어떻게 되는지 확인해보자.

    움직이는 액터의 설계

    액터의 Tick 함수를 이용하여 회전하는 분수대를 실습해보자. z축 기준으로 회전시키며 회전 속도 정보를 에디터에서 편집할 수 있도록 UPROPERTY 매크로에 EditAnywhere 키워드를 넣었다. OOP에서 캡슐화(Encapsulation)를 위해 속도 변수를 private로 선언했다면 에디터에서도 편집할 수 있도록 AllowPrivateAccess 키워드를 추가해야한다. 그리고 Tick함수에서 액터의 FRotator 자료형으로 회전 속도만큼 회전하도록 하였다.

    FRotator는 회전값을 지정하는 데이터이다.

    • Pitch : 좌우를 기준으로 돌아가는 회전값이다. 언리얼 엔진의 Y축 회전에 해당
    • Yaw : 상하를 기준으로 돌아가는 회전값이다. 언리얼 엔진의 Z축 회전에 해당
    • Roll : 정면을 기준으로 돌아가는 회전값이다. 언리얼 엔진의 X축 회전에 해당

    무브먼트 컴포넌트의 활용

    위처럼 액터를 움직이기 위해 Tick과 DeltaSeconds를 활용하는 것은 게임 제작에서 일반적인 방법이다. 언리얼 엔진에서는 움직임이라는 요소를 분리하여 관리하도록 별도의 프레임워크를 구성하여 무브먼트 컴포넌트 통해 기능을 제공하고 있다. 다음과 같은 무브먼트 컴포넌트 종류가 있다.

    • FloatingPawnMovement : 중력의 영향을 받지않는 움직임
    • RotatingMovement : 회전 운동
    • InterpMovement : 지정한 위치로 보간하여 이동
    • ProjectileMovement : 발사체 움직임

    RotatingMovement 컴포넌트를 사용하여 이전과 동일한 움직임을 구현해보자. Tick기능을 끄고, MovementComponent 가 틱마다 액터를 회전 시키도록 수정하였다.

    MoveComponent를 추가하면 기존 컴포넌트와 달리 컴포넌트 목록에서 분리되어 표시된다. 컴포넌트 목록은 다음과 같이 두가지 종류로 분리되어 표시된다.

    • SceneComponent : 트랜스폼 정보가 필수인 컴포넌트
    • ActorComponent : 액터에 기능만 제공하는 컴포넌트

    프로젝트의 재구성

    지금까지 실습했던 분수대 액터를 제거해보자. 제거는 수동으로 해야한다. 프로젝트 폴더로 가서 .vs, Binaris, Intermediate 폴더와 ArenaBattle.sln 파일을 제거하자. 그리고 uproject 파일을 우클릭하여 Generate Visual Studio porject files 메뉴를 선택한다. 솔루션을 생성하면서 Source폴더의 내용을 분석하고 Intermediate 폴더의 ProjectFiles 폴더에 프로젝트의 파일정보를 생성하며 sln 파일은 이를 참조한다.

    요약

    • 로깅 환경 설정
    • 액터의 주요함수 오버라이드
    • 무브먼트 컴포넌트
    • 프로젝트 솔루션 재생성
    반응형

    댓글

    Designed by JB FACTORY