
이전 글에서는 C++ 코드를 이용해서 오브젝트를 움직일 수 있게 하였다. 하지만 단순히 상하좌우로 움직이기만 한다면, 게임의 재미 요소가 줄어들 수 밖에 없다.
이번에는 성 위에 올라갔을 때 생기는 작은 버그를 해결하고, C++로 회전도 추가하여 플레이어의 움직임을 방해하도록 제작해보자
이전에 제작했던 발판을 이용해서 성 위로 올라가면 바닥이 뚫려버린다
이것 또한 언리얼5-15 C++ 장애물 피하기(1) - 프로젝트 세팅하기 에서도 한번 다루어봤는데, 이번에는 조금 다른 방식으로 문제를 해결해보자
콘텐츠 브라우저에서 [All > Content > EnvironmentPack1 > Meshes > EnvironmentPack_1] 폴더에서 SM_Castle을 검색하여 'SM_Castle_Back'을 우클릭하고 Edit 버튼을 누르거나 더블클릭하여 모델링 속성 창을 열어준다
상단에 툴 바에서 Collision 드롭다운을 열고 Remove Collision으로 모든 콜리전을 지운 다음,
디테일 패널에서 Collision 섹션을 찾아 Collision Complextiy 부분을 'Use Complex Collision As Simple'으로 선택해준다
이렇게 설정하는 이유를 알아보기 전에, 일반적으로 언리얼 엔진은 물리적 상호작용을 계산할 때 객체의 Simple Collision 메쉬를 사용하게 된다. Simple Collision 메쉬는 물체의 대략적인 형태를 나타내는 단순화된 버전의 메쉬로, 연산 비용이 적다
그러나 Use Complex Collision As Simple로 설정하게 되면, 언리얼엔진은 물체의 모든 세부 정보와 복잡한 형태를 포함하는 Complex Collision 메쉬를 사용해 충돌을 계산한다. 이것은 더 정확한 충돌을 감지하지만, 연산 비용이 더 많이 들기 때문에 성능에 영향을 줄 수 있다
이 설정은 정밀한 형상의 정적 객체나 느리게 움직이는 객체 등에 적용하는데, 정확한 충돌 감지가 중요하고 성능 저하를 감수할 수 있는 경우에 사용된다. 그러나 빠르게 움직이는 객체에서는 복잡한 충돌 계산이 정상적으로 이루어 지지 않기 때문에 적합하지 않을 수 있다
수정사항을 저장 후에 올라가 보면, 정상적으로 올라가는 모습을 확인할 수 있다
지금까지는 콜리전 문제로 인해 일어날 수 있는 자그마한 문제를 다루어 보았고, 그렇다면 이제 오브젝트에 회전 옵션도 추가해서 에디터에서 수정할 수 있도록 만들어보자
헤더파일에서 오브젝트의 회전속도를 결정하기 위해 FRotator 타입인 RotationVelocity 변수를 선언해주고, 에디터에서 공개할 수 있도록 UPROPERTY 매크로와 EditAnywhere, Category = "ObjectSettings" 지정자를 넣어준다
그리고 그 밑에 회전을 담당할 함수인 RotateObstacle( )도 선언해준다
이제 소스파일로 이동해서 RotateObstacle( ) 함수를 구현해준다. 이때 AddActorLocalRotation( )함수를 사용하여 구현했는데,
'RotateObstacle( )함수도 MoveObstacle( )함수와 같은 방식으로 작성하면 되는거 아닌가?' 라고 생각할 수 있다.
물론 이것도 가능하지만 두 방식을 비교했을 때, 첫 번째는 AddActorLocalRotation( )함수를 이용하여 액터의 로컬 좌표에 회전을 추가하는 방식이고, 두 번째는 현재 액터의 회전을 가져와서 회전 속도와 경과 시간을 곱하여 이를 다시 액터에 설정하는 방식이다. 하지만 이 방법은 회전 범위가 제한적인 경우에, 그 범위를 넘어서는 회전을 제어하기가 어렵다.
따라서 회전 범위가 제한적이거나 특정한 패턴으로 액터를 회전시켜야하는 경우에는, 범위를 넘어서는 회전을 자연스럽게 처리할 수 있는 AddActorLocalRotation( )함수를 사용하는 것이 더 적합하고, 이 함수에 RotationVelocity와 DeltaTime 곱한 값을 전달해서 그 값 만큼 현재 액터의 로컬 회전에 더하게 된다.
마지막으로 RotateObstacle( )함수를 매 프레임마다 호출할 수 있도록 Tick( )함수안에 넣어준다
코드를 모두 저장 후 컴파일을 해준다
이제 이렇게 만든 C++ 클래스를 기반으로 또 다른 형태의 오브젝트를 만들어보자
콘텐츠 브라우저의 C++ Classes 폴더에서 Obstacle C++ Class에 우클릭하고 'Create Blueprint class based on Obstacle'을 선택해준다
그러면 발판을 만들때도 나왔듯이 블루프린트의 이름과 경로를 설정하는 창이 나오는데, BP_Obstacle 이라는 이름은 이미 발판에서 사용했기 때문에 중복해서 사용하지는 못하고, 다른 이름으로 지정해준다 [경로는 Content 폴더에 넣어주자]
이제 블루프린트 클래스를 열어서 C++코드를 기반으로 동작하는 다른 형태의 메시를 넣어줄건데,
[All > Content > Characters > EnvironmentPack1 > Meshes > EnvironmentPack_1] 경로에서 원하는 메시를 선택하면 된다.
(지금 만드는 오브젝트는 회전을 하기 때문에 'SM_knightCastle_DockRoom_Chain' 라는 이름의 원기둥 메시를 넣어주었다)
메시를 추가하면 중심을 기준으로 회전할 수 있도록 위치를 맞추어준다
Components 창에서 BP_Obstacle2를 선택하고 디테일 창에서 Rotation값을 먼저 수정해 주어도 상관없다
정상적으로 위치와 Rotation값을 넣어주면, 시뮬레이션을 했을 때 이런 식으로 원기둥이 돌아갈 것이다
작업이 끝나면 Compile 버튼을 누르고 창을 닫아준다
이제 콘텐츠 브라우저에서 오브젝트를 생성했던 경로를 찾아서 끌어다가 배치해준다
성 벽을 오를 수 있도록 추가로 여러개를 설치하여 오브젝트들을 밟고 올라갈 수 있도록 한다
('Alt' 키를 누른 채로 오브젝트를 클릭하고 끌어당겨 쉽게 복사 붙여넣기를 할 수 있다)
마우스 우클릭을 하고 'Play From Here'을 선택하여 테스트해보면, 인게임에서 발판이 회전하게 된다
(게임의 난이도 조정을 위해 회전 속도를 올리거나, 방향을 바꾸거나, 각각의 오브젝트 회전 속도를 조절하면 된다)
이로써, 이동하는 장애물과 회전을 이용한 장애물을 제작하고 설치해보았다
다음 글에서는 장애물을 더 다양하게 배치하는 등으로 레벨 디자인을 다듬고, 맵 제작을 마무리 할 것이다
VR게임 개발을 위한 언리얼엔진/C++ 공부한 내용 끄적이기...
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!