내일배움캠프/TIL

타일맵 위치에 오브젝트 생성하기

서보훈 2024. 11. 20. 20:51

팀 프로젝트로 타워디펜스를 제작하게 되었는데, 타일맵을 사용할 때, 타워의 설치 위치를 정해주어야 하는 상황이 생겼습니다.

 

일단 마우스가 Collider 에 올라가면 자신을 설치 위치로 잡아주는 오브젝트를 제작하였는데, 이것을 지정한 타일에 올려줄 방법이 필요아였습니다.

public class ConstructPoint : MonoBehaviour
{
    public bool IsTowerConstructed { get; private set; }
    public Transform constructPosition;
    public Tower ConstructedTower { get; private set; }

    [SerializeField] private GameObject selectImage;

    private void OnMouseEnter()
    {
        selectImage.SetActive(true);
        ConstructManager.Instance.SetConstructPoint(this);
    }

    private void OnMouseExit()
    {
        selectImage.SetActive(false);
        ConstructManager.Instance.SetConstructPoint(null);
    }

    public void ConstructTower(Tower tower)
    {
        ConstructedTower = tower;
        IsTowerConstructed = true;
        Instantiate(tower.gameObject, constructPosition);
    }

    public void DestroyTower()
    {
        ConstructedTower = null;
        IsTowerConstructed = false;
    }
}

 

정보를 찾던중, 타일맵에서 Tilemap.cellBounds.allPositionsWithin 을 통해 현재 타일맵이 설치된 위치를 int 좌표로 얻을 수 있다는것을 알게되었고, 이를 기반으로 건설 가능한 지역을 정해주는 타일맵을 만든 뒤, 해당 타일맵 좌표에 오브젝트를 생성하도록 만들어주었습니다.

public class ConstructPointGenerator : MonoBehaviour
{
    public Tilemap constructTile;
    public GameObject constructPointPrefab;

    private void Start()
    {
        foreach(var pos in constructTile.cellBounds.allPositionsWithin)
        {
            if(!constructTile.HasTile(pos)) continue;

            Vector3 realPos = pos + new Vector3(0.5f, 0.75f, 0);

            Instantiate(constructPointPrefab, realPos, Quaternion.identity, constructTile.transform);
        }
    }
}

이때 타일맵은 중앙 타일을 0,0 으로 하여 생성되는데, 이를 보정해주기 위해 추가 값을 넣어주는 방법을 사용하였습니다.

 

이후, 이 방법을 사용하게 될 경우, 오브젝트의 피벗을 한쪽 끝에 치우지게 만들어 타일 정 중앙에 오브젝트가 위치하도록 만들어줄 필요가 있을것같습니다.