icon
4장 : 블루프린트 통신 기법

게임 인스턴스 활용 데이터 공유


지금까지 우리는 액터 블루프린트 간의 직접적인 통신 방법들을 살펴보았습니다. 하지만 게임 전체에서 유지되어야 하는 데이터나, 레벨이 변경되어도 사라지지 않고 지속되어야 하는 정보가 있다면 어떻게 해야 할까요? 예를 들어, 플레이어의 총 점수, 잠금 해제된 아이템 목록, 게임 설정(볼륨, 그래픽 품질) 등은 특정 레벨에 종속되지 않고 게임 세션 전체에 걸쳐 유지되어야 합니다.

이러한 종류의 데이터를 효율적으로 관리하고 공유하기 위해 언리얼 엔진은 게임 인스턴스(Game Instance) 라는 특별한 클래스를 제공합니다. 이번 절에서는 게임 인스턴스의 기본 개념과 이를 활용한 데이터 공유 방법에 대해 알아보겠습니다.


게임 인스턴스란 무엇인가?

게임 인스턴스(Game Instance) 는 언리얼 엔진에서 게임 세션이 시작될 때 생성되어 게임이 종료될 때까지 메모리에 유지되는 유일한(Singleton) 오브젝트입니다. 이는 메인 메뉴부터 게임 플레이, 레벨 전환, 다시 메인 메뉴로 돌아가는 등 게임의 모든 과정에 걸쳐 단 하나의 인스턴스만 존재합니다.

다른 주요 클래스들(예: Game Mode, Player Controller, HUD 등)은 레벨이 변경될 때마다 새로 생성되거나 파괴될 수 있지만, 게임 인스턴스는 그렇지 않습니다. 이러한 특성 때문에 게임 인스턴스는 다음과 같은 용도로 사용하기에 가장 적합합니다.

  • 게임 세션 전반에 걸쳐 유지되어야 하는 데이터 저장: 플레이어 점수, 인벤토리, 잠금 해제 상태, 게임 설정 등.
  • 레벨 간 데이터 전달: 특정 레벨에서 얻은 정보를 다음 레벨로 전달해야 할 때.
  • 글로벌 이벤트 디스패처: 게임 전체에 영향을 미치는 이벤트를 알릴 때.

커스텀 게임 인스턴스 생성 및 설정

기본적으로 언리얼 엔진은 UGameInstance라는 기본 게임 인스턴스 클래스를 사용합니다. 우리가 이 기능을 활용하려면 이 클래스를 상속받는 커스텀 게임 인스턴스 블루프린트를 생성하고, 프로젝트 설정에서 이를 사용하도록 지정해야 합니다.

  1. 커스텀 게임 인스턴스 블루프린트 생성

    • 콘텐츠 브라우저에서 마우스 오른쪽 버튼 클릭 > 블루프린트 클래스(Blueprint Class) 선택.
    • 모든 클래스(All Classes)를 펼친 후 GameInstance를 검색하여 선택합니다.
    • 이름을 지정합니다. (예: BP_MyGameInstance - 일반적으로 'BP_' 접두사를 사용합니다.)
  2. 프로젝트 설정에서 게임 인스턴스 지정

    • 언리얼 에디터 상단 메뉴에서 편집(Edit) > 프로젝트 세팅(Project Settings) 을 클릭합니다.
    • 좌측 패널에서 맵 & 모드(Maps & Modes) 섹션으로 이동합니다.
    • Game Instance 드롭다운 메뉴에서 여러분이 생성한 BP_MyGameInstance를 선택합니다.
    • 이제 게임이 시작될 때마다 BP_MyGameInstance의 인스턴스가 생성되어 사용될 것입니다.

게임 인스턴스를 통한 데이터 공유 예시

이제 BP_MyGameInstance에 데이터를 저장하고 다른 블루프린트에서 이 데이터에 접근하는 방법을 알아보겠습니다.

예시: 플레이어 점수 공유

  1. 게임 인스턴스에 변수 추가

    • BP_MyGameInstance 블루프린트 에디터를 엽니다.
    • 변수 패널에서 새 변수를 추가합니다.
    • 이름을 PlayerScore로 지정하고, 변수 타입을 Integer로 설정합니다.
    • 컴파일하고 저장합니다.
  2. 플레이어 캐릭터에서 점수 증가 및 저장

    • BP_PlayerCharacter 블루프린트를 엽니다.
    • Event BeginPlay 뒤에 Get Game Instance 노드를 추가합니다.
    • Get Game Instance의 출력 핀에서 드래그하여 Cast To BP_MyGameInstance 노드를 연결합니다. (안정성을 위해 IsValid 노드를 추가하여 캐스팅 성공 여부를 확인하는 것이 좋습니다.)
    • Cast To BP_MyGameInstanceAs BP My Game Instance 출력 핀을 변수로 승격시켜 저장해두면 편리합니다. (예: MyGameInstanceRef)
    • 이제 플레이어가 적을 처치하거나 아이템을 획득했을 때 점수를 증가시키는 로직을 만듭니다. 예를 들어, F 키를 누를 때마다 점수가 10점씩 증가하도록 해봅시다.
      • Event F 키 입력 노드를 추가합니다.
      • MyGameInstanceRef 변수(Get 노드)에서 드래그하여 Get PlayerScore 노드를 가져옵니다.
      • Get PlayerScore의 출력 값을 + 연산자로 10과 더합니다.
      • MyGameInstanceRef 변수(Get 노드)에서 드래그하여 Set PlayerScore 노드를 가져와 + 연산 결과 값을 연결합니다.
      • Print String 노드를 사용하여 현재 점수를 화면에 출력하여 확인합니다.
  3. 다른 레벨에서 점수 불러오기

    • 새로운 레벨(예: Level_2)을 생성하고 저장합니다.
    • BP_PlayerCharacterLevel_2에 배치합니다.
    • BP_PlayerCharacterEvent BeginPlayGet Game InstanceCast To BP_MyGameInstance를 통해 MyGameInstanceRef를 가져오는 로직을 다시 만듭니다.
    • MyGameInstanceRef에서 Get PlayerScore를 호출하여 Print String으로 점수를 출력하도록 합니다.
    • 메인 레벨에서 F 키를 눌러 점수를 올린 후, 다른 레벨로 이동하는 로직을 추가합니다. (예: Open Level (by Name) 노드 사용)
    • 게임을 플레이하며 점수를 올린 후, 레벨을 변경하면 변경된 레벨에서도 이전 점수가 그대로 유지되어 출력되는 것을 확인할 수 있습니다.

게임 인스턴스 활용 시 고려사항

  • 데이터의 영속성: 게임 인스턴스에 저장된 데이터는 게임이 완전히 종료되기 전까지 유지됩니다. 이는 레벨 전환 시 데이터가 사라지는 것을 방지하는 데 매우 유용합니다.
  • 글로벌 접근성: 어떤 블루프린트에서든 Get Game Instance 노드를 통해 게임 인스턴스에 접근할 수 있습니다. 이는 게임 전반에 걸쳐 공유되어야 하는 데이터에 대한 중앙 집중식 접근점을 제공합니다.
  • 과도한 사용 지양: 게임 인스턴스는 매우 강력한 도구이지만, 모든 데이터를 게임 인스턴스에 저장하는 것은 좋지 않습니다. 특정 레벨에만 필요한 데이터나, 특정 액터에만 국한된 데이터는 해당 레벨이나 액터 내부에 관리하는 것이 더 효율적입니다. 게임 인스턴스는 정말로 게임 세션 전반에 걸쳐 유지되어야 하는 '글로벌' 데이터에만 사용하는 것이 좋습니다.
  • 초기화 시점: Event Init는 게임 인스턴스가 생성될 때 가장 먼저 호출되는 이벤트이며, Event Start는 게임이 시작될 때 호출됩니다. Event Init는 게임 인스턴스 자체의 초기화에, Event Start는 게임 플레이 시작 시점에 필요한 초기화에 사용될 수 있습니다.

게임 인스턴스는 언리얼 엔진에서 게임의 '상태'를 관리하고 레벨 간에 데이터를 원활하게 공유하는 데 필수적인 개념입니다. 이를 통해 더욱 견고하고 확장 가능한 게임 시스템을 구축할 수 있습니다.


이번 절에서는 게임 인스턴스의 개념과 이를 활용한 데이터 공유 방법에 대해 알아보았습니다. 이로써 4장 '블루프린트 통신 기법'의 주요 내용을 모두 다루었습니다.