본문 바로가기

설계/기능

2D 타일맵에서 크립을 생성하기

개발 중인 건설 시뮬레이션 게임에서 사용자가 건물을 지었을 때 비주얼적인 요소가 부족하다고 생각이 되었다. 그래서 ground tile을 건물에 맞게 바꾸는 등, 특정 영역에 대한 표시나 건물의 효과 범위 표시등으로 사용되는 크립을 2D 타일맵에서 표현해보려한다.

 

이미지 출처: Starcraft fandom

 

크립을 표현하기 위해 먼저 크립을 위한 타일맵을 생성한다. 이 타일맵은 기존 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);

 

이렇게 수정하고 크립을 그려보면 다음과 같다.

 


참조

  1. https://starcraft.fandom.com/wiki/Creep_tumor

© 2024 - 2024 Vvidr - All Rights Reserved.