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

섯 번째 파트인 오브젝트 충돌과 Ysort입니다

우선 저번 시간에 이어서 충돌(Collision) 파트를 진행합니다.

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

 

현재까지 우리는 최상위 노드(Node)에 자식 노드를 추가하는 방식으로 진행해왔습니다.

그런데 만약에 주인공 캐릭터를 다른 씬(Scene)에서 쓴다고 가정할 때 어떻게 해야 할까요?

 

새로운 에서 노드를 생성시켰다고 가정합시다. 거기에 저번처럼

주인공과 똑같은 타입의 노드들을 자식으로 추가해야 하는 걸까요?

당연히 아닙니다. 더 좋은 방법이 존재합니다.

 

Player노드우클릭해서 Save Branch as Scene를 눌러주도록 합니다.

 

특정 경로에 저장(Ctrl+S)을 하여야 합니다. 우선 Player 폴더에 저장하도록 하겠습니다.

 

이렇게 하면 해당 노드 구조체를 재 사용/활용이 가능한 인스턴스(Instance)로 만들게 됩니다. 재 사용이 가능하다는 것은

다른 에서도 고대로 쓸 수 있다는 말이죠, 유니티의 프리팹(prefab)과 일맥상통하는 부분이 있습니다.

 

원본을 수정하면 복제해도 다 반영되기 때문에 수정에 용이하다는 장점도 있습니다.

또한, 표시된 아이콘이 인스턴스가 되었는지 안되었는지 나타냅니다.

 

한번 새로운 을 만들어서 그 안에 불러와봅시다.

 

이런 식으로 파일 시스템(File System)에 있는 Player - Player.tscn

2D 작업공간(2D workspace)에 배치함으로써 재 사용이 가능합니다.

 

아까 주인공을 새로운 에서 배치하면서 뭔가 이상한 점을 느끼지 않았나요?

"왜 배치할 때마다 오른쪽에 배치되지? 이미지를 끌어 왔을 때는 정위치에 배치됐는데…"

라는 의문이 생길 것입니다. 이것을 해결하도록 합시다.

 

우선 해당 은 테스트로 잠깐 생성한 것이니 저장하지 말고 원래 으로 돌아가도록 합시다.

 

원래 으로 돌아가서 Player에 있는 해당 아이콘을 클릭해주세요.

 

Player를 선택되어 있는 상태에서 오른쪽 Transform를 펼쳐서

Position 옆에 있는 아이콘을 클릭해주세요. 이렇게 하면 위치는 원점으로 초기화될 것입니다.

 

0, 0으로 초기화됐으면 저장해주고 다음으로 넘어갑시다

 

원래 World 노드가 있는 으로 돌아오니까 캐릭터가 원점으로 돌아갔습니다.

드래그&드롭으로 아까 있었던 비슷한 위치에 두도록 합니다.

 

그다음으로 에 있는 Bush를 지워줍니다. 다른 에서 주인공과 마찬가지로 같은 작업을 할 것입니다.

 

아까처럼 을 생성하는 곳으로 갑니다. 대신 2D Scene이 아닌 StaticBody2D를 생성할 것입니다.

 

생성된 StaticBody2D의 이름을 Bush로 정합니다. 다른 이름도 괜찮습니다.

 

Bush의 자식 노드스프라이트(Sprite)를 추가합니다.

 

추가한 스프라이트에서 Bush텍스처(Texture)를 아까 지운 노드

텍스처와 동일하게 파일 시스템에서 찾아서 넣어줍시다.

 

노드를 하나 더 추가합니다. 이번에는 CollisionShape2D를 추가합니다.

 

CollisionShape2D를 선택한 상태에서 우측 탭에 있는 Shape 항목에서

New CapsuleShape2D를 통해 CapsuleShape를 생성합니다.

 

Transform을 누르면 Position의 수치를 수정할 수 있습니다.

그리고 Rotation Degrees도 포함해서 다음과 같이 수정합니다.

 

Shape에 있는 CapsuleShape2D를 클릭하면 이 역시 수치를

수정할 수 있습니다. 다음과 같이 수정해주세요.

 

그리고 저장을 다음 경로에 저장합니다.

 

원래 World 으로 돌아옵니다. 전에 생성했던 StaticBody2D를 지웁니다.

 

World 폴더에 저장해둔 Bush.tscn를 꺼내서 배치해 봅시다.

 

 

적당히 배치하면 됩니다.

 

Node에 대해서 잠깐 설명을 드리자면, 현재 여러분이 작업하는 노드Node2D입니다. 그래서 오브젝트를 배치하면

Node2D에 의해서 좌표값이 부여됩니다. 그런데 그냥 Node도 존재하는데요 이 Node는 뭐 하는 거일까요?

 

노드는 아무런 좌표도 갖고 있지 않은데요, 외관상으로 Node에서 2D가 빠졌으니

위치 벡터가 없는 걸로 추정이 됩니다. 실제로 좌표를 설정할 수 있는 어느 부분도 존재하지 않는데요.

 

그래서 이렇게 오브젝트를 배치하려고 하면 오브젝트가 원점으로 이동합니다.

원점으로 이동된 것을 다시 이동시켜서 재배치하는 방법도 있겠지만

 

이미 그 행동 자체가 Node를 부모로 두고 하는 것 자체가

알맞지 않습니다. 또한 모든 노드들은 이 Node를 상속받고 있습니다.

결국 Node2DNode를 포함하고 있다는 말이죠.

 

그래서 이것의 쓰임새를 굳이 말하자면

스크립트만 넣어서 작동하는 무언가를 만들거나 단순한 데이터를 담는 용도 등으로 쓰일 수 있겠네요

예를 들어 매니저의 개념으로도 쓸 수 있을 것 같습니다

매니저의 개념을 설명하기에는 말이 길어지니 여기까지만 설명드리고

결국 그래서 2D 오브젝트를 배치하는 데는 일반적으로 고도 엔진 내에서는 Node2D를 사용하면 됩니다.

 

자 그럼 마저 진행하겠습니다. 우선 한번 플레이해봅시다. 캐릭터를 이동해서

부쉬 근처에서 움직이면 캐릭터가 가려지는 문제가 있습니다.

이건 외관상으로 좋지 않은데요. 물론 이런 장면을 의도한 것이라면 상관없지만,

우리의 게임에서는 캐릭터가 부쉬에 가려지면 안 됩니다. 부쉬에 숨을 생각도 없으니까요.

이것을 해결해봅시다. 다행히도 이런 기능은 고도 엔진에서 지원합니다.

 

World 노드우클릭해서 Change Type를 선택합니다.

 

이 기능은 기존 노드의 타입을 변경해주는 기능입니다. 'ysort'를 입력하고 Ysort를 선택합니다.

 

잘 작동합니다. 사실 이미지에는 보이지 않지만 한 가지 문제가 있는데요

 

바로 Ysort가 작동하는 기준이 최상위 노드TransformPosition 값이 기준이기 때문에

이렇게 스프라이트 위치와는 별개로 작동하게 됩니다.

좀 과장해서 이 부분을 수정하면 주인공의 머리가 원점인데 이러면 부자연스러워 보이겠죠?

주인공의 머리가 원점이 아니라 발로 바꿔주면 좀 더 자연스러워질 것입니다. 그럼 다음과 같이 손보도록 하죠.

 

캐릭터의 스프라이트Position 을 다음과 같이 수정합니다.

 

캐릭터의 콜리전 쉐이프2D를 다음과 같이 수정합니다. CapsuleShape2D를 클릭하면 해당 옵션이 나옵니다.

 

Transform에서 Position, Rotation Degrees 를 다음과 같이 수정합니다.

 

Bush.tscn를 수정합니다. 해당 창이 꺼졌다면 Bush.tscn파일 시스템에서

다시 열어주시거나 World에서 아이콘을 클릭해 여시면 됩니다.

그리고 Transform에서 Position을 다음과 같이 수정합니다.

 

마찬가지로 콜리전 쉐이프2DPosition을 수정합니다.

나머지는 진도에 따라 똑같이 따라오셨으면 값이 비슷할 것입니다. 만약 다르면 똑같이 수정해주세요.

 

이상으로 Ysort에 대해서 배워봤습니다 Ysort는 강력하면서도 간단한 기능이므로 유용하게 쓰입니다.

원래 draw과정도 실제로 구현해야 하지만 엔진 덕분에 시간을 줄일 수 있다는 큰 장점이 있죠.
Ysort도 그중 하나입니다.

 

Ysort의 보충 설명이 필요하시다면 HeartBeast 영상에 Ysort적용 방식에 대해서

[15:10 쯤] 설명하는 부분이 있으니 영상 보시는 것을 추천드립니다. 

 

이 기능에 대해서 기억하시고 다음인 애니메이션 파트에서 뵙겠습니다.

 

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

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

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

728x90
728x90