ФЭНДОМ


Операции с уровнями Править

Открытие нового уровня Править

Для собственно открытия уровня достаточно одного оператора:

   UGameplayStatics::OpenLevel(this, TEXT("Start_Map"));

Первый параметр — так называемый WorldContextObject, из которого метод UEngine::GetWorldFromContextObject может получить текущий мир. В качестве него годится любой объект, существующий в мире.

Однако метод OpenLevel лишь инициирует процесс загрузки нового уровня; сама загрузка происходит асинхронно (возможно, вообще в другом потоке). Если после загрузки уровня необходимо предпринять какие-либо действия (например, программно разместить актёров), необходимо воспользоваться делегатом, уведомляющим о завершении загрузки. Это делается следующим образом.

1. Заводится переменная, которая продолжает существовать в промежутке времени между выполнением функции, запрашивающей загрузку уровня, и вызовом функции, обрабатывающей событие завершения загрузки. Обычно это будет поле класса.

2. В функции, запрашивающей загрузку уровня, создаётся привязка к делегату функции, которая будет вызвана по окончании загрузки:

   Load_Map_Delegate = FCoreUObjectDelegates::PostLoadMap.AddUObject(this, &ThisClass::Post_Load_Map);
   UGameplayStatics::OpenLevel(this, TEXT("Start_Map"));

В данном случае:

  • Load_Map_Delegate — переменная, в которой сохраняется ссылка на привязку функции к делегату;
  • this — указатель на экземпляр класса UObject или его потомка, в котором определена функция, вызываемая по завершении загрузки;
  • ThisClass::Post_Load_Map — функция, которая должна быть вызвана по завершении загрузки. Предполагается, что функция, запрашивающая загрузку, находится в этом же классе ThisClass, поскольку предыдущим параметром был this, однако это не обязательно.

3. В функции, вызываемой по завершении загрузки карты, помимо действий, относящихся к игровой логике, добавляется оператор, отвязывающий эту функцию от делегата:

   FCoreUObjectDelegates::PostLoadMap.Remove(Load_Map_Delegate);

Если этой функции необходимо узнать, какая карта была загружена, она должна обратиться к текущему контексту мира (структура типа FWorldContext), а точнее, к её полю URL. Загрузка карт выполняется последовательно, поэтому это поле будет относиться к последней загруженной карте.