![언리얼5-18 C++ <장애물 피하기(4) - 마무리[1]>](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhFG2K%2FbtsJETIVyRc%2F4nzTuKQwmAXRgkA6M07B50%2Fimg.png)
이번에는 장애물들을 더 다양하게 배치하여 목표지점에 도착하는 것을 방해하도록 제작할 것이다.
레벨을 디자인하는데 있어서 단순히 이동과 회전만 이용하면 장애물 맵이라고 할 수 없을 것이다. 이때까지는 가장 기본이 되는 이동과 회전을 통해 장애물을 배치해보았지만,
이를 활용해서 캐릭터를 밀어버린다던가, 다른 레벨로 이동하도록 할 수도 있다.
이 프로젝트는 어디까지나 장애물 맵을 제작하기 위한 하나의 "참고자료"일 뿐 맵 지형, 디자인, 장애물타입, 레벨 크기, 목표지점 도달 조건 등등 수많은 아이디어들을 본인이 계획하여 맵을 제작하는 것을 추천한다.
하지만 너무 많은 아이디어는 오히려 쉽게 질릴수도 있기 때문에 범위를 줄여서 생각해보자.
본인도 맵을 제작하기 전에 아주 간단하게 코스를 짜보았다.
이동과 회전은 기본이고, 이를 활용하여 회전의 중심점을 바꾸어본다던가 크기를 키워서 만들기도하고, 이미 사용했던 장애물을 재사용하거나 새로운 지형을 이용하여 맵을 수정할 예정이다.
이것으로 마무리 하는 것이 아니라, 맵을 제작해 보면서 수정할 부분이나 조정해야 하는 경우가 생길 수도 있다.
이제 지난 시간에 이어 3번 부분인 대각선으로 움직이는 발판을 제작해보자
Content Drawer을 눌러 C++ Classes 폴더에서 우리가 만들었던 Obstacle 클래스에 우클릭하여 'Create Blueprint class based on Obstacle'을 선택하고,
이름은 BP_Obstacle3로 작성하여 블루프린트 클래스를 생성해보자
이렇게 만들어진 블루프린트 클래스에 형태를 입혀주기 위해서 [All > Content > EnvironmentPack1 > Meshes > EnvironmentPack_1] 폴더에서 형태를 골라준다.
(본인은 그냥 눈에 띄는 사각형 SM_KnightCastle_LibraryFireplaceSecretDoor 메시를 사용하였다)
메시를 골랐으면 뷰포트 창에 드래그 앤 드롭 하여 적용시켜준다.
하지만 이대로 사용하기에는 클래스가 너무 작으므로 크기를 조정해준다
변경사항을 적용하기 위해 오른쪽 상단의 컴파일 버튼을 누른 후 저장해준다
콘텐츠 브라우저의 Content 폴더에서 BP_Obstacle3를 찾아서 성 위에 배치해준다
이제 장애물의 방향을 맞추기 위해 약간의 회전을 주고, 클래스가 움직일 수 있도록 디테일 패널에서 ObjectVelocity값과 ObjectMoveDistance값을 변경해준다. [대략 Velocity값은 RGB 300, 500, 400 정도 두었고, MoveDistance값은 1000으로 두었다]
설정값을 마치고 시뮬레이션[단축키: 'Alt' + 'S']을 해보면, 시작위치와 도착위치 사이를 일정한 간격으로 움직이는 것을 확인할 수 있다.
이제 4번, 회전하는 구체를 피해서 이동하도록 장애물을 만들어보자.
마찬가지로 C++ Classes 폴더에서 Obstacle C++ 클래스를 찾아서 블루프린트를 만들어주고,
회전하는 구체로 사용할 메시로 큰 바위(SM_Rock03)를 사용해보자
하지만 이렇게 그냥 사용해버린다면 나중에 회전값을 넣어줄 때 저 바위 자체가 회전할 것이다.
우리는 성을 중심으로 바위가 회전하기를 원하므로,
이렇게 회전 중심으로부터 어느정도 떨어져 있어야 할 것이다
그런데 얼마나 회전중심으로부터 떨어져 있어야 하는것일까? 지금은 거리가 가까워서 어느정도 조절하면 바로 찾을 수 있겠지만, 맵의 규모가 커지면 커질수록 바로 찾는것은 아마 힘들것이다.
그래서 언리얼5-5 C++ <레벨 에디터 뷰포트 조작하기>에서 살펴봤었던 줄자 기능을 이용해볼 것이다.
우선 메시를 회전시킬 성의 반지름을 알아야 하기 때문에 왼쪽 상단의 Perspective 부분을 클릭하고 Bottom을 선택한다
[단축키: 'Alt' + 'Shift' + 'J']
그러면 이렇게 맵의 아래쪽을 쳐다보는 관점으로 바뀌는데, 이때 Top이 아닌 Bottom을 선택한 이유는 메시의 LOD(Level of Detail) 때문이다.
LOD(Level of Detail)은 3D 모델의 복잡성을 조절하여 성능을 최적화하는 기술인데, LOD는 주로 카메라와의 거리나 시야각에 따라 서로 다른 해상도의 모델을 사용하여 렌더링 성능을 향상시키고 프레임 속도를 유지하는데 도움을 준다.
언리얼엔진에서는 모델링을 할 때 LOD를 수동으로 생성할 수도 있지만, 보이는 부분만을 자동으로 생성해서 LOD설정으로 인해
이렇게 특정 각도에서 메시가 사라지거나 제대로 표시되지 않는 문제가 발생할 수 있는 것이다
다시 본론으로 넘어와서,
거리를 재고 싶은 출발점에 휠을 클릭한 상태로 끝 지점까지 드래그를 하면 거리를 구할 수 있는데,
이렇게 구한 거리 값을 회전중심으로부터 떨어뜨리면 될 것이다. (대략 X= 580.0)
이제 제작한 바위(BP_Obstacle4)를 배치하면 되는데, 배치를 할 때도
무턱대고 배치하면 바위가 회전할 때의 궤도가 맞지 않을 수 있는 문제가 발생할 수 있다.
여기서도 마찬가지로 Bottom 관점을 활용해서 배치를 하면 편하다.
배치할 때 이 아이콘이 거슬리기 때문에 아웃라이너에서 오브젝트의 왼쪽 눈모양 아이콘을 눌러 잠시 안보이게 만들고,
회전 중심의 그리드가 너무 넓으므로 오른쪽 위에서 그리드 값을 1정도로 맞춰줘서 배치를 조금 더 세밀하게 할 수 있도록 해준다. (Location X=5807.795597,Y=21602.000000)
다시 관점을 원래대로 되돌리고 나서, Z축의 회전값을 주었을 때,
시뮬레이션을 해보면 성의 회전 중심으로부터 빙글빙글 도는 장애물을 확인할 수 있다. [단축키: 'Alt' + 'S']
하지만 이렇게 마무리를 하면 플레이어가 성 벽을 타는 꼼수(?)를 할 수도 있기 때문에 바위의 크기를 조금 더 키워보자
BP_Obstacle4 블루프린트 에디터에서 스케일을 키워주면 된다 (X=2.000000,Y=2.000000,Z=2.000000 정도면 될 것이다)
인게임에서 바로 스케일을 수정하지 않고 에디터에서 수정한 이유는, 이 BP_Obstacle4 블루프린트 자체가 하나의 객체로써 존재하기 때문이다.
블루프린트 에디터에서 스케일을 수정하면 이 바위의 스케일 속성만 변하는 것이다. 즉, 해당 객체의 크기만 조정되기 때문에 다른 요소들과의 거리에는 변화가 없다.
하지만 뷰포트에서 객체의 스케일을 조정하면, 그 객체의 모든 속성이 상대적으로 변경되게 된다. 따라서, 이 바위와 회전중심간의 거리도 함께 늘어나게 된다.
결론적으로, 블루프린트 에디터에서의 수정은 객체의 속성만 변화시키고, 뷰포트에서의 수정은 객체의 전체적인 위치와 크기를 동시에 변경하기 때문에 이러한 차이가 발생한다.
완성하면 절대 꼼수(?)를 쓰지 못할 것이다.
다음으로는 5번, 위 아래로 움직이는 발판을 밟고 이동하는 장애물을 만들어보자
이 부분은 이미 만들어 놓은 장애물을 사용하면 되기에 굉장히 쉽다.
콘텐츠 브라우저의 Content 폴더에서 BP_Obstacle1을 선택하고 끌어다가 배치한다음, 복사&붙여넣기를 해서 다리를 만들어준다. ['Alt'를 누른채로 액터를 끌면 쉽게 복사&붙여넣기가 가능하다]
여기서도 본인 마음대로 발판의 속도나 시작위치, 높낮이 거리 등등을 조절하면 된다.
[ObjectMoveDistance를 400으로 해서 오브젝트가 움직이는 거리를 줄였고, 속도는 늘리되 몇몇 발판에만 반전을 주었다]
설정을 끝내고 플레이를 하면 위아래로 짧게 반복하는 다리를 하나 완성할 수 있다
VR게임 개발을 위한 언리얼엔진/C++ 공부한 내용 끄적이기...
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!