[언리얼엔진5 입문] 34. 캐릭터 충돌 강제 적용

ASP·2024년 4월 4일
0

언리얼엔진5 입문

목록 보기
34/41

목표 : 캐릭터를 강제로 밀어내는 푸셔들을 만들 것임.


이전에 만들었던 C++ 클래스를 기반으로 한 새로운 블루프린트 클래스 생성

BP_PushingCube 블루프린트 클래스 생성 후 cube 모양의 스태틱 메시 컴포넌트 생성.

그리고 크기가 작으므로 모든 방향으로 10배씩 조정.

이때, Transform에서 자물쇠 표시를 누르고 값을 수정하면 x, y, z 에 일괄 적용됨.

그리고 좌우로 이동하게 하기 위해 Velocity의 y값을 조정

게임플레이 시 생각한대로 잘 작동함.

그러나 여기서도 문제가 있는데, 해당 큐브에 가만히 있는 캐릭터가 밀려날때 글리치가 발생하며 매끄럽게 밀리지 않음.

그런데, 플레이시 캐릭터가 큐브와 부딪힐 때 움직이고 있으면 아주 부드럽게 밀리는 것을 확인할 수 있음.

그 이유는, 캐릭터 코드는 움직이지 않는 한 Collision을 확인하지 않기 때문임.

따라서 캐릭터가 가만히 있더라도 사실상 움직이고 있는것처럼 설정하여 충돌을 감지하도록 해야 함.

왼쪽 Components 탭에서 캐릭터의 움직임에 관한 Charactor Movement 컴포넌트를 확인할 수 있음.

이벤트 그래프에서 우클릭 > move Updated Component 노드 생성

이 노드는 기본적으로 Character Movement Component에게 캐릭터 이동 규칙에 따라 캐릭터를 움직여야 한다는 것을 알려줌.

Delta : 얼마나 멀리 이동할지 설정

Sweap : 이동하는 중에 발생하는 충돌을 탐지할지 설정

Delta의 x값을 1로 바꾸고 매 Tick 마다 실행시키기 위해 Event Tick 노드의 실행핀과 연결시킴.

게임 플레이 시 캐릭터가 x축 방향으로 1씩 계속 이동하는 것을 확인할 수 있음.

이 원리를 이용하여 캐릭터가 이동하진 않지만 마치 이동하는 것처럼 설정할 수 있음.

매 Tick 마다 캐릭터가 x축으로 1 이동하게 하고 바로 x축으로 -1 이동하여 사실상 이동하지 않지만, 이동하는 것처럼 설정함.

그리고 이동하는 동안 충돌을 탐지하도록 강제하기 위해 Sweap을 체크.

결과 캐릭터가 큐브와 충돌할때, 가만히 있더라도 이동하는 것처럼 설정하여 충돌을 감지하도록 함으로써 매끄럽게 밀리게 됨.

Delta 값을 설정하지 않거나 Sweap을 체크하지 않으면 가만히 있을때 캐릭터가 매끄럽게 밀리는 목표를 달성하지 못함.

그 이유는 Sweap은 "움직일떄" 충돌을 감지하도록 하는 설정임.

만약 Delta 값이 없다면 가만히 있을때 해당 노드가 실행되더라도 움직임이 없는 것이므로 Sweap 에 따른 충돌 감지가 안됨.

즉, 위의 설정은 가만히 있을 때 충돌을 감지하도록 설정하는 것임.

키보드의 입력으로 캐릭터가 움직일 때는 그때에 맞는 설정이 따로 존재함.

그런데, 위와 같은 설정을 한 뒤 플레이를 해보면 캐릭터가 옆으로 이동하더라도 앞으로 이동하는 것처럼 애니메이션 되는것을 확인할 수 있음.

MoveUpdatedComponent의 Rotation 값을 설정해줘도 이건 움직임에 따라 회전하는게 아니므로 다른 방법을 사용해서 문제를 해결해야 함.

가장 쉬운 방법으로, Get Actor Rotation 노드를 생성하여 MoveUpdatedComponent의 New Rotation 데이터 입력으로 연결.

게임 실행하면 캐릭터가 적절히 회전하면서 이동하는 것을 확인할 수 있음.

profile
언리얼엔진 개발자의 길

0개의 댓글