Game Instance — класс экземпляра игры в Unreal Engine. Функция Get Game Instance

Друзья, приветствую, с Вами Будуев Антон. В данной статье мы обсудим Game Instance, Blueprint-класс экземпляра игры в Unreal Engine (UE4, UE5). А также на практике разберём пример использования этого класса для сохранения выбранного персонажа между загрузкой разных игровых уровней.

Unreal Engine Game Instance

Когда мы запускаем игру (исполняемый файл exe), движок Unreal Engine создает в оперативной памяти компьютера уникальный объект Game Instance, который является экземпляром данной игры. Этот объект существует на протяжении всей игры и удаляется из памяти только после её завершения.

Game Instance не изменяется при переходе между игровыми уровнями или картами. Это позволяет ему оставаться постоянным на протяжении всего игрового процесса, что делает его идеальным местом для хранения и управления информацией, которая должна быть доступна в любой момент времени, независимо от того, какие уровни или карты загружаются в игре.

Проще говоря, Game Instance — это единственный класс в Анрил Энджин, который Вы можете использовать для сохранения любой информации, необходимой для передачи между разными уровнями.

Отличия Game Instance от других классов

Первое и самое главное отличие от других классов мы уже обсудили — Game Instance единственный класс, который существует на протяжении всей игры, не изменяется и не удаляется, пока игра не закончится.

Ещё одно отличие — это небольшое изменение в редакторе блюпринтов. В нём отсутствуют стандартные вкладки «Construction script» и «Viewport». А имеется только одна, но очень важная — «Event Graph». Также отсутствует возможность добавлять компоненты.

Blueprint class GameInstanceА всё потому, что Game Instance — унаследован напрямую от класса Object. Соответственно, он не является дочерним классом от Actor, как большинство других Blueprint классов и не содержит в себе стандартных, унаследованных от него элементов.

Также в классе игрового экземпляра во вкладке «Event Graph» Вы не найдете большинство стандартных событий, таких, как «Event BeginPlay», «Event Tick» и многих других. Всего же в нём находятся 5 событий:

  • Add Custom Event — стандартное пользовательское событие;
  • Event Init — событие, срабатывающее при инициализации Game Instance. Аналог обычного «Event BeginPlay»;
  • Event NetworkError — событие, срабатывающее при сетевых ошибках;
  • Event Shutdown — событие, срабатывающее при завершении работы класса игрового экземпляра;
  • Event TravelError — обработчик ошибок перемещения.
Отличия Game Instance от других классов Unreal Engine
Отличия Game Instance от других классов Unreal Engine

Как создать и подключить класс Game Instance в Анрил Энджин

Чтобы создать свой собственный класс экземпляра игры, откройте Content Browser и щелкните правой кнопкой мыши по пустому пространству. В появившемся контекстном меню выберите опцию «Blueprint Class». В открывшемся окне «Pick Parent Class» введите в поисковую строку «Game Instance». После этого выделите класс «GameInstance» и нажмите «Select». В результате в текущей папке Content Browser будет создан ассет, представляющий базовый класс экземпляра игры.

Создание пользовательского blueprint класса GameInstance в Unreal Engine (UE4, UE5)
Создание пользовательского blueprint класса GameInstance в Unreal Engine (UE4, UE5)

Чтобы подключить свой пользовательский класс экземпляра игры, перейдите в свойства проекта «Edit» / «Project Settings», раздел «Maps & Modes» и далее в опции «Game Instance» установите свой класс экземпляра игры.

Установка пользовательского класса Game Instance в Анрил Энджин
Установка пользовательского класса Game Instance в Анрил Энджин

Как получить пользовательский класс экземпляра игры. Функция Get Game Instance

Функция Get Game InstanceФункция «Get Game Instance» — возвращает ссылку на объект базового родительского класса GameInstance.

Так как возвращается ссылка на базовый родительский класс движка Unreal Engine, необходимо данную ссылку при помощи Cast (каста) привести к типу Вашего пользовательского класса экземпляра игры, чтобы получить доступ ко всем его функциям и переменным.

Ниже представлен Blueprint-код, где с помощью ноды «Get Game Instance» мы получаем ссылку на объект базового экземпляра игры. Затем, используя функцию приведения типов «Cast to CustomGameInstance», преобразуем эту ссылку в наш пользовательский объект «CustomGameInstance». И сохраняем его в переменной «As Custom Game Instance». Таким образом, в этой переменной мы получили пользовательский объект экземпляра игры в UE5 (UE4).

Получаем текущий «CustomGameInstance» с использованием каста «Cast to CustomGameInstance»
Получаем текущий «CustomGameInstance» с использованием каста «Cast to CustomGameInstance»

Также можно получить доступ к пользовательскому GameInstance через Blueprint Interface. Этот вариант более предпочтителен, хотя и немного сложнее. Для этого необходимо создать новую интерфейсную функцию «Get Custom Game Instance» и реализовать её в пользовательском классе состояния игры «CustomGameInstance».

Получаем текущий «CustomGameInstance» с использованием пользовательской интерфейсной функции «Get Custom Game Instance»
Получаем текущий «CustomGameInstance» с использованием пользовательской интерфейсной функции «Get Custom Game Instance»

Практика GameInstance. Сохраняем выбранного персонажа между загрузкой разных уровней

Итак, давайте рассмотрим практическое применение класса Game Instance в Unreal Engine. Как я уже упоминал ранее, основная цель этого класса — сохранить информацию между загрузками уровней.

Так вот, задача заключается в том, чтобы на текущем игровом уровне выбрать одного из двух персонажей: мужчину «SKM_Manny» или женщину «SKM_Quinn». Причём этот выбор должен сохраниться при переходе на следующий уровень игры.

Переоткрытие уровня в Unreal Engine

Для простоты описания кода в этой статье мы рассмотрим процесс загрузки различных уровней, используя для этого один и тот же уровень под названием «ThirdPersonMap», который является частью стандартного шаблона игры от третьего лица в Unreal Engine. Чтобы упростить процесс, мы будем постоянно открывать этот уровень заново.

Для этого во вкладке «Event Graph» персонажа «BP_ThirdPersonCharacter» мы добавим ноду «Open Level», которая будет отвечать за переоткрытие уровня «ThirdPersonMap» при нажатии клавиши «L».

Открытие нового уровня "ThirdPersonMap" в Unreal Engine по нажатию на клавишу "L"
Открытие нового уровня «ThirdPersonMap» в Unreal Engine по нажатию на клавишу «L»

Создание пользовательского класса экземпляра игры

Чтобы иметь возможность переносить выбранного персонажа между уровнями, создадим свой собственный класс экземпляра игры «CustomGameInstance». В этом классе определим новую переменную «SkeletalMesh» типа «SkeletalMeshObject». Именно в этой переменной мы и будем хранить нашего персонажа внутри экземпляра игры. Установим для этой переменной значение по умолчанию, выбрав ассет женского персонажа «SKM_Quinn».

Переменная SkeletalMesh внутри пользовательского класса CustomGameInstance
Переменная SkeletalMesh внутри пользовательского класса CustomGameInstance

Установка сохранённого персонажа из Game Instance

Каждый раз при загрузке нового уровня мы будем считывать значение переменной «SkeletalMesh» из «CustomGameInstance» и устанавливать его в Mesh текущего персонажа «BP_ThirdPersonCharacter».

Для решения этой задачи идеально подойдёт функция «Construction Script» внутри «BP_ThirdPersonCharacter». Поскольку она активируется только один раз — в момент размещения объекта на уровне. А наш персонаж как раз появляется на уровне во время его загрузки.

Итак, в «Construction Script» обратимся к базовому классу «Game Instance». С помощью приведения типа (cast) преобразуем его в «Custom Game Instance». Затем получим доступ к переменной «Skeletal Mesh», которая хранится внутри нашего игрового экземпляра. И, наконец, присвоим значение этой переменной компоненту Mesh текущего персонажа «BP_ThirdPersonCharacter».

Таким образом, каждый раз, когда мы загружаем новый уровень, персонаж будет автоматически восстанавливаться из ранее сохранённой переменной в рамках экземпляра игры.

При открытии нового уровня загружаем персонажа из сохраненной переменной внутри Game Instance
При открытии нового уровня загружаем персонажа из сохраненной переменной внутри Game Instance

Смена персонажа и его сохранение в GameInstance UE5 (UE4)

Затем во вкладке «Event Graph» персонажа «BP_ThirdPersonCharacter» назначим на клавишу «C» процесс изменения пола персонажа с женского на мужской и обратно. Это изменение будет сохранено в переменной «SkeletalMesh» внутри класса «Custom GameInstance».

Нода «Flip Flop» будет обрабатывать нажатие на клавишу «C», и при каждом последующем нажатии попеременно запускать код, устанавливающий то мужской, то женский пол.

Сам процесс установки персонажа будет похож на код из «Construction Script», который мы уже рассмотрели ранее. Однако вместо того, чтобы читать значение переменной, мы будем сохранять выбранного персонажа в этой переменной. И после уже устанавливать этого персонажа в компоненте Mesh в «BP_ThirdPersonCharacter».

Практика GameInstance. Сохраняем в Unreal Engine (UE4, UE5) выбранного персонажа между загрузкой разных уровней
Практика GameInstance. Сохраняем в Unreal Engine (UE4, UE5) выбранного персонажа между загрузкой разных уровней

Таким образом, используя класс GameInstance, мы сохраняем нашего персонажа в переменной «SkeletalMesh», что позволяет нам затем загружать его на разных уровнях игры.

На этом наша статья подходит к концу. Мы обсудили класс Game Instance, который в Unreal Engine (UE4, UE5) служит для сохранения информации между загрузками уровней. Также рассмотрели практический пример его использования для сохранения выбранного персонажа между различными игровыми уровнями.

Оцените статью
( 1 оценка, среднее 5 из 5 )
Unreal Engine - это просто
Добавить комментарий

Нажимая на кнопку "Отправить комментарий", я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.