
개요
오늘은 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와의 겹침 문제 해결.
반경이 커질수록 배치할 위치의 수를 동적으로 증가시켜 간격이 적절하게 유지되도록 설정.
기본 설정:
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에서의 배치 및 반경 설정에 대한 이해를 더욱 깊게 할 수 있었습니다.