TIL(2024,07,31)최종 프로젝트 1차구현 하나씩 만들기

김보근·2024년 7월 31일

Unity

목록 보기
56/113
post-thumbnail

TIL (Today I Learned): Unity에서 Root 간의 꽃 배치 문제 해결

개요
오늘은 Unity 프로젝트에서 각 Root의 꽃 배치를 조정하는 작업을 진행했습니다. 특히 Root 간의 간격 조절과 겹침 문제를 해결하는 데 초점을 맞췄습니다. 이 과정에서 여러 차례의 트러블슈팅을 통해 최종적으로 모든 Root가 적절한 위치에 배치되도록 조정했습니다.

작업 내용
Root 간의 반경 설정:

초기 Root(1~3)는 고정된 반경 증가를 적용.
중간 Root(5, 6)는 반경을 사용하지 않음.
이후 Root(7~9)는 다시 고유 반경을 사용하여 배치.

반경 설정 조정:

Root4와 Root7이 겹치지 않도록 반경을 세밀하게 조정.
Root7부터 Root9까지의 반경 증가량을 조정하여 간격이 적절하도록 설정.

반경에 따른 배치 개수 조정:

반경이 커질수록 배치할 꽃의 개수를 증가시켜, 공간이 비지 않도록 설정.
문제 해결 과정 (트러블슈팅)

문제 발생:

초기 설정에서 Root7과 Root4가 겹치는 문제가 발생.
Root7과 Root8, Root8과 Root9 사이의 간격이 너무 멀어지는 문제.

디버깅 및 수정:

각 단계에서 Root의 인덱스와 반경 값을 확인.
반경 증가량을 조정하여 Root 간의 간격을 세밀하게 조절.

최종 해결:

Root7부터 Root9의 반경 증가량을 조정하여 Root4와의 겹침 문제 해결.
반경이 커질수록 배치할 위치의 수를 동적으로 증가시켜 간격이 적절하게 유지되도록 설정.

Root 꽃 위치 계산 방법

기본 설정:

terrainCenter는 고정된 중심 위치를 나타냅니다. 모든 꽃의 위치는 이 중심을 기준으로 계산됩니다.
baseRadius는 기본 반경입니다. 이 값은 꽃들이 원형으로 배치될 때의 기준 거리가 됩니다.

Root 반경 계산:

rootIndex는 현재 Root의 인덱스를 나타냅니다. 이는 AutoObjectManager.Instance.roots 배열에서 현재 Root가 몇 번째인지 결정합니다.

int rootIndex = Array.IndexOf(AutoObjectManager.Instance.roots, this);

반경 설정:

rootIndex가 4 미만인 경우 (Root1 ~ Root4):
rootRadius는 baseRadius에 rootIndex + 1을 곱한 값으로 설정됩니다. 즉, Root1은 baseRadius, Root2는 2 baseRadius, Root3은 3 baseRadius, Root4는 4 * baseRadius입니다.

if (rootIndex < 4)
{
    rootRadius = baseRadius * (rootIndex + 1); // 초기 Root는 기본 반경 증가
}

rootIndex가 6 이상인 경우 (Root7 ~ Root9):
rootRadius는 baseRadius 5에 rootIndex - 6을 더한 값입니다. 이는 Root7부터의 반경이 Root4와 겹치지 않도록 충분히 크게 설정되며, Root7, Root8, Root9는 각각 5 baseRadius, 6 baseRadius, 7 baseRadius입니다.

else if (rootIndex >= 6)
{
    rootRadius = baseRadius * 5 + (rootIndex - 6) * baseRadius; // Root7부터는 이전 Root의 반경을 기반으로 증가
}

rootIndex가 4 이상 6 미만인 경우 (Root5, Root6):
이 경우는 반경을 사용하지 않습니다.

else
{
    // Root5와 Root6은 반경을 사용하지 않음
    return;
}

꽃 위치 계산:

numPositions는 꽃들이 배치될 위치의 개수를 나타냅니다. 여기서는 반경에 비례하여 동적으로 설정됩니다.
flowerPositions는 꽃들이 배치될 위치의 리스트입니다.
usedPositions는 이미 사용된 위치를 저장하는 집합입니다. 이는 꽃들이 겹치지 않도록 하기 위함입니다.

int numPositions = Mathf.CeilToInt(rootRadius * 2);  // 반경에 비례하여 위치 수를 증가시킴
flowerPositions = new List<Vector3>(); // flowerPositions 리스트 초기화
HashSet<Vector3> usedPositions = new HashSet<Vector3>(); // 사용된 위치를 저장하는 집합

각도와 위치 계산:

numPositions만큼 루프를 돌면서 각 꽃의 위치를 계산합니다.
angle은 각 위치의 각도를 나타내며, 360도 / numPositions로 각 위치의 각도를 계산합니다.
x와 z는 중심에서 rootRadius 반경만큼 떨어진 위치의 좌표입니다. Mathf.Cos와 Mathf.Sin을 사용하여 원형으로 배치되도록 합니다.

for (int i = 0; i < numPositions; i++)
{
    float angle = Mathf.Deg2Rad * (360f / numPositions * i);  // 각도 계산
    float x = terrainCenter.x + rootRadius * Mathf.Cos(angle);
    float z = terrainCenter.z + rootRadius * Mathf.Sin(angle);
    Vector3 newPosition = new Vector3(x, terrainCenter.y, z);

    // 위치가 이미 사용된 경우 반복
    while (usedPositions.Contains(newPosition))
    {
        angle += Mathf.Deg2Rad * (360f / numPositions); // 각도를 변경하여 위치 재계산
        x = terrainCenter.x + rootRadius * Mathf.Cos(angle);
        z = terrainCenter.z + rootRadius * Mathf.Sin(angle);
        newPosition = new Vector3(x, terrainCenter.y, z);
    }

    flowerPositions.Add(newPosition);
    usedPositions.Add(newPosition); // 위치 저장
}

요약

CalculateFlowerPositions 메서드는 각 Root의 꽃들이 원형으로 배치될 위치를 계산합니다.
반경(rootRadius)는 rootIndex에 따라 달라지며, 초기 Root(14)는 기본 반경을 사용하고, 중간 Root(5, 6)는 반경을 사용하지 않으며, 이후 Root(79)는 이전 Root의 반경을 기반으로 증가합니다.
각 꽃의 위치는 중심(terrainCenter)을 기준으로 계산되며, Mathf.Cos와 Mathf.Sin을 사용하여 원형 배치를 합니다.
사용된 위치는 usedPositions 집합에 저장되어 겹침을 방지합니다.
반경이 커질수록 배치할 위치의 수를 동적으로 증가시켜 공간이 비지 않도록 설정합니다.

결론

오늘은 Unity에서 각 Root의 꽃 배치를 조정하는 작업을 통해 다양한 문제를 해결했습니다. 특히 Root4와 Root7이 겹치는 문제와 Root7부터 Root9까지의 간격 조절 문제를 성공적으로 해결했습니다. 이번 작업을 통해 Unity에서의 배치 및 반경 설정에 대한 이해를 더욱 깊게 할 수 있었습니다.

profile
게임개발자꿈나무

0개의 댓글