개발 중인 건설 시뮬레이션 게임에서 사용자가 건물을 지었을 때 비주얼적인 요소가 부족하다고 생각이 되었다. 그래서 ground tile을 건물에 맞게 바꾸는 등, 특정 영역에 대한 표시나 건물의 효과 범위 표시등으로 사용되는 크립을 2D 타일맵에서 표현해보려한다.
크립을 표현하기 위해 먼저 크립을 위한 타일맵을 생성한다. 이 타일맵은 기존 ground tile 보다 위에 그려지게 하기 위해 order를 조정한다. ground tile 은 기본 레이어 그룹의 0번째에서 그려지도록 하고, 크립 타일맵은 0보다 크게 설정한다.
다음으로, 크립 타일에 대해 정의를 하여야하는데, 여기서 Rule tile 을 사용하려고 한다. 룰 타일이 없었다면 8방면에 대해서 일일이 정의를 했어야할텐데 그런 번거로운 작업을 덜어주었다.
룰 타일을 이제 정의하였으니, 다음으로 할 작업은 어느 지점을 중심으로 크립을 깔 것인지 정의하는 것이다. 오브젝트의 world space position 을 크립 타일맵을 통해 coordinate 로 변환하고, 반환된 값을 기준으로 주변을 다이아몬드 형태로 크립을 구성하도록 코드를 작성한다.
private IEnumerable<Vector3Int> GetCoords(Tilemap tilemap, Vector3 worldCenter, Vector3Int extents)
{
Vector3Int origin = tilemap.WorldToCell(worldCenter);
for (int y = -extents.y; y <= extents.y; y++)
{
for (int x = -extents.x; x <= extents.x; x++)
{
if (Mathf.Abs(x) + Mathf.Abs(y) <= extents.x)
{
yield return new Vector3Int(origin.x + x, origin.y + y, origin.z);
continue;
}
if (Mathf.Abs(x) + Mathf.Abs(y) <= extents.x + 1 &&
UnityEngine.Random.Range(0, 2) == 1)
{
yield return new Vector3Int(origin.x + x, origin.y + y, origin.z);
}
}
}
}
이제 해당 타일을 사용하여 크립을 그리도록 작성하면 되지만, 이대로는 딱딱한 형태로 자연스럽지 못한 형태로 그려지게 된다. 각 다이아몬드 면의 위치에 추가로 타일을 그릴지 결정할 수 있게 하여 다양한 모양이 나올 수 있도록 수정한다.
yield return new Vector3Int(
origin.x - extents.x,
origin.y + (UnityEngine.Random.Range(0, 2) == 1 ? 1 : -1),
origin.z);
yield return new Vector3Int(
origin.x + extents.x,
origin.y + (UnityEngine.Random.Range(0, 2) == 1 ? 1 : -1),
origin.z);
yield return new Vector3Int(
origin.x + (UnityEngine.Random.Range(0, 2) == 1 ? 1 : -1),
origin.y - extents.y,
origin.z);
yield return new Vector3Int(
origin.x + (UnityEngine.Random.Range(0, 2) == 1 ? 1 : -1),
origin.y + extents.y,
origin.z);
이렇게 수정하고 크립을 그려보면 다음과 같다.
참조
© 2024 - 2024 Vvidr - All Rights Reserved.
'설계 > 기능' 카테고리의 다른 글
IP로 인터넷에서 시간을 가져오는 방법 (0) | 2024.03.21 |
---|---|
2D 타일맵에서 동적으로 건물을 생성하는 방법 (0) | 2024.02.10 |
Unity Jobs 로 구성하는 2D 네비게이션 그리드 (0) | 2024.02.06 |