메이플 이동 개념 이해하기

# 학습 과정 소개

월드 제작에 필수적인 이동 방식 중 메이플스토리 이동 방식을 따르는 RigidbodyComponent 특성을 알아봅시다. 이동은 [메이플 타일 맵 만들기](/docs?postId=747)와 함께 학습하기 권장합니다.

# 메이플스토리 이동 방식

RigidbodyComponent는 메이플스토리 이동 방식처럼 이동하고자 할 때 사용합니다. 이동 방식은 지형 종류와 밀접한 연관이 있기에 TileMapComponent를 함께 사용해 메이플스토리식 이동 방식을 만들 수 있습니다. 이때 타일 위에서 이동은 RigidbodyComponent에서 관리합니다.

> Tip. 플레이어 캐릭터는 이동하는 동안 가속도 운동을 하므로 WalkAcceleration, WalkDrag, WalkSlant 같은 이동 속성 프로퍼티들은 RigidbodyComponent와 지형의 이동 속성 모두에게 관여하게 됩니다.

# 기본 이동

RigidbodyComponent의 기본 이동 방식을 알아봅시다.

#### 발판 위에서 이동

플레이어는 특별한 이동 변화가 없는 이상 현재 밟고 있는 발판 위만 밟으며 계속 이동합니다. 그러다 발판과 떨어지면 해당 발판과의 관계가 끊어지고, 다음 밟은 발판 이동 규칙을 따르게 됩니다. 아래 그림처럼 빨간색 발판을 밟고 있는 플레이어는 초록색 발판과 교차하는 지점을 지나가더라도 초록색 발판으로 옮겨 가며 이동하지 않습니다. 그러나 빨간색과 초록색 발판이 겹치는 지점에서 플레이어 캐릭터가 점프한다면 초록색 발판을 밟게 되고, 초록색 발판 이동 규칙을 따라 이동하게 됩니다.

[png](1658193798420c9b8127ab85542ac8c25008d67ca62e6)

[gif](16581938215047ccafa3686d54c30a7ed3194be7c793a)

#### 수직 발판 이동 제한

바닥과 이어진 수직 발판은 플레이어 캐릭터의 이동을 막습니다.

[gif](165822007557308684a3bc9b44795a843406f14f5b8b9)

#### 발판을 벗어난 이동

  * 내려갈 때: 발판을 밟고 있지 않을 때는 중력의 영향을 받아 아래로 내려가는 것이 기본 이동 방식입니다. 플레이어 캐릭터는 아래로 떨어지다가 발판을 만나면 하강을 중지하고 착지합니다. 착지한 캐릭터는 다시 발판 위 이동 규칙을 따르게 됩니다.
  * 올라갈 때: 플레이어 캐릭터가 위로 올라가는 도중에 다른 발판을 만나더라도 무시하고 통과하며 올라갈 수 있습니다. [gif](1658883585804ef670a8a5f244cd49d1aaee440b64e30)



# 심화 이동

#### 지형 Layer

Map Layer는 10개까지 생성할 수 있고, 레이어마다 고유한 타일을 사용합니다. 이는 다른 레이어에서 동일한 모양의 패턴을 그릴 수 있다는 의미입니다. 그러나 타일이 속한 Layer가 다르므로 서로 다른 발판으로 생성됩니다. 그러므로 Layer가 다르면 발판은 하나로 이어져 있지 않습니다. 어떤 월드에서 서로 다른 모양의 타일이 이어져 있고, 그 발판들을 자연스럽게 떨어지지 않고 잘 걷고 있을지라도 실제로는 밟고 있는 발판 정보가 바뀌게 됩니다.

아래처럼 Layer 1과 2에 동일한 모양의 타일을 일정 부분 겹치게 그렸습니다. 플레이어 캐릭터가 Layer 1에서 2로 이동할 때는 수직 발판을 통과할 수 있지만, Layer 2의 발판에서 1로 이동할 때는 수직선 발판에 막혀 이동할 수 없습니다. Layer 1에 속할 때는 Layer 2에 속한 수직선 발판을 무시하기 때문에 이동할 수 있습니다.

[png](16593207875474437a8ce52584df9bd06b8487e5d5dec) [gif](165823394560592e2768650e94a9fb15284bd030a570a)

#### SortingLayer

대부분의 SortingLayer는 크리에이터가 스크립트에서 변경하지 않는 이상 자동으로 변경되어 씬에서 보이는 순서가 바뀌는 일은 없습니다. 그러나 엔티티에 RigidbodyComponent가 있을 때는 보이는 순서가 바뀔 수 있습니다. RigidbodyComponent가 있는 엔티티, 예를 들어 플레이어 캐릭터의 SortingLayer는 현재 밟고 있는 TileMap Layer를 따라 변경됩니다. 아래처럼 다른 MapLayer에 타일 일부가 겹치게 그리고, Layer 2에 수풀 오브젝트를 배치했습니다. 플레이어 캐릭터가 Layer 1에서 Layer 2로 이동한다면 Layer 2가 더 앞에 보이는 Layer이므로 플레이어 캐릭터가 수풀 뒤에 그려지다, Layer 2를 밟으면 수풀 앞에 배치되어 보입니다. [gif](1658231806874225549d7abfd4083aa75e5de3ed69aaf)

#### 수직선 지형

가로 지형 발판(지면)과 이어진 수직 발판은 RigidbodyComponent의 이동을 막는 벽이 됩니다. 하지만 지면 발판과 떨어져 있는 수직 발판은 RigidbodyComponent가 통과할 수 있습니다. [gif](16588846011832681a46df73b40e09ecf4140c57c09ce)

# 메이플스토리와 다른 이동 만들기

#### 수직선 지형

지면 발판과 붙어있든, 떨어져 있든 점프로 수직 발판을 통과하지 못하게 만들고 싶다면 RigidbodyComponent의 IsBlockvertialLine을 활성화합니다.

[{"index":"IsBlockvertialLine활성화","0":"[gif](165830397057921277d58d2954629b55e8db6b9ca6d99)"},{"index":"IsBlockvertialLine비활성화","0":"[gif](1658304402181bdd5063510e848f090ae484b1467f48e)"}]

##### 특정 레이어의 수직선 지형만 막기

RigidbodyComponent의 IsBlockvertialLine를 활성화하면 맵 내부의 모든 수직 지형을 통과하지 못합니다. 만약 일부 맵 레이어에서만 RigidbodyComponent가 수직 지형을 통과하지 못하게 막고 싶다면, 해당 맵 레이어의 TileMapComponent - IsBlockvertialLine을 활성화합니다.

예를 들어 봅시다. 아래와 같이 맵 레이어 2개를 만든 뒤, 잔디 타일은 수직 지형을 통과할 수 있게 두고, 돌 타일은 통과하지 못하게 설정해 봅시다. [png](1681114270716dcd0db08af484f42987ea977046172d4)

Hierarchy에서 MapleMapLayer_1을 선택한 뒤 프로퍼티 에디터를 보면 MapLayerName이 돌 타일인 Layer2로 설정되어 있습니다. [png](16811145893012649f50aa9c84d239be7289931be4c5b)

TileMap_1을 선택한 뒤, TileMapComponent에서 IsVerticalLine을 활성화합니다. [png](1681114736635e34bcba0a8e84b7d9588196e14f563c8)

 [시작] 버튼을 누른 뒤 테스트해 봅시다. 잔디 타일은 수직 지형을 통과할 수 있지만, 돌 타일의 수직 지형은 점프했을 때 막히는 것을 확인할 수 있습니다. [gif](1681115054201040f1c2e91564fe4919afebd2bcd9b7d)

#### 맵 바운더리

맵 바운더리를 무시하고, 맵 지형 밖에서도 이동하게 만들고 싶다면 RigidbodyComponent의 IgnoreMoveBoundary 프로퍼티를 활성화합니다.

#### LayerSettingType

RigidbodyComponent의 LayerSettingType 타입을 변경해 메이플스토리 이동을 따르게 설정합니다. 혹은 사다리/로프/발판의 SortingLayer와 RigidbodyComponent를 가진 Entity의 SortingLayer들과의 관계를 변경해 메이플스토리 이동과 다르게 설정할 수 있습니다.

아래와 같이 Layer1에 타일을 그리고, Layer1,2,3,4에 각각 사다리를 배치했을 때 각 타입에 따라 아바타와 사다리의 관계가 어떻게 변하는지 살펴보겠습니다. DefaultPlayer에는 RigidbodyComponent와 AvatarRendererComponent가 함께 있습니다. RigidbodyComponent의 LayerSettingType을 변경했을 때 AvatarRendererComponent의 SortingLayer가 어떻게 변하는지 확인해보겠습니다.

[png](16740182831894ef72030e7074c09ab7a37a5e34bc3e0)

  * All: 메이플스토리 이동을 따릅니다. RigidbodyComponent가 발판을 밟고 있을 때는 발판의 SortingLayer를 따라갑니다. 사다리/로프를 타고 있을 때는 AvatarRendererComponent의 SortingLayer 값이 탄 사다리의 SortingLayer 값을 따라갑니다. [gif](16739467083350b8e1b78aa7f4626a6aa3a10630ee873)

  * Climbable: RigidbodyComponent가 마지막으로 탔던 사다리/로프의 SortingLayer를 기준으로 AvatarRendererComponent의 SortingLayer 값이 바뀝니다. 아바타가 사다리에서 내려와 발판을 밟아도 사다리의 SortingLayer 값을 따릅니다. [gif](1673946686984683664c7c7484952b78440846bdcf879)

  * None: 크리에이터가 설정한 RigidbodyComponent를 가진 Entity의 SortingLayer를 따릅니다. 아래 예시의 AvatarRendererComponent의 SortingLayer 값은 Default입니다. 그러므로 어떤 사다리를 타더라도 SortingLayer 값은 Default로 유지됩니다. [gif](1673946729714d6916a24f5b1426ea7df4a97d8a71964)




##### 참고 가이드

  * [발판 만들기](/docs/?postId=71)
  * [이동 발판 만들기](/docs/?postId=579)
  * [맵 레이어](/docs?postId=53)
  * [메이플스토리 타일 맵](/docs/?postId=747)



##### 참고 API Reference

  * [RigidbodyComponent](/apiReference?postId=378)
  * [MapComponent](/apiReference?postId=358)
  * [TileMapComponent](/apiReference?postId=379)