MapChip의 각 유형에 대한 적중 감지 구현

페이지 업데이트 :
페이지 생성 날짜 :

검증 환경

윈도우
  • 윈도우 11
Unity 에디터
  • 2021.3.3f1
입력 시스템 패키지
  • 1.3.0

이 팁의 전제 조건

이 팁에 대한 설명의 전제로 다음 설정이 미리 이루어졌습니다.

이 팁의 전제 조건은 무엇입니까?

지도 자료의 대출에 대해서

이하의 사이트에서 차용 처리.

처음에

이번에는 하나의 TileMap에 MapChip을 배치하고, 배치된 MapTip의 종류에 따라 히트 판정을 수행할지 여부를 결정한다.

이 팁은 다른 팁 "타일맵으로 히트 감지 구현"과 거의 동일하기 때문에, 자세한 설명은 여기를 참조하십시오. 여기서는 동일한 내용에 대해 절차만 설명하고 차이점만 추가합니다.

걷는 캐릭터의 구현

먼저, 플레이어가 히트 감지 작업을 수행하기 위해 제어할 스프라이트 이미지를 준비하고 프로젝트에 추가합니다. 이번에는 맵팁의 크기가 32픽셀이므로 이미지를 같은 크기로 만들겠습니다.

이번에는 걷는 애니메이션을 구현하면 절차가 길어지기 때문에 생략하겠습니다. 구현하려면 다음 팁을 참조하십시오.

프로젝트에 추가한 이미지를 선택합니다. 단위를 맵 칩과 일치시키고 싶기 때문에 "단위당 픽셀 수"를 "32"로 설정합니다.

구성이 완료되면 아래의 "적용" 버튼을 클릭합니다.

이미지가 설정되면 이미지를 뷰에 놓고 개체를 추가합니다.

캐릭터의 이동 과정을 설정합니다. 스크립트를 추가하고 이름을 Player 그대로 둡니다.

스크립트는 다음과 같습니다. 이것은 키보드로 스프라이트를 움직이는 간단한 이동 과정입니다.

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // キーボードの情報を取得
    var keyboard = Keyboard.current;

    // スプライトの移動処理
    if (keyboard.leftArrowKey.isPressed)
    {
      transform.Translate(-0.1f, 0, 0, Space.World);
    }
    if (keyboard.rightArrowKey.isPressed)
    {
      transform.Translate(0.1f, 0, 0, Space.World);
    }
    if (keyboard.upArrowKey.isPressed)
    {
      transform.Translate(0, 0.1f, 0, Space.World);
    }
    if (keyboard.downArrowKey.isPressed)
    {
      transform.Translate(0, -0.1f, 0, Space.World);
    }
  }
}

생성한 스크립트는 문자 객체에 첨부됩니다.

게임을 실행하고 캐릭터가 키보드로 움직이는지 확인합니다.

맵팁 준비

맵 팁 이미지를 준비하여 프로젝트에 추가합니다. 맵 칩의 수가 늘어날수록 설정이 번거로워지기 때문에 이번에는 걸을 수 있는 칸과 걸을 수 없는 칸의 2칸만 준비했습니다.

프로젝트에 추가한 이미지를 선택하고 MapChips에 대한 설정을 구성합니다. 자세한 내용은 다음 팁을 참조하세요.

구성이 완료되면 적용(Apply) 버튼을 클릭한 다음 스프라이트 에디터(Sprite Editor) 버튼을 클릭합니다.

32픽셀로 나눕니다.

타일 팔레트 탭을 선택하여 팔레트를 만듭니다. 탭이 없는 경우 "Window > 2D -> Tile Palette"를 사용하여 메뉴에서 표시할 수 있습니다. 팔레트 이름은 무엇이든 될 수 있지만 여기서는 "MapChipPalette"입니다.

폴더에 저장하므로 Scene 폴더에 새 "MapChipPalette" 폴더를 만들고 지정합니다.

MapChipPalette 폴더가 프로젝트에 추가되었습니다.

다음에는 팔레트에 MapTips를 추가합니다. 분할된 맵팁 이미지를 팔레트로 끌어다 놓습니다.

맵 팁이 팔레트에 추가되었습니다.

지도 만들기

적중 감지 설정은 제쳐두고 먼저 맵을 만듭니다. 나중에 적중 항목 감지를 설정할 수 있습니다. 먼저 계층 구조에 타일맵을 추가합니다.

추가되면 타일맵을 선택합니다. 뷰에 그리드가 표시됩니다.

먼저 뷰에서 벽이 되지 않는 맵칩을 설정합니다.

당분간, 나는 그것을 사방에 놓았다.

다음으로 벽으로 사용할 돌 지도 끝을 놓습니다.

이번에는 문제가 없었지만 캐릭터가 맵 뒤에 있을 경우 레이어 순서를 타일맵보다 큰 숫자로 설정합니다.

물론 이 시점에서 게임을 움직여도 벽을 뚫고 걸어갑니다.

MapChip 히트 감지 설정

여기서부터는 맵 칩의 종류별로 히트 판정을 입력할지 여부를 설정한다. 먼저 팔레트를 만들 때 만든 "MapChipPalette" 폴더를 엽니다.

내부 팔레트에 맵팁이 설정되어 있으므로 먼저 걸을 수 있는 맵팁을 선택합니다.

인스펙터(Inspector)에서 콜라이더 타입(Collider Type) 값을 없음(None) 으로 설정합니다. 나중에 타일맵에 충돌 감지 설정을 추가하겠지만 "없음"으로 설정하면 이 맵칩이 충돌하는 것을 방지할 수 있습니다.

다른 돌 맵 팁은 "그리드"로 설정되어 있습니다. 이번에는 투명한 맵팁이 아니기 때문에 "스프라이트"는 문제 없지만, "스프라이트"로 설정하면 이미지의 투명한 부분을 치는 것으로 판단되지 않습니다.

이것이 MapTip의 전부입니다. 이번에는 2개밖에 없기 때문에 쉽지만, 맵 칩이 많으면 그 정도는 설정해야 합니다.

충돌 감지 설정

여기서부터는 "타일맵으로 히트 탐지 구현"의 내용과 거의 동일합니다.

먼저 캐릭터 충돌 감지에 필요한 설정을 합니다. "Physics 2D -> Circle Collider 2D"를 구성 요소로 추가합니다. 이번에는 스프라이트가 둥글기 때문에 Circle로 만들었는데 모양에 따라 Box 또는 Capsule을 선택해주세요.

"Physics 2D -> Rigidbody 2D"도 추가됩니다.

중력이 떨어지지 않도록 중력 눈금을 0으로 설정합니다. 또한 Z에서 "회전 수정"을 확인하여 스프라이트가 회전하지 않도록 합니다.

타일맵(Tilemap)의 경우 타일맵(Tilemap) -> 타일맵 콜라이더 2D(Tilemap Collider 2D) 컴포넌트를 추가합니다.

뷰에서 돌 맵 팁 주위에 녹색 선이 추가된 것을 볼 수 있습니다. 즉, 타격 감지는 돌에 대해서만 설정됩니다. 위 팔레트에서 맵팁의 콜라이더 타입 설정이 반영된 것을 확인할 수 있습니다.

게임을 실행하고 벽을 향해 걸어보세요. 캐릭터가 벽 앞에서 제대로 멈추도록 할 수 있다고 생각합니다. 히트 검출과 관련된 프로그램을 작성하지 않고도 쉽게 구현할 수 있음을 알 수 있습니다.

MapChip 적중 감지 결합

아래 팁에서 언급했듯이 실제로 이동할 때 벽 충돌 감지 동작이 약간 이상합니다. 원인과 해결 방법은 아래 팁에 설명되어 있습니다.

그러나 맵 칩의 히트 감지 부분을 결합하면 이상한 동작이 수정되고 동시에 처리 부하가 줄어들 수 있으므로 최소한으로 해보자.

먼저 Tilemap Collider 2D에서 "Use in composite"를 선택합니다.

컴포넌트 추가(Add Component)에서 물리 2D -> 컴포지트 콜라이더 2D(Physics 2D - Composite Collider 2D)를 선택합니다.

"Rigidbody 2D"도 추가되므로 "Body Type"을 "Static"으로 만듭니다.

그러면 돌의 히트 판정이 맵 칩마다 합쳐진 것이 아니라는 것을 확인할 수 있을 것 같습니다.

이제 게임을 실행하고 제대로 작동하는지 확인하십시오.