- Unreal Engine Game Instance
- Отличия Game Instance от других классов
- Как создать и подключить класс Game Instance в Анрил Энджин
- Как получить пользовательский класс экземпляра игры. Функция Get Game Instance
- Практика GameInstance. Сохраняем выбранного персонажа между загрузкой разных уровней
- Переоткрытие уровня в Unreal Engine
- Создание пользовательского класса экземпляра игры
- Установка сохранённого персонажа из Game Instance
- Смена персонажа и его сохранение в GameInstance UE5 (UE4)
Друзья, приветствую, с Вами Будуев Антон. В данной статье мы обсудим 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». Также отсутствует возможность добавлять компоненты.
А всё потому, что 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 в Анрил Энджин
Чтобы создать свой собственный класс экземпляра игры, откройте Content Browser и щелкните правой кнопкой мыши по пустому пространству. В появившемся контекстном меню выберите опцию «Blueprint Class». В открывшемся окне «Pick Parent Class» введите в поисковую строку «Game Instance». После этого выделите класс «GameInstance» и нажмите «Select». В результате в текущей папке Content Browser будет создан ассет, представляющий базовый класс экземпляра игры.
Чтобы подключить свой пользовательский класс экземпляра игры, перейдите в свойства проекта «Edit» / «Project Settings», раздел «Maps & Modes» и далее в опции «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).
Скриншот
Код на BlueprintUE
Также можно получить доступ к пользовательскому GameInstance через Blueprint Interface. Этот вариант более предпочтителен, хотя и немного сложнее. Для этого необходимо создать новую интерфейсную функцию «Get Custom Game Instance» и реализовать её в пользовательском классе состояния игры «CustomGameInstance».
Скриншот
Код на BlueprintUE
Практика GameInstance. Сохраняем выбранного персонажа между загрузкой разных уровней
Итак, давайте рассмотрим практическое применение класса Game Instance в Unreal Engine. Как я уже упоминал ранее, основная цель этого класса — сохранить информацию между загрузками уровней.
Так вот, задача заключается в том, чтобы на текущем игровом уровне выбрать одного из двух персонажей: мужчину «SKM_Manny» или женщину «SKM_Quinn». Причём этот выбор должен сохраниться при переходе на следующий уровень игры.
Переоткрытие уровня в Unreal Engine
Для простоты описания кода в этой статье мы рассмотрим процесс загрузки различных уровней, используя для этого один и тот же уровень под названием «ThirdPersonMap», который является частью стандартного шаблона игры от третьего лица в Unreal Engine. Чтобы упростить процесс, мы будем постоянно открывать этот уровень заново.
Для этого во вкладке «Event Graph» персонажа «BP_ThirdPersonCharacter» мы добавим ноду «Open Level», которая будет отвечать за переоткрытие уровня «ThirdPersonMap» при нажатии клавиши «L».
Создание пользовательского класса экземпляра игры
Чтобы иметь возможность переносить выбранного персонажа между уровнями, создадим свой собственный класс экземпляра игры «CustomGameInstance». В этом классе определим новую переменную «SkeletalMesh» типа «SkeletalMeshObject». Именно в этой переменной мы и будем хранить нашего персонажа внутри экземпляра игры. Установим для этой переменной значение по умолчанию, выбрав ассет женского персонажа «SKM_Quinn».
Установка сохранённого персонажа из Game Instance
Каждый раз при загрузке нового уровня мы будем считывать значение переменной «SkeletalMesh» из «CustomGameInstance» и устанавливать его в Mesh текущего персонажа «BP_ThirdPersonCharacter».
Для решения этой задачи идеально подойдёт функция «Construction Script» внутри «BP_ThirdPersonCharacter». Поскольку она активируется только один раз — в момент размещения объекта на уровне. А наш персонаж как раз появляется на уровне во время его загрузки.
Итак, в «Construction Script» обратимся к базовому классу «Game Instance». С помощью приведения типа (cast) преобразуем его в «Custom Game Instance». Затем получим доступ к переменной «Skeletal Mesh», которая хранится внутри нашего игрового экземпляра. И, наконец, присвоим значение этой переменной компоненту Mesh текущего персонажа «BP_ThirdPersonCharacter».
Таким образом, каждый раз, когда мы загружаем новый уровень, персонаж будет автоматически восстанавливаться из ранее сохранённой переменной в рамках экземпляра игры.
Скриншот
Код на BlueprintUE
Смена персонажа и его сохранение в GameInstance UE5 (UE4)
Затем во вкладке «Event Graph» персонажа «BP_ThirdPersonCharacter» назначим на клавишу «C» процесс изменения пола персонажа с женского на мужской и обратно. Это изменение будет сохранено в переменной «SkeletalMesh» внутри класса «Custom GameInstance».
Нода «Flip Flop» будет обрабатывать нажатие на клавишу «C», и при каждом последующем нажатии попеременно запускать код, устанавливающий то мужской, то женский пол.
Сам процесс установки персонажа будет похож на код из «Construction Script», который мы уже рассмотрели ранее. Однако вместо того, чтобы читать значение переменной, мы будем сохранять выбранного персонажа в этой переменной. И после уже устанавливать этого персонажа в компоненте Mesh в «BP_ThirdPersonCharacter».
Скриншот
Код на BlueprintUE
Таким образом, используя класс GameInstance, мы сохраняем нашего персонажа в переменной «SkeletalMesh», что позволяет нам затем загружать его на разных уровнях игры.
На этом наша статья подходит к концу. Мы обсудили класс Game Instance, который в Unreal Engine (UE4, UE5) служит для сохранения информации между загрузками уровней. Также рассмотрели практический пример его использования для сохранения выбранного персонажа между различными игровыми уровнями.