언리얼엔진 UE5

[UE5] 게임 인스턴스와 게임 모드

jenny330 2023. 5. 30. 17:04

언리얼은 유니티랑은 정말 다르고 지원하는 기능도 많아서 개념을 잘 이해하고 활용하는 게 정말 중요하다.

처음에 헤매던 나에게 대충 감을 잡을 수 있게 해준 별거 아니지만 꽤 도움되는 구조에 대해 정리해보려고 한다. 

 

게임 모드 (Game Mode)

게임 모드(Game Mode)는 게임 속에서 다양한 설정을 바꿔 낄 수 있는 기본적인 세팅이라고 보면 된다.

 

ex)

- 이지 모드에서는 input을 1가지만 받아오지만, 하드 모드에서는 input을 2가지 받아온다.

- 레벨 1은 캐릭터A로 플레이하지만, 레벨 2는 캐릭터B로 플레이한다.

- (주로 콘솔게임에서) 메뉴 화면에서의 클릭과 플레이화면에서의 발사 input이 A키로 중복된다. 

등등... 

 

이런 부분을 일일히 if문으로 구분하는 건 말도 안되고, 따라서 이걸 각각 하나의 설정으로 묶는 역할을 해 주는 게 바로 게임 모드다. 

일반적으로 게임 모드는 레벨별로 1개씩 만들어두면 좋다! (레벨 자체에서 어떤 게임모드를 사용할지 할당해줄 수 있기 때문)

 

참고: https://docs.unrealengine.com/4.27/ko/InteractiveExperiences/HowTo/SettingUpAGameMode/ 

 

 

 

게임모드는 아래와 같이 블루프린트 클래스로 간단하게 생성할 수 있다.

 

 

생성을 해 보면 이렇게 생겼다. 

 

 

여기서 확인할 부분은 오른쪽의 디테일 패널이다.

 

 

 

 

이런 식으로 여러 가지 세팅을 해 줄 수 있다. 

이런저런 어려운 용어가 많은데 아마 거의 주로 사용하는 건 디폴트 폰 클래스와 플레이어 컨트롤러 클래스이다.

 

디폴트 폰 클래스: 이 게임모드는 어떤 캐릭터로 플레이할 건지

플레이어 컨트롤러: 주로 input을 이곳에 정리한다. 

 

 

 

게임 모드 Game Mode 할당하기

게임 모드 할당하는 방식에는 일단 크게 두 가지가 있다. 

 

1. 프로젝트 전체에서 설정해주기

 

Edit > Project Settings 에서 "game mode"를 검색하면 그냥 바로 이렇게 설정해줄 수 있다! 

단, 아까 언급했듯이 보통 레벨별로 1개씩의 게임 모드를 일일히 설정해주는 게 편하기 때문에.. 이 방법은 아마도 테스트나 연습용으로 빠르게 설정해야 할 때만 쓰일 거다.

 

 

2. 레벨별로 설정해주기 

이것도 간단하다.

 

 

왼쪽 위에 레벨 블루프린트를 열어주면 게임모드 설정하는 부분이 있다. 원하는 걸로 설정해주면 끝.

이렇게 하면 그 레벨을 플레이할 때 자동으로 해당 게임모드로 플레이하게 된다.

 

 

 

게임 인스턴스 (Game Instance)

아무튼 레벨별로 게임모드를 잘 설정하면 된다는 것을 확인했다. 

이제 이렇게 만든 레벨들을 하나의 유기적인 게임으로 연결해 줄 다리가 필요하다. 이건 게임 인스턴스의 역할이다. 

유니티에서도 인스턴스가 같은 용도로 사용되기 때문에 그걸 생각하면 바로 이해가 될 것 같다. 

 

즉, 게임 인스턴스 (Game Instance) 란 게임에서 변하지 않는 값, 혹은 저장하거나 기억해야 할 값들을 컨트롤하는 곳이다.

그렇기 때문에 당연히 하나의 게임에는 하나의 게임 인스턴스가 존재하는 것이 일반적이다.

 

ex)

- 레벨1에서 플레이어가 획득한 코인 개수를 레벨2에서도 기억하고 있어야 한다. 

- bgm이 레벨 이동 시 끊기지 않고 자연스럽게 이어져야 한다.

 

 

그럼 게임 인스턴스를 생성해 보자. 

블루프린트 생성을 클릭하면 다음과 같은 화면이 뜬다. 

 

 

 

게임 인스턴스는 게임 모드와 다르게 아래의 검색창에 "game instance"라고 검색을 해 주어야 찾을 수 있다. 아니면 그냥 스크롤을 내려서 찾아도 된다. 

 

 

 

클릭해서 생성해 보면 다음과 같은 화면이다. 

 

 

 

일반적인 블루프린트보다는 좀 휑한 것 같다. 

 

하지만 코드 짜고 변수 관리하는 건 다른 블루프린트와 완전히 똑같다!

그냥 왼쪽의 변수 항목에서 변수를 만들고 함수를 생성해서 실행하면 된다. 

 

 

이 게임에 게임 인스턴스 할당해주기

만들었으면 이제 활용해 줄 차례이다. 

아까와 같이 Edit > Project Settings를 열어본다. 

 

 

"game instance"를 검색해서 본인이 만든 인스턴스 블루프린트를 넣어준다! 

(협업 시 아무것도 작동하지 않는다면 게임 인스턴스가 제대로 적용되었는지 확인해볼 것...)

 

 

다른 블루프린트에서 게임 인스턴스 사용하기

게임 인스턴스는 게임 당 한 개이기 때문에 언제 어디서든 호출하기 굉장히 편하다. 

블루프린트를 아무거나 하나 열어보겠다. 

 

get game instance로 인스턴스를 가져와주자.

 

 

 

 

그리고 나서 만들어 둔 게임 인스턴스 블루프린트의 이름으로 형변환해주면 된다. 

당연한 말이지만 인스턴스 이름을 아래처럼 new blueprint 같은 걸로 하면 절대절대 안됨... 나중에 엄청 헷갈릴 수 있다. 

 

 

 

이렇게 하면 끝이다!! 그냥 가져다가 쓰면 된다. 

get game instance로 호출하면 바로 내 인스턴스가 불러와지는 이유는... 프로젝트 세팅에서 설정해주었기 때문!

 

 

 

추가적으로 게임 인스턴스는 블루프린트 내에서 쓸 일이 엄청 많기 때문에 그냥 변수로 넣어주면 편하다.

 

여기에서 이제 변수를 선언하고 변수를 재할당해주고 어떤 짓을 해도 게임 인스턴스가 그걸 모두 기억하고 저장해 준다. 

 

 

정리

게임 모드: 레벨별로 1개씩 생성. pawn과 player controller를 지정해줄 수 있다. 

게임 인스턴스: 게임당 1개씩만 존재. 유저 데이터 등을 저장한다. 

 

 

 

 

참고자료: 

https://www.youtube.com/watch?v=0pAhqA2Sgto&t=187s