C++ , 언리얼

정혜창·2025년 1월 6일
0

내일배움캠프

목록 보기
18/43

오늘은 처음 C++과 언리얼이 어떤 관계인지 알아보았다. 저번에 인생 첫 게임을 만들었을 땐 블루프린트를 활용해서 만들었었는데 C++을 배운 현재는 어떤 모습으로 게임을 만들어 나갈 수 있을지 사뭇 긴장되고 설렌다. 그러나 여전히 C++의 실력이 부족한 상태이므로 C++ 공부도 병행하면서 최대한 원하는 바를 구현할 수 있게 해 나가겠다.

우선 오늘은 언리얼에서 Game - 1인칭 시작에디터를 포함하여 프로젝트를 만들었다. 그리고 C++을 체크하고 시작하는 순간 기본 컴파일러로 설정되어 있던 VS 2022가 같이 켜지며 코드의 무리가 주르륵 나왔다.

프로젝트 구조 이해

우선 VS에서 내가 만든 프로젝트에 총 5개의 폴더가 보였다. 각각의 역할을 정리 해보자면

1. Engine 폴더

  • 역할 : 엔진 자체의 코드와 리소스를 포함한다. 엔진의 코어 기능, 셰이더, 렌더링 시스템, 물리 엔진, 그리고 편집기와 관련된 모든 파일이 들어 있다.

  • 주요 내용 :

    • Binaries : 엔진 실행 파일과 관련 바이너리 파일너리 파일
    • Config : 엔진 전반적인 설정 파일
    • Content : 엔진 기본 콘텐츠(예: 머터리얼, 파티클, 텍스쳐)
    • Source : 엔진 소스 코드
  • 언리얼 엔진을 커스터마이징하거나 엔진의 소스 코드를 직접 수정해야 할 경우 사용된다.

2. Game 폴더

  • 역할 : 사용자가 생성한 게임 콘텐츠와 코드를 포함하는 게임 프로젝트의 핵심 폴더이다.
  • 주요 내용 :
    • Source : 게임의 C++ 코드와 모듈 파일
    • Content : 게임에서 사용하는 에셋(머터리얼, 모델, 블루프린트 등)
    • Config : 게임 고유의 설정 파일
  • 게임 프로젝트를 개발할 때 대부분의 작업이 이 폴더 안에서 이루어진다. 기본적으로 Content 폴더는 언리얼 에디터에서 가장 많이 다루게 된다.

3. Visualizers 폴더

  • 역할 : 디버깅 및 프로파일링 도구와 관련된 시각화 정보를 저장한다.
    이 폴더는 언리얼 엔진이 실행 중에 게임 상태나 성능을 분석할 수 있도록 데이터를 제공한다.
    .natvis 파일이 포함돼 있다. 이 파일은 VS에서 객체와 데이터를 보여주기 위해 XML 문법을 기반으로 작성돼 있으며, .natvis 파일을 수정해 데이터 시각화를 커스터 마이징할 수 있다.
  • 주요 내용 :
    • 시각화 플러그인 또는 디버그 정보를 생성하고 표시하는 데 사용되는 리소스
    • 예를 들어, Blueprint DebuggerPerformance Visualizer와 같은 툴과 관련된 리소스가 포함될 수 있다.
  • 성능 최적화 작업을 진행하거나, 런타임 상태를 디버깅할 때 주로 사용된다.

4. Programs 폴더

  • 역할 : 엔진에서 사용하는 추가 프로그램 및 유틸리티가 포함되어 있다.
    주로 빌드 시스템, 에디터 도구, 또는 자동화된 워크플로우와 관련된 도구들이 위치한다.

  • 주요 내용 :

    • UnrealBuildTool : 엔진 및 프로젝트를 빌드하는 데 필요한 툴
    • AutomationTool : CI/CD 작업이나 빌드 프로세스를 자동화하는 스크립트와 도구
    • ShaderComileWorker : 셰이더 컴파일 작업을 분산 처리하는 데 필요한 유틸리티
  • 프로젝트를 컴파일하거나, 빌드 파이프라인을 설정할 때 사용된다. 엔진 소스 빌드 환경에서 주로 필요하다.

5. Rules 폴더

  • 역할 : 빌드 프로세스에서 특정 모듈이나 플러그인의 규칙(빌드 설정)을 정의하는 파일을 포함한다.
    각 모듈의 빌드 설정, 의존성 관리, 타겟 지정 등을 제어한다.

  • 주요 내용 :

    • .Build.cs 파일들 : 빌드 시 어떤 모듈과 라이브러리를 사용할지 정의
    • 프로젝트에 포함된 플러그인이나 커스텀 모듈의 빌드 규칙
  • 커스텀 플러그인, 모듈, 또는 프로젝트 특화 빌드 설정을 수정하거나 추가할 때 필요하다.

정리

이 다섯 개의 폴더는 각각 다른 목적에 맞춰 존재하며, 다음과 같은 방식으로 상호작용한다.

  • Engine 폴더는 엔진의 기본 동작을 제공하고,
  • Games 폴더는 게임 프로젝트의 콘텐츠와 코드를 포함하며,
  • Visualizers 폴더는 디버깅과 성능 분석을 돕고,
  • Programs 폴더는 빌드와 관련된 도구를 제공하며,
  • Rules 폴더는 빌드 규칙과 모듈 의존성을 관리한다.

이 폴더들은 엔진을 소스 코드 형태로 사용하거나 고급 기능을 사용하는 경우에 유용하며, 일반적인 게임 개발의 경우 Games 폴더에만 주로 작업하게 된다.


게임 개발의 기본적인 흐름

게임 개발에서 기본적인 흐름인 게임 초기화, 게임 루프, 게임 종료는 모든 게임의 핵심이다. 이 단계들은 게임이 실행되는 동안 시스템의 주요 구조를 정의한다.

1. 게임 초기화(Game Initialization)

  • 개념 :
    게임이 실행되면 가장 먼저 환경 설정리소스로드가 이루어지는 단계이다. 이 단계는 시스템의 준비 작업을 수행하고, 이후 게임 루프가 제대로 작동하도록 설정한다.
  • 주요 작업 :
    • 시스템 초기화 : 그래픽, 사운드, 네트워크, 입력 장치 등의 시스템을 초기화
    • 리소스 로드 : 모델, 텍스처, 오디오 파일 등의 에셋을 메모리에 로드
    • 게임 상태 설정 : 초기 게임 상태를 정의(예: 플레이어 위치, 맵 로드)
    • UI 준비 : 메뉴, 로딩 화면, HUD 등을 준비
  • 언리얼 엔진에서의 처리
    언리얼 엔진에서는 초기화 단계가 여러 시스템과 클래스에 의해 자동으로 처리된다.
    • GameInstance :
      • 언리얼에서 게임 초기화 로직은 GameInstance 클래스에서 많이 처리된다.
      • GameInstance는 게임의 전역적인 상태화 초기화 과정을 관리하며, 게임 실행 중에도 지속적을 유지된다.
    • Level Streaming :
      • 언리얼은 레벨 데이터를 레벨 스트리밍 방식으로 효율적으로 로드한다.
      • 이 과정에서 레벨이 메모리에 로드되며, 월드의 객체들이 생성된다.
    • Engine 초기화 :
      • 언리얼 엔진은 내부적으로도 그래픽 드라이버, 입력 장치 등 다양한 하위 시스템을 자동으로 초기화한다.
      • UEngine 클래스와 그 하위 시스템(UGameEngine, USkeletalMesh, 등)이 초기화를 담당한다.

2. 게임 루프(Game Loop)

  • 개념 :
    게임 실행의 중심. 프레임 단위로 반복되며, 게임의 모든 동작을 처리한다.
    게임 루프는 일반적으로 다음과 같은 순서로 이루어진다.
  1. 입력 처리 : 사용자의 입력(키보드, 마우스, 컨트롤러 등)을 감지
  2. 업데이트 : 게임 상태(물리, AI, 캐릭터 이동 등)를 업데이트
  3. 렌더링 : 화면에 그래픽을 그려 현재 상태를 시각적으로 표현
  • 주요 작업 :
    • Input Handling : 입력을 감지하고, 해당 데이터를 게임 로직에 전달
    • Game Logic : NPC, 플레이어, 아이템 행동과 상호작용 처리
    • Physics Update : 물리 연산(충돌 감지, 캐릭터 이동 등)
    • Rendering : 화면에 현재 상태를 그리기 위해 GPU 명령 실행
    • Audio Update : 사운드 출력을 갱신
  • 언리얼 엔진에서의 처리
    언리얼 엔진은 자체적으로 강력한 게임 루프 구조를 가지고 있다. 게임 루프는 엔진의 코어에 의해 처리된다.
    • Game Framework :
      • 언리얼의 핵심 GameMode 클래스는 게임 루프에서 전체적인 규칙을 정의한다.
      • PlayerController, Pawn, Actor와 같은 클래스들이 서로 상호작용하며 게임 로직을 처리한다.
    • Tick Function :
      • 언리얼의 Tick 함수는 모든 액터가 매 프레임 업데이트되도록 설계되어 있다.
      • 각 액터에서 특정 작업(예: 이동, 애니메이션)을 처리하는 로직을 구현할 수 있다.
      • Actor::Tick(float DeltaTime)은 각 프레임에서 호출되며, DeltaTime을 사용해 시간 기반 연산을 수행한다.
    • Rendering Pipeline :
      • 언리얼은 Render ThreadGame Thread를 분리하여 렌더링과 게임 로직을 병렬로 처리Render ThreadGame Thread를 분리하여 렌더링과 게임 로직을 병렬로 처리
    • Physics System :
      • 내장된 PhysX 또는 Chaos 물리 엔진을 사용하여 충돌, 물리 기반 시뮬레이션을 처리

3. 게임 종료(Game Termination)

  • 개념 :
    게임을 종료하는 단계로, 이 단계에서는 모든 리소스를 정리하고 메모리를 반환하여, 저장 작업을 처리한다.

  • 주요 작업 :

    • 게임 상태 저장 : 플레이어의 진행 상황(세이브 데이터) 저장
    • 리소스 해제 : 메모리에 로드된 에셋, 텍스처, 사운드 등 해제
    • 시스템 종료 : 네트워크 연결 종료, 그래픽 시스템 해제
    • 종료 처리 : 에플리케이션 종료 및 프로세스 정리
  • 언리얼 엔진에서의 처리
    언리얼은 Garbage Collector와 같은 메모리 관리 시스템을 통해 리소스를 정리하며, 시스템 종료를 처리한다.

    • GameInstance 종료 : GameInstance::Shutdown을 통해 게임 전체의 전역 상태를 정리
    • Level Unload : 종료 시 레벨 언로드 및 액터 메모리 정리
    • Garbage Collector : 언리얼의 GC 시스템은 사용하지 않는 오브젝트를 정리하며, 게임 종료 시 자동으로 실행된다.
    • 엔진 종료 : UEngine::Shutdown을 통해 언리얼 엔진의 모든 하위 시스템을 정리하고 종료한다.

언리얼의 구조와 게임 루프 연결

언리얼 엔진의 게임 실행 과정은 다음과 같이 구성된다.

  1. 시작
    UEngine::Init() --> GameInstance::Init() --> 첫 레벨 로드

  2. 루프

  • 게임 루프는 엔진의 Tick 함수에서 동작한다.
    • GameMode::Tick()
    • Actor::Tick()
  • 게임 로직과 렌더링, 물리 계산이 각 스레드에서 동작
  1. 종료
    GameInstance::Shutdown() --> UEngine::Shutdown() --> 애플리케이션 종료

정리

  • 게임 초기화 : 리소스 로드 및 환경 설정 (GameInstance, Engine 초기화)
  • 게임 루프: 매 프레임마다 입력, 업데이트, 렌더링을 반복(Tick, GameMode, Actor)
  • 게임 종료: 상태 저장, 리소스 해제, 시스템 정리(GameInstance::Shutdown, Garbage Collector)

언리얼 엔진은 이런 단계를 엔진 내부에서 대부분 자동으로 처리하며, 개발자는 GameMode, PlayerController, Actor와 같은 클래스에 로직을 구현하는 데 집중하면 된다.

참고문헌 :
1. https://dev.epicgames.com/community/unreal-engine/learning?types=course&languages=ko-kr 언리얼 공식 홈페이지
2. C++ 스크립트를 활용한 언리얼 엔진5 게임 개발 - 젠유 조리 리 지음

profile
Unreal 1기

0개의 댓글

관련 채용 정보