Programing/Unity(C#)

[Unity] 오브젝트 위치를 Tilemap/GridLayout 칸에 맞추기

hye3193 2024. 3. 5. 21:52

World나 Screen 좌표계 외에도 Tilemap이나 GridLayout을 기준으로 오브젝트들의 위치를 조절할 수 있다

 

GridLayout

// Snap the GameObject to parent GridLayout
using UnityEngine;

public class ExampleClass : MonoBehaviour
{
    void Start()
    {
        GridLayout gridLayout = transform.parent.GetComponentInParent<GridLayout>();
        Vector3Int cellPosition = gridLayout.WorldToCell(transform.position);
        transform.position = gridLayout.CellToWorld(cellPosition);
    }
}

유니티 공식문서 상에서는 위와 같이 사용 예를 보여주고 있다

기준이 될 gridLayout을 정하고, 해당 레이아웃을 기준으로 CellToWorld 함수에 Vector3Int 값을 넣어주면 cell 좌표의 위치를 뽑아낼 수 있다

- GridLayout의 CellToWorld를 사용하면 위와 같이 교차점을 기준으로 좌표가 잡히게 된다

- (0, 0, 0) 좌표는 world에서의 (0, 0, 0) 위치와 동일하다

 

Tilemap

// Snap the GameObject to parent Tilemap center of cell
using UnityEngine;
using UnityEngine.Tilemaps;

public class ExampleClass : MonoBehaviour
{
    void Start()
    {
        Tilemap tilemap = transform.parent.GetComponent<Tilemap>();
        Vector3Int cellPosition = tilemap.WorldToCell(transform.position);
        transform.position = tilemap.GetCellCenterWorld(cellPosition);
    }
}

마찬가지로 유니티 공식 문서에서의 사용 예시다

GridLayout과 비슷하나, tilemap 컴포넌트를 받아와서 기준으로 써야 한다

GetCellCenterWorld 함수에 인자로 Vector3Int 값을 넘겨주면 world 좌표 기준으로 위치를 반환해준다

* tilemap 에서도 CellToWorld 함수를 쓸 수 있다, 결과 값은 GridLayout과 동일하다

 

- Tilemap의 GetCellCenterWorld를 사용하면 위와 같이 Cell의 중심 좌표를 기준으로 좌표가 설정된다

- (0, 0, 0)의 위치는 world 좌표 기준 (0, 0, 0)에서 우측 상단에 위치한 셀의 중심부이다