본 게시글은 'HeartBeast'의 Make an Action RPG 파트의 내용을 다룹니다.
본 강의는 연계 강의이기 때문에 꼭 이전 편들을 보면서 진행하셔야 내용을 이해하시는데 어려움이 없습니다.

섯 번째 파트인 충돌 제어입니다.

저번 시간에는 주인공 캐릭터의 움직임을 부드럽게 하는 작업을 모두 끝 맞췄습니다.

이번에는 충돌(Collision)을 배우고 차후 지형의 경계를 제어하는 것으로 활용할 것입니다.

글에서는 편의상 충돌이라는 말 대신 콜리전이라는 용어를 사용하도록 하겠습니다.

 

콜리전은 왜 써야 할까요?

주인공 캐릭터가 갈 수 있는 곳과 가지 못하는 곳을 나누기 위해서입니다.

쉽게 말해 일종의 벽이라고 할 수 있는데요. 엔진에서는 벽이라는 것이 정의되어있지 않기 때문에

콜리전을 추가해서 벽으로써 기능을 작동하게 하는 것이라고 볼 수 있습니다.

 

지금은 아무런 콜리전이 없기 때문에 부쉬를 지나가도 의미가 없네요.

우리는 부쉬를 지나갔을 때 벽의 기능으로 작동해 지나가지 못하도록 하고 싶습니다.

 

씬(Scene) 뷰에서 Player부분에 떠있는 노란색 주의 표시가 떠있습니다. 한번 눌러서 확인해봅시다.

 

콜리전 처리가 안된다고 문제가 생기는 것인데요, 스크립트에서는 분명 move_and_collide로 

충돌 처리는 하지만 당연히 콜리전 쉐이프를 추가해주지 않았기 때문에 생기는 문제입니다. 

OK를 눌러 닫고 직접 추가해보도록 합시다.

뷰에서 +를 눌러 노드(Node)를 추가합니다.

 

Search란에 'coll'이라고 검색하고 보이는 CollisionShape2D를 선택하도록 합시다.

 

우측 상단 인스펙터(Inspector) 뷰에서 Shape 항목에 있는 [empty]˅ 를 누르면

나오는 메뉴에서 New CapsuleShape2D를 선택합니다.

다른 콜리전 쉐이프도 나오는데 CapsuleShape를 쓰는 이유는 주인공 캐릭터는 대부분 CapsuleShape을 선호합니다.

이는 다른 엔진에서도 크게 다르지 않습니다.

 

약간 차이점에 언급하자면 연산 과정에 차이는 있고, 다른 콜리전을 쓰는 경우는 있지만

여기서는 CapsuleShape가 가장 적당하기에 이것을 쓰도록 하겠습니다.

 

선택하고 나면, 캐릭터 주변에 불투명한 원통형이 생기는데요, 이것을 마우스로 늘렸다 줄였다 가능합니다.

 

작업 공간(Work Space)에서 도구 창에서 해당 아이콘을 클릭하시고, Use Pixel Snap를 선택해 주세요.

캐릭터는 픽셀 단위이기 때문에, 이 옵션을 켜면 픽셀에 기준을 맞춰 스냅(Snap)이 됩니다.

 

위치 또한 바꿔주도록 합니다 Alt 누른 상태로 드래그&드롭으로 옮깁니다.

자식 노드를 선택하고 Alt 누른 상태로 상태로 옮겨주게 되면 부모 노드가 잠금이 걸려도 자식 노드를 옮길 수 있습니다.

 

위치를 조절하고 크기를 다음과 같이 발아래쯤에 맞춰 주세요. 그다음

우측 인스펙터 뷰에서 Rotation Degrees-90으로 값을 변경합니다.

 

다시 노드를 추가합니다. Search란에 'Static'를 입력하고 보이는 StaticBody2D를 선택합니다.

 

StaticBody2D노드가 추가된 상태에서 다시 한번 노드를 추가합니다. 이번에는 자식 노드로 추가될 것입니다.

Search란에 'Coll'를 입력하고 보이는 CollisionPolygon2D를 선택합니다.

 

노드가 생성됐다면 작업 공간에서 클릭할 때마다 선이 생깁니다.

이 선들은 서로 연결되어있으면 콜리전을 형성합니다. 우선은 대강적으로 벽을 만들어봅시다.

 

다음처럼 선을 연결해서 콜리전을 생성했다면 플레이 버튼을 눌러 확인해 봅시다.

 

콜리전이 생성된 쪽으로 가보니 움직임이 둔해졌습니다. 마치 끈적한 젤리 표면에 붙은 것 같은 느낌이네요.

우선은 화면 상에서 잘 안 보이니 디버그 기능을 이용해 화면에서 확인할 수 있도록 합니다.

 

Debug - Visable Collision Shapes체크합니다.

 

해당 옵션을 켜주게 되면, 이렇게 플레이 버튼을 누르고도 콜리전을 확인할 수 있습니다.

 

그래도 여전히 콜리전에 부딪쳤을 때 움직이는 느낌은 똑같습니다.

이 움직임을 부드럽게 처리하기 위해 코드를 수정해야 합니다.

 

스크립트(Script) 페이지로 넘어갑니다. Player.gd가 열려있지 않다면 아까 뷰에서

Player의 스크립트 아이콘을 클릭해주시면 됩니다.

 

move_and_collide부분을 move_and_slide로 바꿔주시면 됩니다.

이때 인자(Argument) 값으로 들어가는 부분인

velocity*delta에서 delta부분을 없애줍니다.

move_and_slide안에는 이미 델타가 곱해져 있기 때문에 추가로 넣어줄 필요가 없습니다.

 

플레이를 누르고 확인해본 결과 충돌면에서도 부드럽게 움직입니다.

 

우측 하단에 보시면 주의 표시 아이콘으로 오류 메시지를 출력해줍니다.

 

이것을 알아보기 위해, Search Help로 해당 함수를 검색해 확인합니다.

확인해보니, 리턴 값을 반환하는데 그것을 설정해주지 않아서 생긴 문제입니다.

글에는 선형 벡터 반환하다고 쓰여있습니다. 우리가 쓰는 변수인 velocity는 벡터이기 때문에 이것을 써주시면 됩니다.

 

다음과 같이 작성해주시면 됩니다.

이후 플레이 버튼을 누르면 해당 오류 메시지는 사라집니다.

 

하지만 또 하나의 문제가 남았는데요. 디버거(Debugger) 쪽에 보시면 Erros(1)라고 하나 생긴 것을 확인할 수 있습니다.

이 경우는 설정 문제라고 볼 수 있습니다. 우선은 프로젝트 설정(Project Settings) 열어줍니다.

해당 메뉴는 좌측 상단 Project 메뉴에 있습니다.

 

스크롤을 내려 Display - Window 부분을 확인합니다.

 

해당 탭에서 Stretch항모에 있는 Aspect의 속성 값을 keep으로 바꿔줍니다.

 

다시 플레이를 해보면 더 이상 오류 메시지가 뜨지 않습니다.

 

이번 파트에서는 충돌 파트를 다뤄봤습니다. 다음 파트에서도

이어서 오브젝트에 콜리전을 심는 내용을 진행할 것이고 추가로 Ysort라는 개념에 대해서 알아볼 것입니다.

 

+) 03/30 게시글 내용 일부 수정

+) 05/10 일부 용어 레퍼런스 링크 적용

+) 05/21 일부 오탈자 수정

728x90
728x90