
언리얼 엔진으로 월드 공간인 레벨에서 다른 레벨로 이동하는 기능을 구현하는 방법을 알아볼 것이다
우선 언리얼 엔진을 실행한 다음 템플릿을 삼인칭으로 선택하고 C++ 타입으로 프로젝트를 생성한다
프로젝트 생성이 완료되고 나면 기본 레벨은 이렇게 간단한 지형과 장애물이 배치되어 있는 형태를 하고 있을 것이다
이 맵의 바닥을 늘여주고 벽의 크기를 조절한 다음 복사해서 붙여 넣는 작업을 해서, 캐릭터가 진입할 수 있는 통로를 만들어주면 된다 통로를 만든 다음에는 현재 레벨 저장 버튼을 눌러서 레벨의 수정 사항을 저장해 준다
그다음에는 이 레벨에서 넘어갈 다른 레벨을 만들어보자
에디터의 상단 메뉴바에서 [File > New Level] 항목을 선택해서 새 레벨 창을 띄워준다
이 창에서는 새 레벨의 타입을 Basic으로 선택하고 레벨을 생성한다
레벨이 생성된 다음에는 비슷한 통로 형태를 만든 뒤에 나머지 영역을 적당하게 꾸며준다
그리고 플레이어가 진입로 지점에서 스폰될 수 있도록 Actor패널에서 [Basic > Player Start]를 끌어다 놓거나, Place Actors 패널에서 'Player Start'를 바로 끌어다 놓는다. 그러면 게임을 실행할 때 Player Start가 있는 위치에서 시작한다
레벨을 모두 꾸민 다음에는 왼쪽 위에 저장 버튼을 누른 후 SecondMap이라는 이름으로 레벨을 저장해 준다
(All > Content > ThirdPerson > Maps에 저장해 보자)
이제 콜리전에 플레이어가 닿으면 다른 레벨을 열어서 이동시키는 볼륨을 만들 차례이다
C++ 클래스 추가 창을 열고 Actor 클래스를 상속받아서 LevelTransferVolume이라는 이름으로 새 C++ 클래스를 생성한다
클래스 생성이 완료되고 나면 LevelTransferVolume 클래스의 헤더 파일로 이동한다
그리고 FString 타입으로 이 볼륨에 닿았을 때 불러올 씬의 이름을 저장할 TransferLevelName 변수와 캐릭터를 감지하는 콜리전으로 사용할 UBoxComponent 포인터 타입의 TransferVolume 변수를 선언해 준다
그리고 BoxComponent의 오브젝트 감지를 처리할 NotifyActorBeginOverlap 이벤트 함수도 선언해 준다
그다음에는 소스 파일로 이동해서 상단에 BoxComponent의 기능을 사용하기 위한 #include "Components/BoxComponent.h",
레벨 이동 함수를 사용하기 위한 #include "Kismet/GameplayStatics.h"를 include 선언한다
그리고 생성자 함수에서 TransferVolume을 초기화하는 코드를 작성 후 저장한다
(TransferVolume의 초기화 과정에서는 콜리전의 프로필 이름을 OverlapOnlyPawn으로 변경해서 이 콜리전이 폰만 감지하도록 만들어준다)
그 다음에는 NotifyActorBeginOverlap 함수를 구현하는데, 여기서는 볼륨에 와서 닿은 액터가 플레이어의 캐릭터일 때만 동작하도록 코드를 구현해야 한다
그렇지 않으면 볼륨에 몬스터나 NPC가 와서 닿아도 레벨이 이동되는 문제가 발생할 수도 있기 때문이다
이 삼인칭 예제 프로젝트에서 사용되는 플레이어의 캐릭터 클래스는 에디터로 돌아가서 C++ 클래스 폴더를 열어보면 찾을 수 있다
스크립트 에디터로 돌아가서 소스 파일의 상단에 캐릭터 클래스의 헤더를 include 선언해 준다
(본인의 경우에는 LevelMovementCharacter라고 되어있다)
그리고 NotifyActorBeginOverlap 함수를 구현한 후, 매개변수로 받은 OtherActor를 기본 캐릭터 클래스로 캐스팅하고,
캐스팅이 정상적으로 이루어졌다면 레벨을 이동시키도록 코드를 작성한다
(레벨 이동을 이동시키기 위해서는 UGameplayStatics 클래스의 정적 함수인 OpenLevel 함수를 사용하면 된다)
첫 번째 매개변수에는 GetWorld를 넣고 두 번째 매개변수에는 TransferLevelName을 FName 타입으로 변환해서 넣어준다
이것이 레벨을 이동하는 가장 기본적인 방법이다
코드를 모두 작성한 다음에는 저장하고 에디터로 돌아가서 컴파일한다
컴파일이 완료된 다음에는 [All > Content > ThirdPerson > Maps] 폴더에서 첫 번째 레벨을 연다
그리고 따로 만들어 둔 공간에 LevelTransferVolume을 끌어다 놓아 배치하고 크기를 맞춰준 후에, 디테일 패널에서 Level Transfer Volume 섹션에 있는 Transfer Level Name 프로퍼티를 SecondMap으로 설정해 준다
이렇게 하면 Transfer Level Name에 적힌 맵 이름으로 이동하게 된다
이제 게임을 플레이시키고 캐릭터를 조작하여 볼륨에 가서 닿으면 SecondMap으로 이동하는 모습을 볼 수 있다
VR게임 개발을 위한 언리얼엔진/C++ 공부한 내용 끄적이기...
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!