공부/Unity

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

돌멩이수프 2022. 8. 15. 15:10
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