[Unity] player가 갈 수 없는 영역 표시하기

2022. 8. 15. 15:10·공부/Unity
728x90

player의 이동 영역을 지정하고 싶은데 방법을 알지 못해서 강의에서 알려준 그대로 복습해봤다.

 

 

새로운 타일맵을 생성한다. 이름은 collision 비슷한 느낌이 나게 만들어주면 된다.

 

 

사용하지 않는 sprite로 player가 갈 수 없는 공간을 쭉 둘러준다.

 

 

collision에 새로운 script인 "Collision" 파일을 생성하고 컴포넌트로 추가해준다.

 

public class Collision : MonoBehaviour
{
    public Tilemap _tilemap;

    void Start()
    {
    }

    void Update()
    {
        List<Vector3Int> blocked = new List<Vector3Int>();

        foreach (Vector3Int pos in _tilemap.cellBounds.allPositionsWithin)
        {
            TileBase tile = _tilemap.GetTile(pos);
            if (tile != null)
                blocked.Add(pos);
        }
    }
}

 

Collision 파일 안에는 이러한 코드를 작성해준다.

 

 

원하는 곳에 MapEditor script를 생성해준다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;
using System.IO;

#if UNITY_EDITOR // 개발 단계에서만 해당 코드를 사용하게 해줌
using UnityEditor;
#endif

public class MapEditor : MonoBehaviour
{

#if UNITY_EDITOR
    [MenuItem("Tools/GenerateMap")] // 유니티 툴 상단 메뉴를 원하는 데로 만들 수 있다
    private static void GenerateMap()
    {
        GameObject go = GameObject.Find("Map"); // 위에서는 Grid라고 되어있는 하이라키 상의 타일맵 이름을 Map으로 변경했다
        if (go == null)
            return;

        Tilemap tm = GameObject.Find("Tilemap_Collision").GetComponent<Tilemap>();
        if (tm == null)
            return;

        List<Vector3Int> blocked = new List<Vector3Int>();
        foreach (Vector3Int pos in tm.cellBounds.allPositionsWithin)
        {
            TileBase tile = tm.GetTile(pos);
            if (tile != null)
                blocked.Add(pos);
        }

        using (var writer = File.CreateText("Assets/Resources/Map/output.txt")) // 파일이 생겼으면 좋겠는 장소를 작성한다
        {
            writer.WriteLine(tm.cellBounds.xMin);
            writer.WriteLine(tm.cellBounds.xMax);
            writer.WriteLine(tm.cellBounds.yMin);
            writer.WriteLine(tm.cellBounds.yMax);

            for (int y = tm.cellBounds.yMax; y >= tm.cellBounds.yMin; y--)
            {
                for (int x = tm.cellBounds.xMin; x<=tm.cellBounds.xMax; x++)
                {
                    TileBase tile = tm.GetTile(new Vector3Int(x, y, 0));
                    if (tile != null)
                        writer.Write("1");
                    else
                        writer.Write("0");
                }
                writer.WriteLine();
            }
        }

    }

#endif
}

 

하나하나 보면 어려울 거 없는 코드다. collision 타일을 foreach로 돌면서 무언가 있나 없나를 살펴보고 있으면 1을, 없으면 0을 출력하는 내용이다.

 

 

우리가 새로 만든 상단 메뉴인 GenerateMap을 클릭하면

 

 

이렇게 원하는 장소에 원하는 파일이 생성된 것을 볼 수 있다. 이 메모장 내용을 이용해서 player의 이동을 관리할 수 있다.

728x90

'공부 > Unity' 카테고리의 다른 글

[Unity] GetKey / GetKeyDown / GetKeyUp  (0) 2022.08.16
[Unity] Tile로 만든 맵, 선이 생겨서 마음에 들지 않을 때  (0) 2022.08.15
[Unity] 게임 실행 작은 화면으로 하기  (0) 2022.07.29
[Unity] 몬스터가 죽을 때 나오는 효과는 어떻게 만들어야 할까  (0) 2022.07.28
[Unity] player의 움직임 제어시 Time.deltaTime을 곱하는 이유  (0) 2022.07.25
'공부/Unity' 카테고리의 다른 글
  • [Unity] GetKey / GetKeyDown / GetKeyUp
  • [Unity] Tile로 만든 맵, 선이 생겨서 마음에 들지 않을 때
  • [Unity] 게임 실행 작은 화면으로 하기
  • [Unity] 몬스터가 죽을 때 나오는 효과는 어떻게 만들어야 할까
돌멩이수프
돌멩이수프
Information technology
  • 돌멩이수프
    WHAT DOES "IT" STAND FOR?
    돌멩이수프
  • 전체
    오늘
    어제
    • 분류 전체보기 (239)
      • 언어 (73)
        • html (3)
        • css (1)
        • java (6)
        • C (26)
        • C++ (2)
        • C# (29)
      • 공부 (7)
        • Unity (43)
        • 게임 서버 (26)
        • 네트워크 (5)
        • 데이터베이스 (7)
        • EFCore (19)
        • 기타 (14)
        • Git (5)
        • 운영체제 (1)
        • 소프트웨어공학 (21)
      • 2024-여름 (12)
      • 자기 관리 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준
    EntityFramework
    게임서버
    C
    Entityfamework
    자바
    coding
    코딩
    unity
    tcp
    디자인패턴
    네트워크
    java
    HTML
    EFCore
    라즈베리파이
    유니티
    Python
    C언어
    C#
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
돌멩이수프
[Unity] player가 갈 수 없는 영역 표시하기
상단으로

티스토리툴바