Войти
Unreal EngineФорумBlueprints

UE4: перемещение между локациями

#0
18:36, 6 авг. 2018

У меня есть два уровня, между которыми можно перемещаться через две двери. Если я прошел через дверь №1, то мне нужно на другом уровне появиться возле нее, аналогично с дверью №2.
Как это сделать? Нужно более одного Player Start и как-то между ними переключаться?

2 | UE4: перемещение между локациями

Вот как я сделал. Если игрок нажимает на блупринт (box collider), то загружается новый уровень.

PlayerContrller:
И здесь еще один вопрос. У меня есть блупринт открытия/закрытия дверцы шкафа. Он точно такой, как на скриншоте ниже, отличие только в блоке, выделенным красным. Мне обязательно каждый раз все это копировать, или можно как-то совместить?
Изображение

Сам блупринт bp_loadLevel
4 | UE4: перемещение между локациями


#1
7:56, 7 авг. 2018

1) Для того что бы ты мог перемещаться через двери тебе нужно передать в загруженный уровень в какую дверь тебе нужно попасть, самый простой способ это сделать через GameInstance (читай хелп). Т.е. ты создашь переменную в GameInstance в которую будешь писать перед загрузкой лвла в какую дверь тебе нужно. После загрузки уровня ты читаешь эту переменную и перемещаешь перса в нужную тебе точку (сделать это можно разными способами, через левел блупринт, через просто блупринт ... SetWorlLocation, SetActorLocation ...).
2)
dmitrykozyr
> Мне обязательно каждый раз все это копировать, или можно как-то совместить?
Не обязательно, ты сейчас делаешь все через Cast - т.е. обращаешься к каждому объекту (блупринту) по имени, тебе создать BlueprintInterface добавить в нужные блупринты и юзать вместо Cast (то что ты красным выделил), а InteractWithObject вызывать уже в самом блупринте (про интерфейсы читай хелп).

P.S.
В общем изучай двиг.
Если будет совсем тухло, пиши, разберу детально (но в начале попробуй сам разобраться, а то так далеко не уедешь).

#2
14:28, 7 авг. 2018

С BlueprintInterface вроде разобрался. Я сохраняю значение в переменную интерфейса (или как это называется), а затем вызывается тот EventInteract, который закреплен за объектом, на который я нажал.

Изображение

А вот с GameInstance не очень понятно. Создал свой GameInstance и в настройках проекта его выбрал. Добавил туда переменную, которая должна сохранять состояние после загрузки нового уровня. Но почему-то после загрузки ее содержимое на экран не выводится.

Обновлено
Я этот блупринт забыл на второй сцене разместить. Но теперь все-равно не работает. Может, это нужно делать в LevelBlueprint?

Изображение
#3
18:28, 7 авг. 2018

А он у тебя при старте не переписывается на "пустое значение" - у тебя же в одном и том же блупринте на Begin стоит, там же сразу после запуска пусто наверное.
При старте инстанс же пустой?
Ты из него берешь "пусто" и пишешь в DoorNumber.
А потом когда нажимаешь на кнопку, из "пустого" DoorNumber кладешь в GameInstance, и там теперь тоже пусто.
А после этого ты грузишь левел - верно?

На EventBegin - убери запись в DoorNumber - сразу в принт стринг шли.

#4
21:01, 7 авг. 2018

Убрал, после этого заработало. Я теперь для каждой двери ставлю такой блупринт с коллайдером и прописываю название двери.
В зависимости от него загружаю нужный уровень и располагаю игрока по заданным координатам.
Это не слишком криво?

Изображение
#5
9:05, 8 авг. 2018

dmitrykozyr
> Это не слишком криво?
Нормально. Работает ведь как часы, и не заморочено.

Можно сделать блупринты с переменными которые бы ты выбирал после установки блупринта, тогда бы можно было не использовать Switch, и не менять код каждый раз. С координатами куда будет переноситься игрок тоже самое, можно создать переменную и сделать ее видимой из редактора, расставлять для нее Target point, а его выбирать пипеткой для переменной, а с таргет поинта брать GetWorlLocations. Такую систему можно уже переносить из проекта в проект, не забывая создавать в нем GameInstance.

А улучшать можно все бесконечно, добавить стриминг уровней, что бы первая загрузка была чуть длиннее, зато все уровни в которые будешь переходить будут грузиться почти мгновенно, потом добавить затемнение экрана на триггер, и выход из тенго при входе в карту (сиквенсером), при входе добавить звук двери или лифта, на время затемнения отключать контроллер. Я бы советовал это сделать когда делать нечего будет.
Ты кросс - освоил новое, и внедрил.

#6
9:09, 8 авг. 2018

Ясно, попробую, спасибо)

#7
11:26, 8 авг. 2018

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

#8
10:04, 10 авг. 2018

А кто знает, почему в блоке SetActorLocationAndRotation из последнего скриншота не срабатывает вращение? Игрок перемещается, но не вращается почему-то

#9
1:04, 12 авг. 2018

Если вид от первого лица, то за вращение отвечает PlayerController

#10
10:45, 12 авг. 2018

BingoBongo
> Если вид от первого лица, то за вращение отвечает PlayerController


Поменял на PlayerController, но ругается, что FPS (который мне нужно перемещать) от него не наследуется

Изображение
#11
11:33, 12 авг. 2018

Ура, разобрался. Вот как нужно было (наверху)

Изображение
Unreal EngineФорумBlueprints

Тема в архиве.