icon안동민 개발노트

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


 게임 인스턴스는 언리얼 엔진에서 게임 전체의 수명 주기 동안 존재하는 유일한 객체로, 전역 데이터 저장 및 관리에 이상적인 도구입니다.

게임 인스턴스의 개념과 역할

  • 정의 : 게임이 실행되는 동안 단 하나만 존재하는 객체
  • 역할
  1. 전역 데이터 저장소
  2. 레벨 간 데이터 유지
  3. 게임 전체 설정 관리
  4. 싱글톤 패턴 구현

게임 인스턴스 생성 방법

  1. 콘텐츠 브라우저에서 우클릭
  2. 'Blueprint Class' 선택 후 'Game Instance' 선택
  3. 게임 인스턴스 블루프린트 이름 지정 (예 : BP_MyGameInstance)
  4. 프로젝트 설정에서 생성한 게임 인스턴스 설정
게임 인스턴스 생성 및 설정 과정

전역 데이터 저장 및 접근

 게임 인스턴스를 사용하여 전역 변수를 저장하고 어디서든 접근할 수 있습니다.

 예 : 플레이어 점수 관리

Blueprint: BP_MyGameInstance
Variables:
  - PlayerScore (Integer)
 
Function: AddScore
[Get PlayerScore] --> [Add] --> [Set PlayerScore]
                       ^
                       |
               [Score to Add]
 
Function: GetScore
[Return PlayerScore]
 
Blueprint: Any Other Blueprint
Function: UpdateScore
[Get Game Instance] --> [Cast To BP_MyGameInstance]
                               |
                     [Call AddScore] <-- [Cast Succeeded]
게임 인스턴스를 통한 점수 관리 예시

레벨 간 데이터 유지

 게임 인스턴스는 레벨 전환 시에도 데이터를 유지합니다.

 예 : 레벨 간 인벤토리 유지

Blueprint: BP_MyGameInstance
Variables:
  - PlayerInventory (Array of InventoryItem Structure)
 
Function: SaveInventory
[Set PlayerInventory]
 
Function: LoadInventory
[Return PlayerInventory]
 
Blueprint: BP_PlayerCharacter
Event BeginPlay:
[Get Game Instance] --> [Cast To BP_MyGameInstance]
                               |
                     [Call LoadInventory] <-- [Cast Succeeded]
                               |
                   [Initialize Character Inventory]

싱글톤 패턴 구현

 게임 인스턴스는 자연스럽게 싱글톤 패턴을 구현합니다.

 예 : 오디오 관리자

Blueprint: BP_MyGameInstance
Function: GetAudioManager
[Return AudioManagerReference]
 
Blueprint: Any Blueprint
Function: PlaySound
[Get Game Instance] --> [Cast To BP_MyGameInstance]
                               |
                    [Get AudioManager] <-- [Cast Succeeded]
                               |
                         [Play Sound]
게임 인스턴스를 통한 싱글톤 패턴 구현

게임 인스턴스 초기화

 게임 실행 시 가장 먼저 호출되는 Init 함수를 활용하여 초기 설정을 수행할 수 있습니다.

Blueprint: BP_MyGameInstance
Event Init:
[Load Game Settings] --> [Initialize Subsystems]
                     --> [Set Default Variables]

주의해야 할 점

  1. 과도한 사용 자제
  • 모든 데이터를 게임 인스턴스에 저장하면 관리가 어려워질 수 있습니다.
  1. 메모리 관리
  • 게임 전체 수명 동안 유지되므로 불필요한 대용량 데이터 저장 주의
  1. 동시성 문제
  • 멀티스레드 환경에서 데이터 접근 시 동기화 고려
  1. 저장 및 로드
  • 게임 인스턴스 데이터의 저장 및 로드 메커니즘 구현 필요
  1. 테스트 어려움
  • 전역 상태로 인해 단위 테스트가 복잡해질 수 있음

효과적인 활용 사례

  1. 플레이어 프로그레스 추적
  • 레벨 간 유지되어야 하는 플레이어 상태 정보 저장
  1. 게임 설정 관리
  • 그래픽, 오디오 등 게임 전체 설정 저장 및 관리
  1. 글로벌 이벤트 시스템
  • 게임 전체에 영향을 미치는 이벤트 관리
  1. 세이브 시스템
  • 게임 저장 및 로드 기능 중앙 관리
  1. 디버그 모드 제어
  • 개발 중 디버그 플래그 및 도구 관리

예제 : 멀티레벨 퀘스트 시스템

Blueprint: BP_MyGameInstance
Variables:
  - ActiveQuests (Array of Quest Structure)
  - CompletedQuests (Array of Integer)
 
Function: StartQuest
[Check Quest Not Active] --> [Branch]
                               |
             [Add to ActiveQuests] <-- [True]
                               |
               [Notify Player] <-- [False]
 
Function: CompleteQuest
[Remove from ActiveQuests] --> [Add to CompletedQuests]
                            --> [Update Player Progress]
                            --> [Check for Rewards]
 
Blueprint: BP_QuestGiver
Function: OfferQuest
[Get Game Instance] --> [Cast To BP_MyGameInstance]
                               |
                      [Call StartQuest] <-- [Cast Succeeded]
 
Blueprint: BP_QuestObjective
Event OnInteract:
[Get Game Instance] --> [Cast To BP_MyGameInstance]
                               |
            [Check Active Quests] <-- [Cast Succeeded]
                               |
                  [Update Quest Progress]

 이 예제에서 게임 인스턴스는 여러 레벨에 걸쳐 있는 퀘스트의 상태를 추적하고 관리합니다. 퀘스트 제공자와 목표 오브젝트는 게임 인스턴스를 통해 퀘스트 정보에 접근하고 업데이트합니다.

 게임 인스턴스는 강력한 데이터 공유 및 관리 도구이지만, 신중하게 사용해야 합니다. 적절히 사용하면 게임 전체의 상태를 효과적으로 관리할 수 있지만, 과도하게 사용하면 코드의 응집도를 낮추고 유지보수를 어렵게 만들 수 있습니다. 게임의 규모와 요구사항에 따라 게임 인스턴스의 역할을 명확히 정의하고, 필요한 경우 다른 아키텍처 패턴과 조합하여 사용하는 것이 좋습니다.